가끔 아래와 같은 cmn ARM 어셈블리어를 볼 수가 있는데 좀 더 깊히 살펴보도록 하겠습니다.
cmn r4,#0x1
 
평소에는 잘 알고 있는 것 같은데 실제 이슈를 볼 때 ARM Instruction을 만나면 머리가 흐릿해지면서
가물가물 해지는 경우가 많아서요. 
 
ARM 공식 사이트에 가면 cmn을 음수 비교 구문이라고 소개해 놓았습니다.
구문
CMN{cond} Rn, Operand2
CMN 명령어는 Rn의 값에 Operand2의 값을 더합니다. 이 명령어는 결과가 버려진다는 점을 제외하고 ADDS 명령어와 동일합니다.
 
그럼 아래 명령어를 실제 Trace32로 실행시켜보면  r4가 -1인지 아닌 지를 체크하는 동작을 해요.
cmn     r4,#0x1
___addr/line|code_____|label____|mnemonic________________|comment
NSR:C016DB1C|E3740001            cmn     r4,#0x1          ; r4,#1
NSR:C016DB20|0AFFFFF0            beq       0xC016DAE8  // <<-- r4가 -1이면 0xC016DAE8로 점프
NSR:C016DB24|E59F0448            ldr     r0,0xC016DF74    ; facility,0xC016DF74
NSR:C016DB28|E2444001            sub     r4,r4,#0x1       ; r4,r4,#1
 
위 어셈블리 코드를 C 언어로 바꾸면 더 이해하기 쉽죠.   
if ( r4 == - 0x1) {
   b  0xC016DAE8
}   else {
   b  0xC016DB24
}
 
 
 

+ Recent posts