Arm Comparison instruction ( 비교 명령어, CMP, CMN, TEQ, TST )
CPU는 동작을 크게 나눠보면 Data processing, Branch, Memory access 이렇게 3개의 동작을 한다.
이번에는 Data processing( 데이터 처리 )의 동작중에 하나인 Comparison( 비교 ) 동작을 알아보자
Comparison
1, CMP
- 비교를 할 때 사용한다. 다르게 말하면 조건을 말하는데 cmp r0, r1과 같이 사용한다. ALU에서 subtraction을 한다. 여기엔 destination( 목적 레지스터 or 메모리 ) 이 없다. 그래서 결과를 바탕으로 CPSR의 nzcv flag를 업데이트시킨다.
예를 들어 아래와 같은 코드를 수행한다 하자
if ( a==b )
c++;
else
c--;
그렇다면 먼저 cmp를 이용하여 a와 b가 같은지 비교해야 한다. ALU에서 각각 레지스터에 있는 데이터 (a와 b의 값)를 비교하고 같다면, 0이 결과로 나올 테니 NZCV 중에 Zero flag가 1로 세팅될 것이다.
그다음에 c++를 해야 하는데 addeq는 equal을 의미한다. 즉, 같다면 (Z가 1이라면) c++을 수행한다.
아니라면 sudne, 즉, not equal을 의미하고 c--를 수행한다.
2. CMN
- 음수를 비교할 때 사용한다. cmn r0, r1이라면 r0 - (-r1) 이렇게 된다. 즉, ALU는 뺄셈으로 하는 게 아니라 덧셈으로 구분한다.
3. TEQ
- xor 동작을 bit by bit으로 하는데 XOR 명령어와 다른 점은 nzcv를 업데이트한다.
4. TST
- and 동작을 수행하는데 AND 명령어와 다른 점은 destination 레지스터가 없다는 점과, nzc flag를 업데이트한다는 것에 있다. 즉, nzc만 업데이트 한다.