【问题标题】:What do these lines of code mean in x86 assembly? [duplicate]这些代码行在 x86 汇编中意味着什么? [复制]
【发布时间】:2018-10-25 20:23:16
【问题描述】:

我不明白这个汇编代码是做什么的。

imul   -0x8(%rsp, %rbx, 4), %eax
cmp    %eax, -0x4(%rsp, %rbx, 4)

我知道 imul 和 cmp 的指令是做什么的,但我不明白 -0x4(%rsp, %rbx, 4) 和 -0x8(%rsp, %rbx, 4) 是什么意思。如果需要,我可以提供更多上下文,但我真正想要的只是这两行的字面翻译。第一行的 %eax 中存储了什么? %rbx*4 和 %rsp - 8 的乘积?

【问题讨论】:

  • -0x8(%rsp, %rbx, 4) 是一个内存操作数。在 AT&T 语法中,它是位移(base, index, scale),其中计算是位移+base+index*scale。 base 和 index 必须是寄存器,scale 是一个值 1,2,4,8,displacement 可以是 32 位有符号值。

标签: assembly x86 cpu-registers


【解决方案1】:

%eax 中存储的内容是-0x8(%rsp, %rbx, 4) 和%eax 的乘积。

而-0x8(%rsp, %rbx, 4)是内存位置%rsp + 4*%rbx - 8的内容。

【讨论】:

  • 问题中的代码看起来像 64 位代码。但是这里的操作数大小仍然是 32 位(默认情况下?)。内存位置是否指向 32 位操作数,因为指定了 %eax 而不是 %rax?
  • @E.vanPutten:我没有编写 64 位 x86 汇编代码的经验。但我假设地址是 64 位,操作数(在本指令中)是 32 位。就像您可以在 32 位模式下执行 8 位或 16 位乘法一样。
  • 真是一团糟!
  • imul -0x8(%rsp, %rbx, 4), %eax 在后台获取内存地址 -0x8(%rsp, %rbx, 4 处的 32 位值,然后将其乘以 EAX。内部结果是源操作数宽度的两倍。结果的低 32 位将放在 EAX 中(CF 将相应设置),RAX 的高 32 位将被自动覆盖为零(因为 CPU 在 64 位模式下为零通过整个 64 位寄存器(本例中为 RAX)扩展任何 32 位目标寄存器
  • 在 64 位模式下,指令的默认操作大小为 32 位。这可以被 REX.W 前缀覆盖
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多