ARM 아키텍처의 명령어는 실행 조건을 지정할 수 있는 Condition Field를 가지고 있다. 이는 명령어가 실행되기 전에 특정 조건을 검사하여 실행 여부를 결정할 수 있게 해준다. 이 글에서는 ARM Instruction Set에서 Condition Field에 대해 알아본다.
Condition Field
ARM 모드에서는 모든 명령어가 CPSR Condition 코드의 상태와 명령어의 Condition Field에 따라 조건부로 실행된다.
아래와 같이 Condition Field는 비트 31:28 의 상태에 따라 명령어가 실행되는 상황을 결정하게 된다.
Conditions
Condition Field는 16가지 가능한 조건이 있으며, 각 조건은 두 문자 접미사로 표시된다. BEQ 명령어를 예로 설명하면, B(branch) 명령어 실행에 EQ Condition을 표기한 것으로 EQ 조건(Z=1)이면 B 명령어를 실행한다.
Code “1111”은 reserved 되어 있어 사용하면 안되므로, 아래 표와 같이 15가지 조건이 사용된다.
Code | Suffix | Description | Flags tested |
0000 | EQ | Equal | Z=1 |
0001 | NE | Not Equal | Z=0 |
0010 | CS | Unsigned higher or same | C=1 |
0011 | CC | Unsigned lower | C=0 |
0100 | MI | Minus (negative) | N=1 |
0101 | PL | Positive or Zero | N=0 |
0110 | VS | Overflow | V=1 |
0111 | VC | No overflow | V=0 |
1000 | HI | Unsigned higher | C=1 & Z=0 |
1001 | LS | Unsigned lower or same | C=0 or Z=1 |
1010 | GE | Greater or Equal | N=V |
1011 | LT | Less than | N!=V |
1100 | GT | Greater than | Z=0 & N=V |
1101 | LE | Less than or equal | Z=1 or N=!V |
1110 | AL | Always |
Conditional Execution
명령어들은 특정 조건이 만족했을 때만 실행 시킬 수 있는 조건부 실행이 가능하다. Thumb 모드에서는 16bit 제한으로 조건부 실행이 불가하다.
조건부 명령
; flags set by a previous instruction
LSLEQ r0, r0, #24
ADDEQ r0, r0, #2
조건부 분기
; flags set by a previous instruction
BNE over
LSL r0, r0, #24
ADD r0, r0, #2
over
;…
Condition flags
- N : 연산 후 결과가 음수(Negative) 일때 Set
- Z : 연산 결과가 0(Zero)일때 Set
- C : 연산 결과 자리올림(Carry)가 발생했을 때 Set
- V : 연산 결과 Overflow가 발생하면 Set
Update Condition flags
S suffix가 붙은 명령어는 condition flag를 업데이트 한다. 다만, CMP, CMN, TEQ, TST등 비교 명령어들은 S suffix를 붙이지 않아도 condition flags를 업데이트 한다.
ADD r0, r1, r2 ; r0 = r1 + r2, don't update flags
ADDS r0, r1, r2 ; r0 = r1 + r2, and update flags
ADDSCS r0, r1, r2 ; If C flag set then r0 = r1 + r2,and update flags
CMP r0, r1 ; update flags based on r0-r1.