相关疑难解决方法(0)

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

我对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真正具有什么价值呢?

x86 assembly cpu-registers

36
推荐指数
4
解决办法
9万
查看次数

在 Intel x86-64 架构上,机器代码指令是否以小端 4 字节字获取?

尽管单词的常见定义(维基百科所述)是:

用于指定存储器中的位置的最大可能地址大小通常是硬件字(这里,“硬件字”是指处理器的全尺寸自然字,而不是使用的任何其他定义)。

根据一些消息来源,x86 系统注意到它被视为 16 位:

在 x86 PC(Intel、AMD 等)中,虽然架构很早就支持 32 位和 64 位寄存器,但其本机字大小可以追溯到 16 位起源,“单个”字为 16 位。“双”字是 32 位。请参阅 32 位计算机和 64 位计算机。

然而英特尔的官方文档(sdm 第 2 卷,第 1.3.1 节)指出:

这意味着字的字节从最低有效字节开始编号。图 1-1 说明了这些约定。

图 1-1 显示了 x86-64 上下文中单词的小端序列中的 4 个字节,而不是 2 个字节或 8 个字节(如上面链接的来源的不同定义所建议的那样):

在此输入图像描述

我对这一切真正感到困惑的是如何获取和解析指令。我正在编写一个模拟器,一旦我解析 PE 格式的可执行文件并进入文本部分,如果我要遵循 4 字节小端格式,这是否意味着将首先解析第 4 个字节?

让我们组成一些字节,例如:

.text segment buffer:
< 0x10, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20 > ....
Run Code Online (Sandbox Code Playgroud)

我会将第一条指令解析为 1C、1B、1A、10、20、1F、1E、1D ...(等等,由于长度可变,显然可能有更多的单词需要读取,具体取决于这里的实际字节是什么)

x86-64 intel cpu-word machine-code endianness

7
推荐指数
1
解决办法
1187
查看次数