gpt4 book ai didi

assembly - 在x86程序集中的堆栈上分配变量。 rbp和rsp与esp和ebp

转载 作者:行者123 更新时间:2023-12-04 10:35:14 24 4
gpt4 key购买 nike

我最近一直在学习汇编语言,并决定反汇编我自己的一些可执行文件以进行学习。我注意到在线资源经常引用esp和ebp,堆栈和基本指针。我写了这个程序:

int comp(int a, int b) {
return a == b;
}
int main() {
int a = 1;
int b = 2;
comp(a, b);
}

在Radare 2中,它分解为:
0x0040050e    55           push rbp
| 0x0040050f 4889e5 mov rbp, rsp
| 0x00400512 4883ec10 sub rsp, 0x10
| 0x00400516 c745f801000. mov dword [rbp-0x8], 0x1
| 0x0040051d c745fc02000. mov dword [rbp-0x4], 0x2
| 0x00400524 8b55fc mov edx, [rbp-0x4]
| 0x00400527 8b45f8 mov eax, [rbp-0x8]
| 0x0040052a 89d6 mov esi, edx
| 0x0040052c 89c7 mov edi, eax
| 0x0040052e e8c3ffffff call sym.comp
| sym.comp(unk)
| 0x00400533 b800000000 mov eax, 0x0
| 0x00400538 c9 leave
\ 0x00400539 c3 ret

为什么使用rbp和rsp?这就是我的编译器喜欢做事的方式吗?另外,为什么在堆栈上创建空间是rbp-value,而不是在rbp + value上分配更多空间?

最佳答案

您要针对64位进行编译,因此rbprsp只是32位ebpesp变量的64位等效项。即使在64位代码中,您也经常会在可能的情况下看到使用32位(e**)寄存器-但通常不会使用rsprbp1看到它们,因为它们持有的指针几乎总是需要64位。

由于rbp指向堆栈框架的底部(即函数条目上堆栈的顶部),并且x86上的堆栈向下增长(朝着较低的地址),因此将在相对于rbp的负地址处访问局部参数。

1您可能偶尔会在64位代码中看到ebp,但这只是因为编译器已将其从其通常的帧指针职责中解脱出来,而只是将其用作另一个GP寄存器。

关于assembly - 在x86程序集中的堆栈上分配变量。 rbp和rsp与esp和ebp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42488996/

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