【问题标题】:Order In .data in x64 Assembly?在 x64 程序集中订购 .data?
【发布时间】:2021-11-27 20:19:35
【问题描述】:

给出以下汇编代码,我知道 .data 向更高的地址增长,因此在运行代码后内存看起来像:

-
-
-
-
-
-
-
- (var3 here and up)
-
-
-
- (var2 here and up)
-
-
-
- (var1 here and up)

所以当他们问最后会在寄存器 rsp 中保存什么时,为什么蓝色选项是正确的?

这是我尝试解决的方法:

  • 在第一行中,我们尝试将 var3 的值保存在寄存器中,var3 的值是 var2 的值,即 -1,在第二行中,我们将 6 添加到它,因此总共得到 5。

请注意,在上一个问题中,有人告诉我,标签或变量前面没有 $ 表示其在内存(数据)中的值,而添加 $ 表示其在内存中的地址。

【问题讨论】:

  • 请勿发布测试图片! Edit您的问题并将图片替换为其中的测试。
  • 投了反对票,因为您发布了一张文字图片。替换图片,我会继续删除反对票。
  • @fuz 我不应该等待老师的许可吗?我知道这很奇怪,但他允许传递图片但不允许复制零件......
  • 如果根据 MIT 许可条款(包括复制部分的权利)不允许您发布图片,则根本不应该在此处发布。

标签: assembly 64-bit x86-64 att


【解决方案1】:

var3的值为var2,即var2的地址。 .int, .quad, ... 指令总是将其操作数的地址存储到内存中。这也是您使用.int 0 而不是.int $0 的原因。所以你的推理是错误的。此外,您忘记考虑pushq 指令对rsp 寄存器内容的影响(推送一个qword 会使rsp 减少8)。

实际发生的情况:

mov var3, %rbx

var3 的内容被移动到rbxvar3 持有var2 的地址。

lea 6(%rbx), %rsp

堆栈指针加载了rbx + 6。因为rbx 持有var2,所以现在是var2+6

pushq $0xffc8

堆栈中存储了一些东西,将 rsp 减 8。rsp 现在保持 var2-2

【讨论】:

  • “即 var2 的地址”不是你在这里告诉我的:stackoverflow.com/questions/69484696/… 你说 5 与 2 相同....
  • 2) 如果我想在 var3 中保存 var2 的值怎么办? (在 .data 部分)
  • @Dan 要将var2 的值保存到var3,您需要先从var2 加载,然后再存储到var3,例如通过执行mov var2, %eax; movq %rax, var3(注意隐式零扩展以处理不同的变量大小)。
  • @Dan 没有一条指令可以将一个变量的内容复制到另一个变量中,也无法定义一个变量以使用另一个变量的内容进行初始化(可能除了复制重定位,但是这是非常深奥的)。
  • @NalinRanjan 不一定。例如,mov $0, var1 是一条有效指令,源和目标都不是寄存器。
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
相关资源
最近更新 更多