posted by 블르샤이닝 2023. 6. 14. 10:33
728x90
어셈블리어에서 TEST연산은  오퍼랜드 끼리 AND연산하여 결과값을 CMP연산과 같이 저장하진 않는다. 
 
단지 플래그 값을 세팅하여 분기문에게 영향을 준다 ex) JE, JZ.... 같은 분기문 
 
여기서 중요한것은 TEST EAX, EAX와 같은 명령어다.   
 
얼핏보면 같은 레지스터끼리 AND연산하면 EAX값이 나올텐데 왜 하는걸까라는 생각을 할 수 있다. 
 
하지만 바로 위에 쓰인 TEST명령어는 단지 EAX의 값이 0이냐 아니냐를 판단하기 위해서다 
 
만약 EAX의 값이 0이라면 AND연산결과 당연히 0이 나올것이고, Z플래그 (ZF가 세팅될 것이다.) 
밑에 JE 0040100 
 
점프문이 있다면 ZF가 세팅되므로 0040100주소로 점프할 것이다
 
 

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

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

 

즉 CMP는 두 값을 빼서 결과를 보고 TEST는 두 값을 AND 연산을해서 결과를 보는데 CMP는 두 Operand가 완전히 같은지 판단할 수 있고 TEST는 두 Operand가 모두 0인지 아닌지 판단할 수 있습니다.

 

TEST의 경우에는 두 Operand가 0이 아닌 경우를 제외하고는 값을 단정지을 수 없 기 때문에 TEST eax, eax와 같은 형태로 사용하여 이 값이 0인지 아닌지 확인할 때 사용된다

참조 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=vps32&logNo=221532426407

728x90