gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:25:17 25 4
gpt4 key购买 nike

尽管单词的通用定义(维基百科上的 as stated)是:

The largest possible address size, used to designate a location in memory, is typically a hardware word (here, "hardware word" means the full-sized natural word of the processor, as opposed to any other definition used).


x86 系统,根据 some sources ,请注意它被视为 16 位:

In the x86 PC (Intel, AMD, etc.), although the architecture has longsupported 32-bit and 64-bit registers, its native word size stems backto its 16-bit origins, and a "single" word is 16 bits. A "double" wordis 32 bits. See 32-bit computer and 64-bit computer.


然而英特尔的 official documentation (sdm 第 2 卷,第 1.3.1 节)指出:

this means the bytes of a word are numbered starting from the least significant byte. Figure 1-1 illustrates these conventions.


图 1-1 显示了 4 个字节的小端序列,而不是 x86-64 上下文中的 2 个字节或 8 个字节(正如上面链接的来源的不同定义所暗示的那样):
enter image description here
我对这一切的真正困惑在于如何获取和解析指令。我正在编写一个模拟器,一旦我解析了一个 PE 格式的可执行文件并进入文本部分,如果我要遵循 4 字节的小端格式,这是否意味着第 4 个字节将首先被解析?
让我们组成一些字节,例如:
.text segment buffer:
< 0x10, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20 > ....
我会将第一条指令解析为 1C、1B、1A、10、20、1F、1E、1D ... (依此类推,长度可变,显然可能需要读取更多的单词,具体取决于此处的实际字节) ?

最佳答案

不,x86 机器码是 byte-stream ;除了 32 位位移和小端的立即数之外,它没有任何面向单词的东西。例如在 add qword [rdi + 0x1234], 0xaabbccdd .它在现代 CPU 上以 16 字节或 32 字节 block 的形式物理获取,并在指令边界上并行拆分以并行馈送到解码器。

48    81   87     34 12 00 00    dd cc bb aa       
REX.W add ModRM le32 0x1234 le32 0xaabbccdd le32 (sign-extended to 64-bit)

add QWORD PTR [rdi+0x1234],0xffffffffaabbccdd
x86-64 不是面向字的架构;没有单一的自然字长,也不必对齐 .在考虑 x86-64 时,这个概念并不是很有用。整数寄存器宽度恰好是 8 个字节,但这甚至不是机器代码中的默认操作数大小,您可以在大多数指令中使用从字节到 qword 的任何操作数大小,对于从 8 或 16 字节到 32 字节的 SIMD或 64 字节。最重要的是,机器代码甚至数据都不需要对齐更宽的整数。

有些人喜欢将一个方形钉子放入一个圆孔中并用机器字来描述 x86,但这个概念只适合围绕单个字长设计的 RISC ISA。 (对于某些 RISC 上的字大小访问,固定指令长度、寄存器大小甚至数据存储器加载/存储都需要字对齐,尽管现代的通常允许不对齐的加载/存储,但会带来一些性能损失。)
(公平地说,64 位 RISC 通常对 32 位和 64 位整数同样有效。但与 x86 不同的是,它们不能执行 add ax, cx 以避免将进位传播到寄存器的高位。虽然 RISC 可以执行在对符号扩展或零扩展加载结果进行一些数学运算后进行 16 位存储)。
有关的:
  • Are there any modern CPUs where a cached byte store is actually slower than a word store? x86 字节/未对齐字/双字存储比许多 RISC 更有效。

  • according to some sources, note it's treated as 16 bits:


    是的,在 x86 术语/文档中,“单词”是 16 位,因为现代 x86-64 是从 8086 演变而来的,如果在 386 是 386 的情况下更改每个人多年来一直使用的文档中的术语的含义,那将是愚蠢的。释放。因此 paddw packed add of 16-bit SIMD elements , 和 movsw/stosw /ETC。字符串指令。
    x86 16 位“字”与 CPU 架构中的“机器字”概念绝对零联系 .
    在 8086 到 286 上,16 位是寄存器和总线宽度,并且是除字节之外唯一可以用于大多数 ALU 指令的整数操作数大小。但是这些 CPU 仍然非常不像 MIPS 那样基于“文字”。机器代码格式仍然相同,具有未对齐的 little-endian 16 位立即数和位移。 (8088 与 8086 相同,除了 8 位总线接口(interface)和 4 字节指令预取缓冲区而不是 6 字节。)

    关于x86-64 - 在 Intel x86-64 架构上是否以 little endian 4 字节字获取机器代码指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68229585/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com