SISS/Assembly

조건분기명령어 JZ(JE) 상태레지스터 ZF

JMP 주소 

-조건을 가지는 JUMP문 


# 상태레지스터 : 1 bit - 상태에 따라서 점프의 조건이 결정됨. * MOV EAX, 0으로는 Z Flag가 변하지 않음.



1) JZ 주소 : 이전에 내렸던 명령으로 계산을 해서 값이 Zero가 될 때 JMP가 작동



EAX 값을 1로 만들고 1만큼 증가시키면 EAX의 값은 2가 된다.




JZ는 이전 명령의 계산 값이 0이 되어야 Jump할 수 있는데, EAX의 값은 2이므로 상태레지스터 ZF의 값은 0, 즉 EAX의 값이 0이 아니므로 Jump 명령을 실행할 수 없다. (JZ와 JE는 그 의미는 다르지만 같이 사용할 수 있기 때문에 JZ 명령어를 입력해도 디버거 상에선 JE로 나타난다. )  



이번엔 EAX의 값을 1씩 감소하여 0으로 만들면 ZF의 값이 1로 변경되고, JUMP 명령을 실행할 수 있다는 표시로 점프할 주소인 401009로 빨간 화살표가 생긴다. 



실행하면 Jump 명령으로 401009 주소로 이동한다. 




EAX의 값을 다시 1 감소하여 EAX의 값은 FFFFFF이 되고, 0이 아니기 때문에 JZ 명령을 실행하지 않고 그냥 넘어가게 된다. 






2) JE 주소 : Jump is Equal 


# CMP : compare 

CMP EAX, 0 : EAX 값과 0을 비교함. 같으면 Z flag를 1로 바꿈. (EAX - 0 = 0이면 Z flag를 1로) EAX - 0으로 값의 비교를 한다는 점에서 SUB 명령어와 비슷하나 CMP 명령어는 그 결과값을 다시 EAX에 저장하지 않는다는 점에서 차이가 있다. 



EAX의 값을 다시 0으로 바꾸어 준다. 





JE는 값이 같을 때 Jump 해준다는 명령어인데, JE 명령어는 인자를 주소값 하나밖에 가질 수 없으므로 사용하기 전에 값을 비교하는 CMP 명령어를 사용한다. EAX와 0 값을 비교하여 같으면 ZF의 값이 1로, 같지 않으면 0이 된다. 여기서는 EAX의 값이 0으로 같으므로 ZF의 값이 1이 되었다. 




EAX의 값을 1 증가시키고 나면 EAX와 0 값은 동일하지 않게 되기 때문에 다시 ZF의 값은 0으로 변하고, JE 명령어 역시 Jump 명령을 수행하지 않고 넘어간다.