【问题标题】:What happens to %rax after "movq %rax, (%rdi)" executed?执行“movq %rax, (%rdi)”后 %rax 会发生什么?
【发布时间】:2019-04-14 15:19:45
【问题描述】:

我很好奇的是执行代码后 %rax 中的剩余值。
例如,让 %rax 为 0xFFFFFFFFFFFFFFFF
我执行了代码。
那么 0xFF...FF 还在 %rax 中吗?

我的最后一个问题是下面的问题。
在一个汇编代码中
解码1:
movq %rax, (%rdi)
回复

为什么函数decode1的c原代码中没有return命令?
我了解到在执行 'ret' 时会返回 %rax 的值。

【问题讨论】:

  • 我错过了 decode1: 中的一些汇编代码,但假设 %rdi 是指针,在 "movq ..." 行之前的 %rax 中有一个值
  • mov 是只写的。对于 32 位或 64 位操作数大小,寄存器的新内容不依赖于旧的,无论是架构上还是微架构上。

标签: assembly x86-64


【解决方案1】:

mov实际上是复制的意思;源操作数不受影响。所以,在movq %rax, (%rdi) rax 之后仍然包含它之前包含的任何内容。

为什么函数decode1的c原代码中没有return命令? 我了解到在执行 'ret' 时会返回 %rax 的值。

x86 汇编中没有“返回某些东西”的概念; ret 只是将执行返回给调用者。您所说的关于rax 的一点实际上是在几乎所有x86_64 调用约定中,整数或指针返回值都在返回之前放置在那里,因此调用者希望返回值在那里。如果这是一个void 函数,那么rax 没有特别的意义——它只是一个被破坏的寄存器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2012-06-15
    • 2018-11-25
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多