【问题标题】:x86 Calculating AX given AH and AL?x86 计算 AX 给定 AH 和 AL?
【发布时间】:2016-09-11 15:29:53
【问题描述】:

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

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

我对此的想法是将 10 转换为二进制 (1010),然后将其作为 AX (0000 1010 0000 1010) 的高位和低位,然后将其转换为十进制 (2570) 我是否靠近右边在这里回答,还是离开?

【问题讨论】:

  • 是的,没错。你也可以只做AX=256*AH+AL=2560+10=2570。 PS:如有疑问,您可以在调试器中运行一些代码。
  • 感谢@Jester,快捷方式会派上用场:)
  • 转换为十六进制在心理上更容易。每个字节是 2 个十六进制数字。只是0x0a0a,先有AH。

标签: assembly x86 cpu-registers


【解决方案1】:

按照 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] 加载:Why doesn't GCC use partial registers?

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

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多