가끔 아래와 같은 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
}
'시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 > 4장: 어셈블리 명령어' 카테고리의 다른 글
arm instruction(명령어) - ldr (0) | 2023.06.10 |
---|---|
arm instruction(명령어) - push & 스택 푸쉬 (0) | 2023.06.10 |
arm instruction(명령어) - strleb (0) | 2023.06.10 |
arm instruction(명령어) - ldm (0) | 2023.06.10 |
arm - ldrd 명령어 (0) | 2023.06.10 |