【问题标题】:Labels and Variables in Assembly?汇编中的标签和变量?
【发布时间】:2021-11-27 18:05:57
【问题描述】:

假设我在程序集中有一个标签(at&t 语法,x86-64),如下所示:

test_tabel:
    mov test_label,%eax #1
    mov (test_label),%eax #2
    mov $test_label,%eax #3

谁能告诉我这三个之间有什么区别,因为我经常看到它们,但不能真正理解每个的真正含义(地址,价值等......)

现在如果我在 .data 部分有一个变量(假设它的大小为 int 即 4 个字节)这 3 个之间有什么区别:

mov var,%eax #4
mov var,%eax #5
mov $var,%eax #6

【问题讨论】:

  • 你不是说你的第 5 行要读 mov (var), %eax,带括号。您已将其与第 4 行相同!
  • 请注意,mov $test_label,%eax 可能是个问题,因为地址通常为 64 位,而您将其加载到 32 位寄存器中。通常应该使用lea test_label(%rip), %rax

标签: assembly label 64-bit x86-64 att


【解决方案1】:

(1) 和 (2) 是相同的,并且从内存 test_label 加载 4 个字节到 eax。 (3)将test_label的地址加载到eax中。

变量只是一个标签,因此您的第二组示例没有什么特别之处。

(4) 和 (5) 在行为上与 (1) 和 (2) 相同,(6) 在行为上与 (3) 相同。

【讨论】:

  • 你确定吗?我学会了 $ 表示地址...
  • 请注意它是 at&t 语法 x64
  • @Dan 我确实说过“(3) 将 test_label 的 address 加载到 eax 中。”你期待什么?
  • 你的回答在这里没有意义:stackoverflow.com/questions/69486268/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多