我对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
它是否正确?如果它真正具有什么 Value ? AH
6 回答
不,那不太对劲 .
编辑:
为了完整起见,除了基于32位CPU的上述内容之外,还有64位Intel / AMD CPU
AX是EAX的16位低位 . AH是AX的8个高位(即EAX的8-15位),AL是EAX和AX的最低有效字节(位0-7) .
示例(十六进制数字):
不,你的错是错的
Al和Ah的选择来自AX而不是来自EAX
例如
因此,如果我们致电AX,它应该返回
如果我们打电话给AH,它应该返回
当我们打电话给AL时它应该返回
示例2
例3
否 - AL是AX的8个最低有效位 . AX是EAX的16个最低有效位 .
如果我们从eax开始使用04030201h,也许最容易处理 . 在这种情况下,AX将包含0201h,AH将包含02h,AL将包含01h .
下面的代码片段使用GDB检查EAX .
EAX - 全32位值
AX - 低16位值
AH - 比特从8到15
AL - EAX / AX的低8位