繁体   English   中英

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

[英]Allocating variables on the stack in x86 assembly. rbp and rsp vs esp and ebp

我最近一直在学习汇编,并决定反汇编一些我自己的可执行文件来学习。 我注意到在线资源经常引用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 +值来分配更多空间吗?

您正在编译64位,因此rbprsp只是32位ebpesp变量的64位等价物。 即使在64位代码中,您经常会看到尽可能使用的32位( e** )寄存器 - 但是您不会看到rsprbp通常为1,因为它们保持指针几乎总是需要64位。

由于rbp指向堆栈帧的基础(即函数入口上的堆栈顶部)并且x86上的堆栈向下 (朝向较低地址),因此将在相对于rbp负地址处访问本地参数。


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM