Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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 GNU汇编程序-为什么';t-4(%rbp)是否覆盖堆栈上的帧指针?_Assembly_Disassembly - Fatal编程技术网

Assembly GNU汇编程序-为什么';t-4(%rbp)是否覆盖堆栈上的帧指针?

Assembly GNU汇编程序-为什么';t-4(%rbp)是否覆盖堆栈上的帧指针?,assembly,disassembly,Assembly,Disassembly,考虑以下反汇编代码: _sum: 0000000100000f60 pushq %rbp 0000000100000f61 movq %rsp, %rbp 0000000100000f64 movl %edi, -0x4(%rbp) 0000000100000f67 movl %esi, -0x8(%rbp) 据我所知,%rbp是一个64位寄存器,因此它意味着pushq%rpb在堆栈上分配8个字节。如果是这样,为什么movl%edi,-0x4(%r

考虑以下反汇编代码:

_sum:
0000000100000f60    pushq   %rbp
0000000100000f61    movq    %rsp, %rbp
0000000100000f64    movl    %edi, -0x4(%rbp)
0000000100000f67    movl    %esi, -0x8(%rbp)

据我所知,
%rbp
是一个64位寄存器,因此它意味着
pushq%rpb
在堆栈上分配8个字节。如果是这样,为什么
movl%edi,-0x4(%rbp)
有效?我相信它会覆盖已保存的4个字节的
%rbp
,这些字节必须用于以后从过程返回
%edi
%esi
是传递给
sum
函数的参数。

堆栈向下增长。
pushq
所做的是:

RSP  ← RSP – 8;
Memory[SS:RSP]  ← SRC; (* push quadword *)

因此,您推送的最后一个值(即,
%rbp
的旧值)位于
(%rsp)
,任何与
%rsp
负偏移的值都是“自由空间”。

堆栈向下增长。
pushq
所做的是:

RSP  ← RSP – 8;
Memory[SS:RSP]  ← SRC; (* push quadword *)

因此,您最后推送的值(即,
%rbp
的旧值)位于
(%rsp)
,任何与
%rsp
负偏移的值都是“自由空间”。

称为“红色区域”的“自由空间”,将被下一次
推送
调用
覆盖,因此使用它时,应该清楚自己在做什么(编译器会这样做,我建议初学者在手动asm中远离它,而包括
sub/add rsp
)。啊,谢谢。我误解了内存布局,但现在它有了完美的意义。“可用空间”称为“红色区域”,将被下一次
推送
调用
覆盖,因此在使用它时,应该清楚地知道自己在做什么(编译器会这样做,我建议初学者在手动asm中远离它,而不是包括
sub/add rsp
).Ahhh,谢谢。我误解了内存布局,但现在它有了完美的意义。即使有+4位移,它也是“有效”指令(覆盖旧的
rbp
值),问题是它是否有意义。部分覆盖保留的值没有多大意义,因此您的问题具有良好的逻辑,只是您错过了内存布局,认为这会在其他地方出现。但质疑asm中指令的有效性有点奇怪,只要它编译,它就是有效的。如果您有意要仅更改该值的32位,则执行
movl%edi,4(%rbp)
肯定是可能的解决方案之一。即使有+4位移(覆盖旧的
rbp
值),它也是“有效”指令,问题是它是否有意义。部分覆盖保留的值没有多大意义,因此您的问题具有良好的逻辑,只是您错过了内存布局,认为这会在其他地方出现。但质疑asm中指令的有效性有点奇怪,只要它编译,它就是有效的。如果您有意要仅更改该值的32位,则执行
movl%edi,4(%rbp)
无疑是可能的解决方案之一。