AX,AH,AL如何映射到EAX?

时间:2013-03-03 21:33:38

标签: assembly x86 cpu-registers

我对x86寄存器的理解表明,每个寄存器都可以通过整个32位代码访问,并且可以分成多个可访问的寄存器。

在此示例中EAX是32位寄存器,如果我们调用AX,它应该返回前16位,如果我们调用AHAL,它应该返回16位后的后8位,AL应返回最后8位。

所以我的问题,因为我不相信这是它的运作方式。如果我们存储32位值EAX存储:

0000 0100 0000 1000 0110 0000 0000 0111

因此,如果我们访问AX,则应返回

0000 0100 0000 1000

如果我们阅读AH,则应该返回

0000 0100

当我们阅读AL时,它应该返回

0000 0111

这是对的吗?如果AH真正拥有什么价值?

6 个答案:

答案 0 :(得分:54)

不,那不太对。

EAX is the full 32-bit value
AX is the lower 16-bits
AL is the lower 8 bits
AH is the bits 8 through 15 (zero-based)

编辑:

为了完整性,除了基于32位CPU的上述内容之外,还有64位Intel / AMD CPU

RAX, which hold a 64-bit value, and where EAX is mapped to the lower 32 bits.

答案 1 :(得分:29)

AX是EAX的16位低位。 AH是AX的8个高位(即EAX的8-15位),AL是EAX和AX的最低有效字节(位0-7)。

示例(十六进制数字):

EAX: 12 34 56 78
AX: 56 78
AH: 56
AL: 78

答案 2 :(得分:7)

没有你的错是

Al和Ah的选择来自AX而不是来自EAX

e.g

EAX=0000 0000 0000 0000 0000 0000 0000 0111

因此,如果我们调用AX,它应该返回

0000 0000 0000 0111

如果我们打电话给AH,它应该返回

0000 0000

当我们打电话给AL时,它应该返回

0000 0111

示例编号2

EAX: 22 33 55 77
AX: 55 77
AH: 55    
AL: 77

示例3

EAX: 1111 0000 0000 0000 0000 0000 0000 0111    
AX= 0000 0000 0000 0111
AH= 0000 0000
AL= 0000 0111  

答案 3 :(得分:6)

| 0000 0001 0010 0011 0100 0101 0110 0111 | ------> EAX

|                     0100 0101 0110 0111 | ------> AX

|                               0110 0111 | ------> AL

|                     0100 0101           | ------> AH

答案 4 :(得分:4)

否 - AL是AX的8个最低有效位。 AX是EAX的16个最低有效位。

如果我们从eax开始使用04030201h,也许最容易处理。在这种情况下,AX将包含0201h,AH将包含02h,AL将包含01h。

答案 5 :(得分:4)

以下代码段使用GDB检查EAX。

    (gdb) info register eax
    eax            0xaa55   43605
    (gdb) info register ax
    ax             0xaa55   -21931
    (gdb) info register ah
    ah             0xaa -86
    (gdb) info register al
    al             0x55 85
  1. EAX - 完全32位值
  2. AX - 低16位值
  3. AH - 比特从8到15
  4. AL - EAX / AX的低8位