ARM Instruction Set: Condition Field

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가지 조건이 사용된다.

CodeSuffixDescriptionFlags tested
0000EQEqualZ=1
0001NENot EqualZ=0
0010CSUnsigned higher or sameC=1
0011CCUnsigned lowerC=0
0100MIMinus (negative)N=1
0101PLPositive or ZeroN=0
0110VSOverflowV=1
0111VCNo overflowV=0
1000HIUnsigned higherC=1 & Z=0
1001LSUnsigned lower or sameC=0 or Z=1
1010GEGreater or EqualN=V
1011LTLess thanN!=V
1100GTGreater thanZ=0 & N=V
1101LELess than or equalZ=1 or N=!V
1110ALAlways

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.

참고

답글 남기기