汇编 – 即使在允许未对齐数据的架构中,是否必须对齐指令?

我知道像Intel x86这样的一些小端架构允许未对齐的数据访问.当然,直观地说,错位不是很聪明,因为它可能会降低性能(对于现代芯片来说,不一定像
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书籍的书籍自然会谈到未对齐的指令.所以,我的问题是:

>是否在某些架构中允许使用未对齐的指令?
>是否需要任何大端架构的对齐?据我所知,只有小端处理器才能实现错位.

我是对的吗?

我希望你能帮助我为我澄清这些问题.非常感谢,伙计们!

最佳答案 没有通用的答案你必须分别看每个设计.这个设计还有关于endiannes的说法.我不知道你是如何尝试连接字节序和对齐之间的点.有非常流行的架构,并且孤立地看着它们中的每一个,对于endiannes没有选择或流行的选择,并且完全依赖于该架构中的endianess是它的对齐规则.

根据定义,x86是一个8位指令集,当使用8位或16位总线时根据您购买或接线的方式开始返回,因此根据定义,没有对齐,并且根据定义,它是一个变长的指令集.它不能具有对齐规则的单个字节数.由于它的历史,它没有数据的对齐规则,进一步损害了它的性能.

以MIPS为例,不幸的是我不知道我猜的传统字节序很大,但人们称之为双端,这总是应该引发警报.但在这里,endianess和alignment无法合并. MIPS作为一种教育概念,并且除了物理构建或至少可以为您自己的设计购买的核心之外,还有关于性能,程序员的痛苦以及强制执行对齐.自然地,指令提取和数据读取将遵循相同的规则是有意义的,指令集是32位指令并且那些理想地也是对齐的.

ARM,从早期的手臂强制对齐,但即使使用ARM7TDMI你也可以禁用它,尽管ARM ARM说行为是可预测的,但只是奇怪的(在单词内旋转而不是溢出到另一个单词).由于x86的懒惰程序员,他们更容忍通过禁用故障陷阱允许未对齐的传输,结果是人们所期望的,通过溢出到下一个单词.这里再次被列为双端机器,但理智的解决方案是小端,工具和一切都有意义,他们的endianness从BE-32变为arm-6中的BE-8进一步导致大端痛,只是远离.唯一的例外是强力臂,它变成了xscale,我认为它已经买了(或者它是空气?),它是默认为大端(BE-32)并且是获得工具的王室痛苦但是尽管能够运行很少这些社区运行大.我想要记住,手臂设计需要对齐指令提取,如果禁用故障则不需要数据.并且指令总是小端,独立于大/小设置.它们还有一个16位指令集拇指,然后是thumb2扩展,它们是可变长度的拇指,不需要对齐,它们是可变长度的16位指令,而不是将它们视为32位指令.解码器必须检查第一个16位指令以了解后面的指令是否已连接.就像一个x86.

RISC倾向于性能优于CISC,因此RISC设计往往具有对齐规则,但没有理由为什么有人无法完全实现未完全对齐的RISC或完全对齐的CISC.不要让自己落入概括任何一个的陷阱,你必须分别查看每个架构和/或核心,即使在供应商或指令集(xscale vs ARM7TMDI)中也是如此.

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

点赞