[질문] 어셈소스중 이해안가는 부분이 있어 질문드립니다.
글쓴이: 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:
댓글 달기