[질문] 어셈소스중 이해안가는 부분이 있어 질문드립니다.
글쓴이: keston / 작성시간: 토, 2004/08/28 - 6:42오후
"programming from the ground up" 이란 책으로 어셈 공부중인데요..
책에 나와있는 소스인데 잘 이해가 안되는 부분이 있어 질문드립니다.
1 .section .data
2
3 .section .text
4
5 .globl _start
6 .globl _factorial
7
8 _start:
9 pushl $4
10 call factorial
11 addl $4, %esp
12 movl %eax, %ebx
13 movl $1, %eax
14 int $0x80
15
16 .type factorial, @function
17 factorial:
18 pushl %ebp
19 movl %esp, %ebp
20 movl 8(%ebp), %eax
21 cmpl $1, %eax
22 je end_factorial
23 decl %eax
24 pushl %eax
25 call factorial
26 movl 8(%ebp), %ebx
27 imull %ebx, %eax
28
29 end_factorial:
30 movl %ebp, %esp
31 popl %ebp
32 ret보시다시피 4 factorial 을 구하는 건데요..
제 생각에는 11-14번 라인은 실행이 안될거 같거든요..
제가 생각하는 실행흐름은..
10번 라인에서 factorial 함수를 call 한후 18-25까지 eax 레지스터 값이 1이 될때까지 반복된후 1이면 30-32를 실행한후 26라인으로 리턴한후 26-27을 실행하고 종료될거 같거든요..
call instruction 으로 다른곳으로 분기된후 ret instruction이 없으면 call 다음 instruction은 실행되지 않는거 아닌가요?
답변에 미리 감사드립니다. :D
Forums:


27 번다음으로 30,31,32 가 차례로 실행된 뒤에 돌아 가겠죠?
27 번다음으로 30,31,32 가 차례로 실행된 뒤에 돌아 가겠죠?
---
http://coolengineer.com
call은 스택에 복귀주소를 집어넣습니다.ret는 복귀주소를 스택
call은 스택에 복귀주소를 집어넣습니다.
ret는 복귀주소를 스택에서 꺼내서 그곳으로 복귀시킵니다.
....
실제 스택의 복귀주소 저장자리에 mov명령으로 딴데 쓰면 그곳으로 복귀됩니다.
bof가 이걸 이용합니다.
Written By the Black Knight of Destruction
8~10 -> 17~25 -> 17~25 -> 17~25
8~10 -> 17~25 -> 17~25 -> 17~25 -> 17~22 -> 29~32 -> 26~32
-> 26~32 -> 26~32 -> 26~32 -> 11~14
정도가 될 것 같네요
답변 감사합니다.아..이런..저 소스를 수십번을 봤는데도 end_fa
답변 감사합니다.
아..이런..저 소스를 수십번을 봤는데도 end_factorial을 함수로 생각하고 있었네요.. :oops:
댓글 달기