我对x86寄存器的理解表明,每个寄存器都可以被整个32位代码访问,并且它被分成多个可访问的寄存器。
在这个例子中,EAX
是一个32位寄存器,如果我们调用AX
它应该返回前16位,如果我们调用AH
或AL
它应该返回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
真正拥有什么价值呢?
不,那不太对劲。
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.
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
| 0000 0001 0010 0011 0100 0101 0110 0111 | ------> EAX
| 0100 0101 0110 0111 | ------> AX
| 0110 0111 | ------> AL
| 0100 0101 | ------> AH
不,你的错是错的
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
否 - AL是AX的8个最低有效位。 AX是EAX的16个最低有效位。
如果我们从eax开始使用04030201h,也许最容易处理。在这种情况下,AX将包含0201h,AH将包含02h,AL将包含01h。
下面的代码片段使用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