3. 비교구문 cmp, test :
cmp 명령어는 주어지는 두 값을 뺄셈을 하여 처리하고, test 명령어는 주어지는 두 값을 논리적 AND 연산해서 처리하는 점이 다르며, 두 명령어가 조건 분기문을 결정하기 위해서 사용된다는 점은 같다.
cmp eax, ebx는 두 값을 뺴서 0이면 참(같은 값)이 되는 형태이다.
test 연산은 보통 호출된 함수들이 일반적으로 리턴값을 EAX 레지스터에 저장하는 것을 이용하여, 다음과 같이 사용된다.
CALL function
TEST eax, eax
JZ 주소지
함수를 call하고, 함수의 리턴값으로 EAX값이 세팅되면, 비교를 하는 것이다.
cmp가 영향을 미치는 플래그들은 ZF, OF, SF, CF이고 만약 ZF 플래그가 ZF=1로 세팅되었다면 주어진 두 값이 같았다는 것을 의미한다.
그 외에 같지 않았을 경우에는 OF, SF, CF를 이용해서 어느 쪽이 더 큰지를 알 수 있다.
test가 영향을 미치는 플래그는 SF, ZF, PF가 이고, test 명령어는 같은 피연산자를 가지게 되는데 그러므로 중요한것은 피연산자가 0이냐, 0이 아니냐하는 것이다. 0이면 ZF가 1로 세트되고, 0이 아니면 ZF가 0으로 세트된다.
TEST(Test)
두 피여산자 사이에 놀리적인 AND 연산을 수행하여 플래그 레지스터에 영향을 주지만 결과값은 저장하지 않는다.
OF, CF는 항상 0으로 세트되고 TEST 연산 결과값이 0이면 ZF가 1로, 0이 아니면 ZF가 0으로 세트된다.
ex)
TEST reg, reg
cmp하고 비슷하다. 두 값이 같은지 아닌지 비교할때 쓰인다.
zero flag를 건드니까 참인지 거짓인지.
test dx, 2000h ; check bit 13
즉, dx가 뭔지 알필요없고 그냥 13번 비트만 확인.
non zero 면 1
zero 면 0
Assembly CMP와 TEST의 차이
'컴파일러 성능' 이라 칭한다. 곱셈을 그냥 곱셈을 할지, 아니면 쉬프트를 할지 최신것은 쉬프트 겠다.
'마이 스토리 > 내용 정리중인 글들..' 카테고리의 다른 글
20151106 - 커널에 대하여 (0) | 2015.11.06 |
---|---|
20151105 - 커널 예제. (0) | 2015.11.05 |
20151101 - stst() (0) | 2015.11.01 |
20151021 - pe 파일! 드디어 나왔다. (0) | 2015.10.21 |
20151017 - 아.. 다시 갈아엎고 있다. (0) | 2015.10.17 |