본문으로 바로가기

20151103 - 어셈블리

category 마이 스토리/내용 정리중인 글들.. 2015. 11. 3. 17:31

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의 차이

http://dal4segno.egloos.com/438860

우선 두 명령어 Operand 두 개를 받아서 값을 비교하는데 사용되는 것 같습니다.

차이점을 비교해보면,

CMP : 첫 번째 Operand에서 두 번째 Operand를 뺍니다. 이 연산의 결과는 ZF, Zero Flag에만 영향을 미칠 뿐 Operand에 영향을 미치지 않고 버려집니다.

TEST : 첫 번째 Operand와 두 번째 Operand를 AND 시킵니다. 이 연산의 결과는 ZF에만 영향을 미치고 Operand에 영향을 미치지 않고 버려집니다.


결국 한 쪽은 빼기, 한 쪽은 AND인데 이 것으로 인해서

CMP는 두 Operand가 완전히 같은지 판단할 수 있고

TEST는 두 Operand가 모두 0인지 아닌지 판단할 수 있습니다.

TEST의 경우에는 두 Operand가 0이 아닌 경우를 제외하고는 값을 단정지을 수 없기 때문에(두 값이 0이 아닌 서로 다른 값일지라도 연산 결과는 0이 나올 수 있습니다.) TEST eax, eax와 같은 형태로 사용되어 대상의 값이 0인지 아닌지 확인할 때 사용됩니다.



'컴파일러 성능' 이라 칭한다. 곱셈을 그냥 곱셈을 할지, 아니면 쉬프트를 할지  최신것은 쉬프트 겠다.