汇编 - 即使在允许未对齐数据的体系结构中,指令也必须对齐吗?

Assembly - Do instructions have to be aligned even in architectures that allow misaligned data?

我知道像 Intel x86 这样的一些小端架构允许未对齐的 data 访问。当然,从直觉上来说,错位并不是很聪明,因为它会降低性能(对于现代芯片来说不一定如此here)。因此,未对齐的数据访问可能不好,但在某些体系结构中是合法的。很好

直到最近,我认为这同样适用于未对齐的 指令 :如果给定的处理器处理数据中的未对齐,什么可以阻止它对代码执行相同的操作?然而,在 Linda Null 的书中 (here) 却说得很清楚:

Typically, the real-life compromise involves using two to three instruction lengths, which provides bit patterns that are easily distinguishable and simple to decode. The instruction length must also be compared to the word length on the machine. If the instruction length is exactly equal to the word length, the instructions align perfectly when stored in main memory. Instructions always need to be word aligned for addressing reasons. Therefore, instructions that are half, quarter, double or triple the actual word size can waste space. Variable length instructions are clearly not the same size and need to be word aligned, resulting in loss of space as well.

另一方面,很多关于Google的书自然会谈到未对齐的指令。所以,我的问题是:

  1. 在某些体系结构中是否允许未对齐的指令?
  2. 对于任何 大端架构,需要对齐吗?据我了解,错位仅在小端处理器上是可能的。

我说得对吗?

我希望你能帮我澄清这些问题。非常感谢大家!!

没有通用的答案,您必须分别查看每个设计。还有那个设计对字节顺序的看法。我不明白您是如何尝试将字节顺序和对齐之间的点联系起来的。有非常流行的架构,孤立地看它们中的每一个,没有选择或流行的字节序选择,并且完全独立于架构中的字节序是它的对齐规则。

x86 根据定义是一个 8 位指令集,它在使用 8 位或 16 位总线时开始,具体取决于您购买或连接的总线,因此根据定义没有对齐,并且根据定义是变量length 指令集的单个字节数不同,它不能有对齐规则。由于它的历史,它也没有数据对齐规则,进一步损害了它的性能。

以 MIPS 为例,不幸的是我不知道传统的字节顺序,我猜它很大,但人们称它为 bi-endian,这总是应该引起警报的东西。但是在这里,字节序和对齐也没有理由结合起来。 MIPS 作为一个教育概念并且仍然是,以及物理构建或至少您可以为自己的设计购买的内核,是关于性能的,对程序员来说是痛苦的,并且强制对齐非常适合这一点。自然地,指令提取和数据读取遵循相同的规则是有意义的,指令集 was/is 32 位指令和那些也理想地对齐。

A​​RM,从早期的 arm 强制对齐开始,但即使使用 ARM7TDMI,您也可以禁用它,尽管 ARM ARM 表示行为是可预测的,只是 st运行ge(在单词内旋转而不是溢出到另一个词)。由于 x86 的懒惰程序员,他们更能容忍通过禁用故障陷阱来允许未对齐的 t运行sfers,并且结果是人们所期望的,溢出到下一个单词。这里再次列为 bi-endian 机器,但理智的解决方案是转到小端,工具和一切都有意义,它们的字节序在 armv6 中从 BE-32 更改为 BE-8 进一步导致大端痛苦,远离.唯一的例外是 strongarm,它变成了 xscale,我认为它是 marvell(或者它是 cavium?),它默认为 big endian(BE-32)并且获得工作工具非常痛苦,但尽管能够 运行小社区 运行 大。我想记住,手臂设计需要对齐指令获取,如果您禁用故障,数据就不必对齐。并且指令总是独立于 big/little 设置的小端。它们还有一个 16 位指令集 thumb,然后是 thumb2 扩展,它们是可变长度的 thumb 并且不需要对齐,它们是可变长度的 16 位指令,而不是将它们视为 32 位指令。解码器必须检查第一个 16 位指令以了解后面的指令是否已连接。就像 x86 一样。

RISC 比 CISC 更倾向于性能,因此 RISC 设计往往具有对齐规则,但没有理由不能制造完全未对齐的 RISC 或完全对齐的 CISC。不要让自己陷入概括任何这些的陷阱,您必须单独查看每个架构 and/or 内核,即使在供应商或指令集(xscale 与 ARM7TMDI)中也是如此。

对齐始终会影响所有系统的今天、昨天和明天的性能。有时影响或大或小,但您不能在设计中随心所欲地神奇地生长硅或电线,因此您不能仅仅改变总线的工作方式以及一个时钟周期内可以和不适合的内容。因此,除非严格限于字节宽或位宽总线,否则没有新技术可以消除对齐性能影响。回到核心接口的 8 位总线并不会更快,芯片越宽越快。片外更窄并不更快但更易于管理,因此 SATA 胜过 PATA。仅仅因为我们不能保持大量高速信号并行,必须将它们串行化(可以有许多单独的串行化接口一起工作,pci,以太网)。因此,cpu 核心架构对齐总是很重要,因为我们使用二进制状态和每条总线的固定位数。