게하! 개하! (게임도 하고 개발도 하고)

어셈블리어 16. JA JB에 N과 E 붙이기 본문

SISS (2017-2018)/어셈블리어

어셈블리어 16. JA JB에 N과 E 붙이기

Sorrel 2018. 8. 19. 19:39

이번 주 내용을 공부하기 전에 저번주에 뭘 배웠는지 복습해보자.

JA와 JB가 뭐였는가?

JA 는 cmp로 a와b를 비교한다고 했을 때 a가 b보다 클 때

JB 는 cmp로 a와b를 비교한다고 했을 때 a가 b보다 작을 때

 

JNA와 JNB는 반대이다.

 JNA : a가 b보다 작거나 같을 때

JNB : a가 b보다 크거나 같을 때

 

 

jna 40100f와

 

 

jnb 40100f를 넣어보았다.

 

 

하지만 어셈블리어로 jna는 jbe로, jnb는 jae로 바뀌어있었다.

기계어로 완전히 똑같은 의미라고 한다.

JNA는 a가 b보다 작거나 같을 때 인데, JBE는 a가 b보다 작거나 같을 때라는 의미가 완벽히 똑같다.

 올리디버그가 마음대로 바꾼 이유는 이 프로그램은 어셈블러 기능이 있긴 하지만 원래 디버깅 툴이기 때문이라고 한다.

왜 그런지는 정확히 이해가 가지 않는다.

 

E는 이퀄인데 붙이는 이유는 등호 조건도 포함되었기 때문이다.

 

JBE와 JAE는 or이기 때문에 같기만 해도 jmp를 한다.

JA와 JB는 제로 플래그를 보지 않았지만 JAE와 JBE는 그런 의미로 제로 플래그도 봐야한다.

 

 

cmp eax, 2는 c플래그가 1이 되고 그로 인해서

 

jbe 문장이 실행이 된다.

 

 

하지만 cmp eax, 1이면

 

 

c는 0이지만 제로 플래그가 1이 된다. 따라서 c는 0이지만 jbe 조건에맞는다.

 

jbe 명령이 실행된다.

 

 

cmp eax, 0으로 바꾸고 해봤다.

eax>0이니까 jbe는 실행되지 않고 바로 아래 명령으로 넘어갈 것이다.

 

 

비교가 참이 아니라서 회색 화살표로 표시가 된다

 

 

점프가 아닌 그냥 순서대로 아래 명령어로 넘어왔고, 아래 명령어는 참이므로

40100f 가 계속 반복이 된다.

 

 

 

 

 

 

 

 

c도 1이고 z도 1일 수는 없지만, 임의적으로 c와 z를 모두 1로 만들어줘도 JBE가 실행이 된다. JB의 조건에 일단 맞았기 때문이다.

 

JZ와 JC도 있는데 제로플래그와 캐리플래그를 사용한 것이다. 이는 다음시간에 배울 것이다.

마찬가지로 JNC도 있다. 캐리 플래그가 0일 때 일어나는 명령어다.

 

명령어를 쓸 때, JNBE처럼 쓸 수도 있다. 의미상 JA로 바뀌어서 나온다.

 

ex) JAE  a>=b   JNAE a<b

 

A는 >

B는 <

E는 =

N은 not, 반대인 것을 기억하자.

0 Comments
댓글쓰기 폼