【问题标题】:assembly language: 8 bit versions of 64 bit registers? [duplicate]汇编语言:64 位寄存器的 8 位版本? [复制]
【发布时间】:2020-06-07 13:49:25
【问题描述】:

所以,假设我正在使用寄存器 %rax%rdi

作为一个基本示例,假设%rax 等价于0xaaaaaaaaaaaaaaaa%rdi 等价于0xbbbbccccddddeeff

movq %rdi, %rax 这样简单的东西对我来说已经足够简单了。我们只需将%rdi 中的值移动到%rax 中。

所以,假设我们有以下内容:

movq %rdi, %rax
movb %dil, %al

第一条指令的%rax 等于0xbbbbccccddddeeff

但由于我们使用的是%rdi%rax 的8 位版本,我不确定在执行第二条指令后如何确定%rax 的值。

我对汇编语言很陌生,有很多事情我很困惑。我一直在做很多研究和研究,但我仍然很迷茫,所以我认为在这里提出一个澄清问题会帮助我。任何有关如何解决此问题的解释将不胜感激!

【问题讨论】:

    标签: assembly x86-64 cpu-registers


    【解决方案1】:

    第二条指令movb %dil, %al 只替换%rax 的最低8 位。其余的保持原样。

    所以%rax 将是0xbbbbccccddddeeff,因为最低 8 位将被复制两次。

    如果没有第一条指令 movq %rdi, %rax - 将整个寄存器复制到 %rax - 只有最低 8 位将被替换,%rax 的值将是 0xaaaaaaaaaaaaaaff

    【讨论】:

    • 太棒了,谢谢!在没有第一条指令的情况下,对您进行解释也非常有帮助。
    • 不过,如果我不使用两个 8 位寄存器,这将如何工作?例如,如果我做了movzbw %dil, %ax。对于像 htis 这样的 8 位和 16 位寄存器指令,正确的做法是什么?
    • 没什么特别的。在movzbw %dil, %ax 的情况下,%dil 的 8 位值将被零扩展为 %ax 的无符号 16 位值 - 并写入它(%rax 的最低 16 位)。所以%rax 的最低 16 位将被覆盖。
    • @larn:但是请注意,32 位指令是不同的。 movl %edi, %eax 将复制低 32 位和 zero 高 32 位。见stackoverflow.com/questions/11177137/…
    • @larn:您可以而且应该在调试器中单步执行代码并观察寄存器值的变化。如果您不确定某事,请自己尝试一下。只需将这两条指令放在_start:main: 的顶部,然后汇编成您运行GDB 的可执行文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    相关资源
    最近更新 更多