블로그 이미지
송시혁

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive


conditional jump는 상태적이 점프 ? 

ㅋㅋㅋ 

상황에 따라 점프를 할 수도 있고 안 할 수 도 있다는 얘기이다. 명령어는 jns, jnz....등이 있다.

이에 비해 unconditional jump는 무조건 특정한 곳으로 점프하는 명령어이다. 명령어 jmp가 된다.


아래 그림들과 같이 C언어 소스와 disassembly를 이용하여 비교하여 생각해보자.





아래 부분은 if문이다.

jns명령어를 주목한다. jns는 jump not set의 줄임말.

flag bit sf는 sign flags. 이 비트가 0이 아니라면, 이라는 뜻으로 해석한다.

즉, 1이 아니면, 음수가 아니라 양수라는 뜻이다. 그렇다면, if문의 조건인 0보다 작다는

성립하지 않는다. 따라서 jns가 실행이 되어 if문이 아래 코드가 실행되지 않고 else if문으로

점프한다. 


만약에 음수라면 아래 코드가 실행이 되고 jmp명령어가 실행되어 else문 다음코드로 실행이 된다.





else if,else

자, else if문에 코드를 좀 변경해 보겠다.


위의 그림에는 

cmp    dword ptr[a], 0

jne    main   +43h 라고 코드가 되어있다. 이것은 컴파일러가 최적화 해서 나타낸 코드

지금 단계에서는 어려움이 있으므로 이 부분을 고치면, 다음과 같다.


jnz    else의 주소(else의 주소를 알 수 없으므로...)



if문 끝에 jmp와 else if문 다음에 있는 jmp를 자세히 보면 숫자가 같다. 즉, 같은 곳으로 jump를 한다는 의미.

아마도 else문 다음에 나와있는 것은 컴파일러가 disassembly를 하면서, 화면상 이상하게 나온거. 

실제 코드상의 위치는 각각, if문과 else if문 끝에 jmp명령어가 위치한다.

if~else if~else문까지 있는데 끝을 나타낸다. 그래서 if문이 실행된 경우 else if, else문이 실행되지 않는다.



아래는 교재에서 설명하는 부분.




자, 교재에는 elseIfZero: jnz elsepos라고 되어있다. 즉, else if문의 조건이 거짓이면, elsepos로 점프한다는

뜻이다.




빨간색 네모의 영문과 not ture.까지 해석을 한다면, 대충 이런말이다.

sing flag(SF)가 1이 아니라면, elseIfZero로 점프한다. if문의 조건(balanced <0)은 거짓이 된다.










































































posted by 송시혁