问题描述
给出以下汇编代码,我知道 .data 会朝着更高的地址增长,因此在运行代码后,内存看起来像:
Giving the following assembly code I know that .data grows towards higher addresses so after running the code the memory looks something like:
-
-
-
-
-
-
-
- (var3 here and up)
-
-
-
- (var2 here and up)
-
-
-
- (var1 here and up)
所以当他们问最后会在寄存器 rsp 中保存什么时,为什么蓝色选项是正确的?
So when they ask what will be saved in register rsp at the end why the blue option is the correct one?
这是我尝试解决它的方法:
Here is how I tried to solve it:
- 在第一行,我们试图将 var3 的值保存在寄存器中,var3 的值是 var2 的值,即 -1,在第二行,我们将其加 6,因此总共得到 5.
请注意,在上一个问题中,我被告知标签或变量前没有 $ 表示其在内存中的值(数据),其中添加 $ 表示其在内存中的地址.
Please Note, In previous question I was told that label or variable with no $ before it means its value in memory (data) where adding $ means its address in memory.
推荐答案
var3
的值为var2
,即var2
的地址..int
, .quad
, ... 指令总是将其操作数的地址存储到内存中.这也是您使用 .int 0
而不是 .int $0
的原因.所以你的推理是错误的.您还忘记考虑 pushq
指令对 rsp
寄存器内容的影响(推送 qword 将 rsp
减少 8).
The value of var3
is var2
, i.e. the address of var2
. The .int
, .quad
, ... directives always store the addresses of their operands into memory. Which is also why you have .int 0
instead of .int $0
. So your reasoning is wrong. Also you forgot to account for the effect of the pushq
instruction on the contents of the rsp
register (pushing a qword decreases rsp
by 8).
实际发生了什么:
mov var3, %rbx
var3
的内容被移动到 rbx
中.var3
保存着 var2
的地址.
The content of var3
is moved into rbx
. var3
holds the address of var2
.
lea 6(%rbx), %rsp
栈指针用rbx + 6
加载.由于 rbx
持有 var2
,所以现在是 var2+6
.
The stack pointer is loaded with rbx + 6
. As rbx
holds var2
, this is now var2+6
.
pushq $0xffc8
有些东西存储在堆栈中,将 rsp
减 8.rsp
现在保存 var2-2
.
Something is stored on the stack, decreasing rsp
by 8. rsp
now holds var2-2
.
这篇关于在 x64 程序集中订购 .data?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!