2012-09-28 1 views
1

나는 32 비트 기계를 공부했고, pop $ eax와 mov $ 0, % eax에서 세 번 같은 12 %의 하위, % esp를 알고있다.

하지만 우리가 왜 $ 18, % rsp를 시작 프로 시저 호출 또는 sub $ 18를 사용하는지 모르겠다. % rsp는 x86-64 시스템에서 프로 시저 호출로 시작한다.

왜 컴파일러는이 규칙을 프로 시저 호출에 사용합니까? 인수 규칙?

0x0000000000400df3 <main+191>: mov $0x402227,%edi 
0x0000000000400df8 <main+196>: callq 0x400ab8 <[email protected]> 
0x0000000000400dfd <main+201>: callq 0x4014c0 <read_line> 
0x0000000000400e02 <main+206>: mov %rax,%rdi 
0x0000000000400e05 <main+209>: callq 0x401139 <phase_3> 

----------------------------------------------------------------------- 
example: 

0x0000000000401139 <example+0>: sub $0x18,%rsp 
0x000000000040113d <example+4>: lea 0x8(%rsp),%rcx 
0x0000000000401142 <example+9>: lea 0xc(%rsp),%rdx 
0x0000000000401147 <example+14>:  mov $0x40248a,%esi 
0x000000000040114c <example+19>:  mov $0x0,%eax 
0x0000000000401151 <example+24>:  callq 0x400ac8 <[email protected]> 
0x0000000000401156 <example+29>:  cmp $0x1,%eax 
+0

귀하의 기능은 어떻게 생겼습니까? –

+3

0x18과 18.의 차이점에 의해 downvote가 필요합니다. :) –

+0

Aha! 나는 실수로 0x18 = 24 lol을 보았다. – Silvester

답변

3

"나는 pop %eaxmov $0, %eax에 세 시간과 동일 sub $12, %esp을 알고있다." 너는 틀린 것을 알고있다. sub $12, %espeax을 바꾸지 않으며, 0으로 이동하지도 않습니다.

sub $12, %esp과 같은 것을 사용하는 주/직접 이유는 스택에 약간의 공간을 확보하는 것입니다. 이것은 서브 루틴의 지역 변수에 약간의 공간을주기 위해 사용될 수 있습니다. 성능이나 기타 이유로 스택 포인터를 정렬하는데도 사용할 수 있습니다.

add $18, %rsp 역순으로 이전에 스택에 할당 된 공간을 해제합니다. 이것은 이전에 다른 서브 루틴으로 전달되어 더 이상 스택에 필요하지 않은 매개 변수 또는 로컬 변수가 차지하는 공간을 확보하는 데 사용할 수 있습니다.

+0

sub $ 16, % rsp를 사용하지 않는 이유는 무엇입니까? 그것은 단어가 8byte 인 x86-64 가상 메모리가 아닙니까? – Silvester

+0

당신은 우리에게 그 코드를 보여주지 않았으므로, 그것이 18이나 다른 것인데 왜 그것이 정확한지 어떻게 알 수 있습니까? –

+0

나는 rsp가 8에 의하여 성장한 ㄴ다는 것을 의미 하는가? 더하기 또는 빼기 $ 18를 사용하면 어떤 이점이 있습니까? – Silvester

관련 문제