x86 在给定 AH 和 AL 的情况下计算 AX?

x86 Calculating AX given AH and AL?

我无法理解 x86 汇编中的寄存器,我知道 EAX 是完整的 32 位,AX 是低 16 位,然后是 AH 和 AL 是 AX 的高低 8 位,但我'我在做题。

如果 AL=10 且 AH=10,AX 中的值是多少?

我的想法是将10转换为二进制(1010)然后将其作为AX的高位和低位(0000 1010 0000 1010)然后将其转换为十进制(2570)我是否接近正确答案在这里,还是离题太远?

正如 Peter Cordes 所建议的,我会将数据想象为十六进制值:

RR RR RR RR EE EE HH LL
|           |     || ||
|           |     || AL
|           |     AH  |
|           |     |___|
|           |     AX  |
|           |_________|
|           EAX       |
|_____________________|
RAX

...其中 RAX 是存在于 x86-64.

中的 64 位寄存器

所以如果你有 AH = 0x12AL = 0x34,像这样:

00 00 00 00 00 00 12 34
|           |     || ||
|           |     || AL
|           |     AH  |
|           |     |___|
|           |     AX  |
|           |_________|
|           EAX       |
|_____________________|
RAX

...然后你有 AX = 0x1234EAX = 0x00001234 等等

请注意,如图所示,AH 是此处唯一未与低位对齐的“怪异”寄存器。其他(ALAXEAXRAX(对于 64 位)只是大小不同,但都右对齐。 (例如,图表中标记为 EE EE 的两个字节本身没有寄存器名称。)


将 AL、AH 或 AX 合并到完整的 RAX 中,由于历史原因保留其他字节未修改。 (如果您不特别想要此合并,请选择 movzx eax, byte [mem]movzx eax, word [mem] 加载:

将 EAX 零扩展写入 RAX。 (Why do x86-64 instructions on 32-bit registers zero the upper part of the full 64-bit register?)