Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 堆栈中保留字节:x86程序集(64位)_Assembly_X86 64_Cpu Registers_Red Zone - Fatal编程技术网

Assembly 堆栈中保留字节:x86程序集(64位)

Assembly 堆栈中保留字节:x86程序集(64位),assembly,x86-64,cpu-registers,red-zone,Assembly,X86 64,Cpu Registers,Red Zone,关于第三条指令中“$32”的解释,我有一个大问题。来自搜索和博客的信息表明,在上述第三条指令中,我们为堆栈保留了某些“字节”的空间。从文档中,%rsp是64位寄存器,%esp是32位寄存器 “$32”表示32字节吗?($number表示常量?)如果是,那么我们如何在64位寄存器上分配32字节?上述指令是由“otool”生成的。我正在使用MacBookPro 我只是想学习一些关于组装的小知识 谢谢 “$32”表示32字节吗?($number表示常量?)如果是,那么我们如何在64位寄存器上分配32字

关于第三条指令中“$32”的解释,我有一个大问题。来自搜索和博客的信息表明,在上述第三条指令中,我们为堆栈保留了某些“字节”的空间。从文档中,%rsp是64位寄存器,%esp是32位寄存器

“$32”表示32字节吗?($number表示常量?)如果是,那么我们如何在64位寄存器上分配32字节?上述指令是由“otool”生成的。我正在使用MacBookPro

我只是想学习一些关于组装的小知识

谢谢

“$32”表示32字节吗?($number表示常量?)如果是,那么我们如何在64位寄存器上分配32字节


这32个字节不在64位寄存器上分配。它们在堆栈上分配。通过降低堆栈指针(在%rsp中),从%rsp到%rsp+31的地址范围可用于存储数据。

在64位代码中,已经为您保留了128个字节,因此您不必在叶函数中弄乱堆栈指针,这意味着您可能不必推/弹出%rbp。只需对您的数据使用%rsp-128到%rsp-1即可

该保留区域称为:


用一本书学习小东西要比用反汇编外文二进制文件容易得多。@a3如果这些说明也在书中的话。如果你知道的话,请回答好吗?谢谢。好的,我知道了。那么堆栈的大小是多少?谁来决定?谢谢。简短的回答,操作系统,甚至你的编译器。谁设置堆栈指针。x86-32和x86-64之间的区别主要在于如何处理堆栈,而不是它的大小。因此,最后,我不需要分配该大小,我只需要担心堆栈指针地址范围?再次感谢。您的示例中的32个字节构成了一个大小和地址范围。我之前的评论是关于堆栈的总大小,在正常使用情况下,堆栈的总大小可能非常大。关于红色区域的重要注意事项:它不是特定于64位代码的。它是特定于Linux x86-64的。例如,在Windows上没有这样的东西。不过,要明确的是,MS没有遵循AMD/Intel规范。ABI规范说有一个红色区域,它应该出现在Linux和Unix上,包括OS X。
pushq   %rbp
movq    %rsp, %rbp
subq    $32, %rsp