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

问题描述 投票:28回答:6

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

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

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

0000 0100 0000 1000 0110 0000 0000 0111

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

0000 0100 0000 1000

如果我们读AH它应该返回

0000 0100

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

0000 0111

它是否正确?如果AH真正拥有什么价值呢?

assembly x86 cpu-registers
6个回答
58
投票

不,那不太对劲。

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.

32
投票

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

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

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

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

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

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  

4
投票

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

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


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位
© www.soinside.com 2019 - 2024. All rights reserved.