6. 비교 명령어¶
이들은 두 인수에 대해 산술 또는 논리 명령을 수행하되, 결과는 버리고 조건 플래그만 설정합니다. 일반적으로 조건 분기를 실행하기 전에 데이터 값을 변경하지 않고 테스트하는 데 사용됩니다.
6.1. 문서 규칙¶
표기법: Rd, Rm, Rn 은 ARM 레지스터 R0-R7을 나타냅니다. imm8 은 8비트 폭을 가진 즉시값을 나타냅니다.
6.2. 애플리케이션 프로그램 상태 레지스터(APSR)¶
여기에는 조건 분기 명령어가 테스트하는 네 개의 비트가 들어 있습니다. 일반적으로 조건 분기는 여러 비트를 테스트하는데, 예를 들면 bge(LABEL) 입니다. 조건 코드의 의미는 산술 명령어의 피연산자를 부호 있는 정수로 보느냐 부호 없는 정수로 보느냐에 따라 달라질 수 있습니다. 따라서 bhi(LABEL) 은 부호 없는 수가 처리되었다고 가정하고, bgt(LABEL) 은 부호 있는 피연산자를 가정합니다.
6.3. APSR 비트¶
Z (영)
이것은 연산 결과가 0이거나 비교의 피연산자들이 같을 때 설정됩니다.
N (음수)
결과가 음수이면 설정됩니다.
C (캐리)
덧셈은 결과가 MSB 밖으로 오버플로될 때 캐리 플래그를 설정합니다. 예를 들어 0x80000000과 0x80000000을 더하는 경우입니다. 2의 보수 산술의 특성상 이 동작은 뺄셈에서 반대가 되며, 빌림(borrow)은 캐리 비트가 클리어됨으로 표시됩니다. 따라서 0x10 - 0x01은 0x10 + 0xffffffff로 실행되어 캐리 비트를 설정합니다.
V (오버플로)
오버플로 플래그는 결과를 2의 보수 수로 보았을 때 피연산자들과의 관계에서 “잘못된” 부호를 가지면 설정됩니다. 예를 들어 0x7fffffff에 1을 더하면 결과(0x80000000)를 2의 보수 정수로 보았을 때 음수이므로 오버플로 비트가 설정됩니다. 이 경우 캐리 비트는 설정되지 않는다는 점에 유의하세요.
6.4. 비교 명령어¶
이들은 APSR(애플리케이션 프로그램 상태 레지스터)의 N(음수), Z(영), C(캐리), V(오버플로) 플래그를 설정합니다.
cmp(Rn, imm8)
Rn - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(Rn, Rm)
Rn & Rm
6.5. 조건부 실행¶
it 과 ite 명령어는 레이블 없이도 이어지는 한 개에서 네 개의 명령어를 조건부로 실행하는 수단을 제공합니다.
it(<condition>) If then
<condition>이 참이면 다음 명령어를 실행합니다:
cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
ite(<condition>) If then else
<condition>이 참이면 다음 명령어를 실행하고, 그렇지 않으면 그 다음 명령어를 실행합니다. 따라서:
cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here
이것은 이어지는 최대 네 개의 명령어의 실행을 제어하도록 확장될 수 있습니다: it[x[y[z]]], 여기서 x,y,z=t/e; 예: itt, itee, itete, ittte, itttt, iteee 등.