※ 질문/내용오류/공유할 내용이 있다면 jinkilee73@gmail.com으로 메일 주세요 :-)


신나게 다시 공부를 해보자. 실제 C 코드를 가지고 설명을 해볼 생각이다.



위의 C 코드를 보자. 아주 간단한 코드이다. 단순히 X와 Y의 크기를 비교한 후 X가 크면 X를 return 그렇지 않으면 y를 return 하는 것이다.

이 코드에 대한 assembly code는 다음과 같이 작성될 수 있다.



젤 위의 두 줄은 이전의 Procedure call 포스팅에서 굉장히 자세히, 내가 할 수 있는한 최대한 자세히 설명했으므로 지금은 과감하게 생략한다.


그 다음 명령어인

movl        8(%ebp), %eax

부터 시작해보자.


8(%ebp)에는 x값이 있는데, 그 값을 %eax에 저장한다는 것이다. 왜 x값이 거기에 있냐고?? 이전의 포스팅에 전부 다 설명되어있다.


cmpl        12(%ebp), %eax

%eax - 12(%ebp)하여 그 값을 고려하여 CC(Condition Code)를 수정하겠다는 뜻이다. 현재 %eax는 3이고, 12(%ebp)는 5이다. 즉, 3 - 5을 해서 CC를 계산해보자.


1. CF = 0

2. ZF = 0

3. SF = 1

4. OF = 0


그 다음 명령어를 보자.

jle            .L2


jle는 jump if less or equal이다. 즉, 작거나 같으면 점프라하는 뜻이다. 그런데 뭐보다? 비교해야할 대상이 있을 것 아니냐? 쉽게 말하면 두번째 파라미터(%eax)가 첫번째 파라미터12(%ebp)보다 작거나 같냐? 하고 물어보는 것이다. 3이 5보다 작으면 .L2 코드로 점프하라는 것인데, True이니까 L2로 점프하여 다음 명령어들를 실행하는 것이다.


movl        12(%ebp), %eax


위의 명령어를 실행하게 되겠다. :-)


만일 jle 조건을 만족하지 않았다면 아래의 코드를 수행했을 것이다.


mov1        8(%ebp), %eax

jmp           .L3                    # 무조건 L3로 점프하게 된다.


.L3

popl         %ebp

ret


결론적으로 다음의 두 가지 경우의 수가 나오게 된다.


for 문이든 while 문이든 C 코드의 모든 조건절은 test 또는 cmpl 명령어와 jle와 같은 조건절 점프 문과의 조합으로 수행된다. 조건절 점프문은 jle 명령어 말고도 여러가지가 있다. 아래의 표를 보자.



어라? 위에서 보니까 조금 생소한 것이 있다. 바로 Condition 열인데, CC 값을 가지고 XOR, &, ~등의 연산을 수행하고 있다. 내가 일일이 검사해보지는 않았지만 아마도 이럴 것이다.

jle와 같은 경우 (SF ^ OF) | ZF 연산을 수행해서 그 값을 레지스터에 넣는데.

아마도 저 연산이 %edx - %eax 한 값이 0보다 작거나 같은지를 검사하는 조건일 것이다.


Posted by 빛나유
,