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

Ran*_*ndy 36 x86 assembly cpu-registers

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

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

所以我的问题,因为我不相信这是它的运作方式.如果我们存储一个32位值的七...也就是EAX存储

0000 0100 0000 1000 0110 0000 0000 0111
Run Code Online (Sandbox Code Playgroud)

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

0000 0100 0000 1000
Run Code Online (Sandbox Code Playgroud)

如果我们读AH它应该返回

0000 0100
Run Code Online (Sandbox Code Playgroud)

当我们读到AL它时应该返回

0000 0111
Run Code Online (Sandbox Code Playgroud)

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

500*_*ror 63

不,那不太对劲.

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)
Run Code Online (Sandbox Code Playgroud)

编辑:

为了完整性,除了上面基于32位CPU的64位Intel/AMD CPU之外

RAX, which hold a 64-bit value, and where EAX is mapped to the lower 32 bits.
Run Code Online (Sandbox Code Playgroud)


pas*_*ein 35

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
Run Code Online (Sandbox Code Playgroud)


Mik*_*oul 19

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

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

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

|                     0100 0101           | ------> AH
Run Code Online (Sandbox Code Playgroud)

  • 您应该删除手动空格(` `),并将整个内容格式化为代码块(每行缩进 4 个空格,它将采用单空格格式,并保留间距) (6认同)

小智 7

不,你的错是错的

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

例如

EAX=0000 0000 0000 0000 0000 0000 0000 0111
Run Code Online (Sandbox Code Playgroud)

因此,如果我们致电AX,它应该返回

0000 0000 0000 0111
Run Code Online (Sandbox Code Playgroud)

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

0000 0000
Run Code Online (Sandbox Code Playgroud)

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

0000 0111
Run Code Online (Sandbox Code Playgroud)

示例2

EAX: 22 33 55 77
AX: 55 77
AH: 55    
AL: 77
Run Code Online (Sandbox Code Playgroud)

例3

EAX: 1111 0000 0000 0000 0000 0000 0000 0111    
AX= 0000 0000 0000 0111
AH= 0000 0000
AL= 0000 0111  
Run Code Online (Sandbox Code Playgroud)