cmp와 test는 operand를 비교한다는 점에서 같지만 비교하는 방식이 다르다.
cmp operand1, operand2
operand1와 operand2를 빼기를 통해서 비교한다.(operand1에서 operand2를 뺀다.)
만약 값이 같다면 결과 값은 0이 되어 ZF(제로 플래그)가 1로 설정된다.(operand1의 값은 변하지 않는다.)
test operand1, operand2
operand1와 operand2를 and 연산을 통해서 비교한다.
만약 결과값이 0이라면 ZF(제로 플래그)가 1로 설정된다.(operand1의 값은 변하지 않는다.)
두 명령어를 알아봤지만 확실하게 어떤 상황에 저 명령어들이 쓰이는지 알아보고 싶어서 더 자세히 찾아봤다.
cmp 명령어는 두 값이 같은지 다른지 정확하게 확인할 수 있다.
반면 test명령어는 and 연산을 통해 비교하므로 cmp와는 다르게 정확한 값을 비교할 수 없다.
test명령어는 두 값이 0인지 아닌지 구분할 때 쓰인다.
예를 들어 test eax, eax같이 eax레지스터의 값이 0인지 아닌지 확인하는 용도로 사용된다.
jmp operand
operand의 주소로 RIP가 이동한다. (RIP는 명령어를 실행하는 주소를 가르키는 레지스터다.)
jmp명령어를 분기문이라고 부르고 종류가 다양하다. (jg, je, jne 등등)
이런 분기문 위에 cmp와 test명령어가 위치해서 jmp를 할지 말지를 결정한다.
jmp 명령어는 나중에 더 자세히 공부하도록 하겠다.
아래의 주소에서 참고했다.
http://egloos.zum.com/dal4segno/v/438860
Assembly CMP와 TEST의 차이
우선 두 명령어 Operand 두 개를 받아서 값을 비교하는데 사용되는 것 같습니다. 차이점을 비교해보면, CMP : 첫 번째 Operand에서 두 번째 Operand를 뺍니다. 이 연산의 결과는 ZF, Zero Flag에만 영향을 미
egloos.zum.com
'리버싱 > 공부' 카테고리의 다른 글
어셈블리어 and, or, xor, not 명령어 (0) | 2022.06.02 |
---|---|
어셈블리어 add, sub, inc, dec 명령어 (0) | 2022.06.02 |
어셈블리어 ROL, ROR을 C언어로 구현해보자 (0) | 2022.03.14 |
shr, shl, sar, sal (0) | 2022.03.10 |
mov와 lea (0) | 2022.03.09 |