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

Assembly 汇编—即使在允许数据不对齐的体系结构中,指令也必须对齐吗?,assembly,memory-alignment,Assembly,Memory Alignment,我知道有些小端架构(如Intel x86)允许不对齐的数据访问。当然,从直觉上讲,失调不是很聪明,因为它可能会降低性能(不一定是现代芯片)。因此,未对齐的数据访问可能不好,但在某些体系结构中是合法的。好的 直到最近,我还认为这同样适用于未对齐的指令:如果给定的处理器处理数据的不对齐,有什么可以阻止它对代码执行相同的操作?然而,在Linda Null的书()中,它清楚地指出了相反的情况: 通常,现实生活中的折衷方案涉及使用两到三个指令长度,这提供了易于区分且易于解码的位模式。指令长度还必须与机器上

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

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

通常,现实生活中的折衷方案涉及使用两到三个指令长度,这提供了易于区分且易于解码的位模式。指令长度还必须与机器上的字长进行比较。如果指令长度正好等于字长,则当指令存储在主内存中时,指令将完全对齐。为了说明原因,说明始终需要与单词对齐。因此,实际字长的一半、四分之一、两倍或三倍的指令可能会浪费空间。可变长度指令的大小显然不同,需要进行字对齐,这也会导致空间损失

另一方面,谷歌图书上的许多书自然地谈到了未对齐的指令。因此,我的问题是:

  • 某些体系结构中是否允许未对齐的指令
  • 大端体系结构是否需要对齐?据我所知,只有在little endian处理器上才可能出现未对准 我说得对吗


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

    没有通用答案,您必须单独查看每个设计。这一设计也说明了endiannes。我看不出你是如何试图把端点和对齐点联系起来的。有非常流行的架构,孤立地看每一个架构,endiannes要么没有选择,要么有一个流行的选择,并且完全独立于架构内的Endianness是它的对齐规则

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

    以MIPS为例,不幸的是,我不知道我猜的传统端点是大的,但人们称之为双端点,这总是应该引起警报的东西。但这里再次强调,持久性和一致性没有理由被结合起来。MIPS作为一个教育性的概念,以及你可以为自己的设计购买的物理构建或至少核心,都是关于性能的,这让程序员感到痛苦,而强制对齐正好符合这一点。当然,指令获取和数据读取遵循相同的规则是有意义的,指令集是/是32位指令,并且这些指令也是理想对齐的

    ARM,从早期开始,ARM强制对齐,但即使使用ARM7TDMI,您也可以禁用该功能,尽管ARM说该行为是可预测的,只是奇怪(在单词内旋转,而不是溢出到另一个单词中)。由于x86的存在,懒惰的程序员们更能容忍通过禁用错误陷阱来允许未对齐的传输,结果是我们所期望的,通过溢出到下一个单词。这里再次列为bi-endian机器,但明智的解决方案是使用little-endian,工具和一切都有意义,它们的ENDIANTY在armv6中从BE-32更改为BE-8,进一步造成big-endian痛苦,请远离。唯一的例外是strongarm,它成为了marvell(我想是cavium?)购买的xscale,默认为big endian(BE-32),获得工作工具是一件非常痛苦的事情,但尽管能够运行很少,这些社区还是运行得很好。我想记住,arm设计要求指令获取对齐,如果禁用故障,数据不必对齐。指令始终是小端,与大/小设置无关。它们还有一个16位指令集thumb和thumb2扩展,它们是可变长度thumb,不需要对齐,它们是可变长度的16位指令,而不是将它们视为32位指令。解码器必须检查第一条16位指令,以了解后面的指令是否已连接。就像x86一样

    RISC倾向于性能而非CISC,因此RISC设计往往具有对齐规则,但没有理由有人不能制造完全未对齐的RISC或完全对齐的CISC。不要让自己陷入概括这些内容的陷阱,您必须单独查看每个体系结构和/或核心,即使是在供应商或指令集内(xscale vs ARM7TMDI)

    调整始终会影响所有系统的今天、昨天和明天的性能。有时,这种影响会更小或更大,但你不能在设计中随心所欲地神奇地生长硅或电线,因此你不能仅仅改变总线的工作方式,以及在一个时钟周期中可以和不能容纳的内容。因此,没有新的技术,除非严格限制在字节或位宽的总线上,否则可以撤销对齐性能的影响。回到核心接口的8位总线并不是更快,更宽的总线在芯片上更快。片外变窄不是更快,而是更易驾驭,因此SATA战胜了PATA。简单地说,因为我们不能保持许多高速信号并行,所以必须对t进行串行化