我对x86寄存器的理解表明,每个寄存器都可以通过整个32位代码访问,并且可以分成多个可访问的寄存器。
在此示例中EAX
是32位寄存器,如果我们调用AX
,它应该返回前16位,如果我们调用AH
或AL
,它应该返回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
真正拥有什么价值?
答案 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