【问题标题】:Move 32bit register into a 8 bit register将 32 位寄存器移动到 8 位寄存器中
【发布时间】:2020-11-21 14:19:13
【问题描述】:

我正在尝试将 edx 移动到 al 但我收到此错误

lib/io/print.asm:50: error: invalid combination of opcode and operands

这是代码

mov edx, 0x41
mov al, edx

提前致谢

【问题讨论】:

  • EDX 是一个 32 位寄存器。 DX 是 EDX 的低 16 位,DH 是 DX 的高 8 位,DL 是 DX 的低 8 位。你可以做mov dl, 0x41mov al, dlmov edx, 0x41mov al, dl

标签: assembly x86 nasm cpu-registers


【解决方案1】:

问题出在第二行:

mov al, edx

edx 寄存器是 32 位的,而 al 是 8 位的,所以不能直接将一个移入另一个。如果要将edx 的低8 位移动到dl 中,请执行以下操作:

mov al, dl

或者您可能想将所有 edx 移动到 eax,如下所示:

mov eax, edx

不同之处在于第一个选项保持eax的高24位不变,而第二个选项将它们设置为与edx的对应位相同。

如果您不关心高 24 位,例如,因为您不打算使用它们,或者因为您知道它们在任何一种情况下都为零,那么第二个选项可能会稍微快一些,因为它打破了依赖关系在eax 之前的值上,所以它可以在edx 准备好后立即执行,而不管eax 之前发生了什么。

movzx eax, dl

MOVZX 具有相同的好处,即避免对 AL 目标的错误依赖,同时仅从 EDX 中获取一个字节并对其进行零扩展。你想要的字节在 AL 中。

如果你想要源 EDX 的不同字节,你可以移动和移位,或者movzx eax, dh

【讨论】:

  • @seva-alekseyev 不幸的是,如果我这样做,这些都不起作用 ` global _start section .data string db "testing", 0x00 section .text _start: movzx edx, byte [string] mov eax, 4 mov ebx, 1 mov ecx, edx mov edx, 12 int 0x80 ... ` 它仍然输出整个字符串,如果我尝试 ` ... xor eax, eax mov al, [string] xor edx, edx mov dl, al ... mov ecx, edx ...`它什么也没输出,我还在学习这种语言,有什么想法我做错了吗?
  • @JOhn - 这是一个单独的问题,我不会在 cmets 中讨论。
猜你喜欢
  • 2015-12-26
  • 2014-11-18
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多