gpt4 book ai didi

assembly - 为什么我们使用 sub $0x18, %rsp?

转载 作者:行者123 更新时间:2023-12-02 21:54:26 25 4
gpt4 key购买 nike

我研究了 32 位机器,我知道 sub $12, %esp 与 pop %eax 和 mov $0, %eax 上的三次相同。

但我不知道为什么我们在 x86-64 机器上使用 add $18, %rsp with start procedure call 或 sub $18, %rsp start with procedure call。

为什么编译器在过程调用时使用这个规则?参数规则?

0x0000000000400df3 <main+191>:  mov    $0x402227,%edi
0x0000000000400df8 <main+196>: callq 0x400ab8 <puts@plt>
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 <__isoc99_sscanf@plt>
0x0000000000401156 <example+29>: cmp $0x1,%eax

最佳答案

“我知道 sub $12, %esppop %eaxmov $0, %eax 上的三次相同。”你知道错了。 sub $12, %esp 不会更改 eax,无论是弹出其中还是将 0 移入其中。

使用 sub $12, %esp 之类的主要/直接原因是在堆栈上保留一些空间。这可以用来为子例程的局部变量提供一些空间。如果出于性能或其他原因需要,它也可以用于对齐堆栈指针。

add $18, %rsp 则相反,它释放之前在堆栈上分配的空间。这可用于释放局部变量或先前传递给另一个子例程且堆栈上不再需要的参数占用的空间。

关于assembly - 为什么我们使用 sub $0x18, %rsp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12635910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com