Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly AX,啊,AL是如何映射到EAX的?_Assembly_X86_Cpu Registers - Fatal编程技术网

Assembly AX,啊,AL是如何映射到EAX的?

Assembly AX,啊,AL是如何映射到EAX的?,assembly,x86,cpu-registers,Assembly,X86,Cpu Registers,我对x86寄存器的理解是,每个寄存器都可以被整个32位代码访问,它被分解为多个可访问的寄存器 在本例中,EAX是一个32位寄存器,如果我们调用AX它应该返回前16位,如果我们调用AH或AL它应该返回16位之后的下一个8位,AL应该返回最后8位 所以我的问题是,因为我不相信这就是它的运作方式。如果我们存储32位值akaEAX存储: 0000 0100 0000 1000 0110 0000 0000 0111 因此,如果我们访问AX它应该返回 0000 0100 0000 1000 0000

我对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
0000 0100
0000 0111
如果我们读取
AH
它应该返回

0000 0100 0000 1000
0000 0100
0000 0111
当我们阅读
AL
时,它应该会返回

0000 0100 0000 1000
0000 0100
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)
所以AX由AH:AL的一半组成,它本身就是EAX的下半部分。(EAX的上半部分不能作为16位寄存器直接访问;如果需要,可以移动或旋转EAX。)

为完整起见,除上述基于32位CPU的处理器外,64位Intel/AMD CPU还具有

RAX, which hold a 64-bit value, and where EAX is mapped to the lower 32 bits.
所有这些也适用于EBX/RBX、ECX/RCX和EDX/RDX。其他寄存器(如EDI/RDI)具有DI低16位部分寄存器,但没有高8部分,低8 DIL仅在64位模式下可访问:


由于历史原因,写入AL、AH或AX会使其他字节在完整AX/EAX/RAX中保持不变。i、 例如,它必须将一个新的AL合并到完整的RAX中。(在32位或64位代码中,如果您不特别希望合并,请选择
movzx-eax,byte[mem]
movzx-eax,word[mem]
加载:)

写入EAX零扩展到RAX。()

同样,所有这些都适用于每个寄存器,而不仅仅是RAX。e、 g.写入DI或DIL会合并到旧RDI中,写入EDI zero会扩展并覆盖整个RDI。与R10B或R10W写入合并相同,写入R10D使R10独立于旧的R10值。

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


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

AX是EAX的16个低位。AH是AX的8个高位(即EAX的8-15位),AL是EAX和AX的最低有效字节(0-7位)

示例(十六进制数字):

不,你的ans是错的

铝和Ah的选择来自AX而非EAX

e、 g

因此,如果我们调用AX,它应该返回

0000 0000 0000 0111
0000 0000
0000 0111
如果我们叫啊它应该会回来

0000 0000 0000 0111
0000 0000
0000 0111
当我们打电话给艾尔时,它应该会回来

0000 0000 0000 0111
0000 0000
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  

下面的代码片段使用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
  • EAX-完整的32位值
  • AX-较低的16位值
  • 从8到15的位
  • AL-EAX/AX的低8位

  • 不,您的AX值是错误的。删掉最后16位。AH只返回EAX的第8位到第15位。请将位模式替换为在您的问题上下文中更容易理解的内容,例如:0000 0001 0010 0011…相关:re:映射到内存。那么您是否认为我的误解是因为Ax是前16位,而是调用一个同时包含Al和Ah的值?谢谢你的帮助,这就清除了很多。这么愚蠢的错误,你怎么称呼更高的16位和更高的32位?有EAXH或AXH吗?@user97662:没有,没有办法只访问寄存器的上部-您必须读取整个寄存器,并根据需要进行移位。多亏彼得·科德斯(Peter Cordes)大力补充了这个答案。与endian有关吗?如果我用气体组装
    movl$0x01%eax
    ,那么
    %ax
    %al
    的值是多少?一还是零?@FrozenFlame:否,endianness仅适用于内存(包括
    mov$imm32,%eax
    指令的编码方式,如
    opcode 01 00
    )。%al中的值将为
    1
    。如果您认为寄存器中的MSB在左侧,LSB在右侧,则左移%eax可以工作。(对于向量寄存器,这可能会很棘手,请参阅)您还可以使用
    p/x$eax
    在gdb中打印寄存器(或者省略十进制的
    /x
    )。并使用
    设置$eax=0xdeadbeef
    ,IIRC修改它们。有关asm的一些gdb提示,请参见的底部。您应该删除手动空格(
     
    ),并将整个内容格式化为一个代码块(每行缩进4个空格,它将采用单空格格式,并保留空格)