【问题标题】:Byte Storage in a Cpu Register: where is AL inside RAX? [duplicate]Cpu 寄存器中的字节存储:RAX 中的 AL 在哪里? [复制]
【发布时间】:2019-09-06 17:55:27
【问题描述】:

假设我想在 RAX 寄存器中存储以下 64 位数字,寄存器中的字节顺序是什么?

10011111 10100000 11011111 00000001 00001111 00100110 00100110 11101000

RAX = full number; EAX = 00001111 00100110 00100110 11101000; AX = 00100110 11101000; AH = 00100110; AL = 11101000.

最低有效字节是否存储在 AL 中?

顺序取决于小端还是大端,还是寄存器存储始终相同?

在这种情况下,这些是正确的输出吗? AL = 232; AH = 38; AX = 9960; EAX = 254158568; RAX = 11502438643946366696

【问题讨论】:

    标签: assembly x86-64 cpu-registers


    【解决方案1】:

    您的输出看起来正确(除了我没有费心计算 AL 和 AH 以上的任何内容)。

    大/小字节序通常只适用于可寻址内存,对于寄存器来说它有点意义(除非你稍微扩展字节序的定义,就像你刚才所做的那样 - 但请注意这种访问部分的能力使用不同寄存器名称/指令的寄存器非常特定于 x86/x64)。

    恕我直言,在这里使用术语 Bit Numbering 以及 x86 参考文档中的 AL、AH 等定义更为正确。

    另一方面,当 RAX 被保存到内存中时,AL 将在具有最低地址的字节中......

    【讨论】:

    • 感谢您的回答。所以:AL = 1byte(first) AH = 2byte(second) EAX = 1 byte + 2 byte +3byte + 4 byte RAX = 1 byte + 2byte + 3byte + 4byte + 5byte + 6byte + 7 byte + 8 byte ?
    • 是的。这一切都在网络上详细介绍,甚至在pictures :) 在链接保持有效时抓取图像。
    • 所以从这个意义上说,最低有效字节进入 AL 是正确的吗?一直考虑我上面的例子,无论我们使用的是小端机器还是大端机器,AL 的值都应该始终为 11101000,否则在大端机器的情况下它将变为 10011111?
    • 换句话说,我无法理解的是:在大端机器中,考虑到上面的例子,A​​L 是 11101000 或 10011111?
    • 我看到您的困惑...您在问题中使用的寄存器属于(英特尔的)x64 架构。根据定义,它是小端的。在大端机器上(您可以在 Wiki 中找到示例)当寄存器的内容保存到内存中时,您的 10011111 字节将存储在最低地址,而最低有效字节 11101000 将在最高地址,但它几乎不会被调用AL - 其他机器对 CPU 寄存器有其他名称。
    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 2020-02-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多