Assembly x86计算给定AH和AL的AX?

Assembly x86计算给定AH和AL的AX?,assembly,x86,cpu-registers,Assembly,X86,Cpu Registers,我很难理解x86汇编中的寄存器,我知道EAX是完整的32位,AX是较低的16位,然后啊和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 |

我很难理解x86汇编中的寄存器,我知道EAX是完整的32位,AX是较低的16位,然后啊和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=0x12
AL=0x34
,如下所示:

00 00 00 00 00 00 12 34
|           |     || ||
|           |     || AL
|           |     AH  |
|           |     |___|
|           |     AX  |
|           |_________|
|           EAX       |
|_____________________|
RAX
…然后您有
AX=0x1234
EAX=0x0000124

注意,如图所示,
AH
是这里唯一一个与低位不对齐的“怪异”寄存器。其他的(
AL
AX
EAX
RAX
,用于64位)只是大小不同,但都在右侧对齐。(例如,图表中标记为
EE
的两个字节本身没有寄存器名。)


写入AL、AH或AX合并到完整RAX中,由于历史原因,其他字节未被修改。(如果您不特别希望合并,请选择
movzx-eax,byte[mem]
movzx-eax,word[mem]
加载:)


写入eaxzero扩展到RAX。()

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

RR RR RR RR EE EE HH LL
|           |     || ||
|           |     || AL
|           |     AH  |
|           |     |___|
|           |     AX  |
|           |_________|
|           EAX       |
|_____________________|
RAX
…其中,
RAX
是存在于
x86-64
中的64位寄存器

因此,如果您有
AH=0x12
AL=0x34
,如下所示:

00 00 00 00 00 00 12 34
|           |     || ||
|           |     || AL
|           |     AH  |
|           |     |___|
|           |     AX  |
|           |_________|
|           EAX       |
|_____________________|
RAX
…然后您有
AX=0x1234
EAX=0x0000124

注意,如图所示,
AH
是这里唯一一个与低位不对齐的“怪异”寄存器。其他的(
AL
AX
EAX
RAX
,用于64位)只是大小不同,但都在右侧对齐。(例如,图表中标记为
EE
的两个字节本身没有寄存器名。)


写入AL、AH或AX合并到完整RAX中,由于历史原因,其他字节未被修改。(如果您不特别希望合并,请选择
movzx-eax,byte[mem]
movzx-eax,word[mem]
加载:)


写入eaxzero扩展到RAX。是的,没错。您也可以只执行AX=256*AH+AL=2560+10=2570。当你有疑问的时候,你可以在调试器中运行一些代码。谢谢@Jester,快捷方式会派上用场:)转换成十六进制在精神上更容易。每个字节是2个十六进制数字。它只是0x0a0a,先加AH。同样相关:是的,这是正确的。您也可以只执行AX=256*AH+AL=2560+10=2570。当你有疑问的时候,你可以在调试器中运行一些代码。谢谢@Jester,快捷方式会派上用场:)转换成十六进制在精神上更容易。每个字节是2个十六进制数字。它只是0x0a0a,先有AH。也相关: