Assembly 在装配中何时应使用显式对齐指令?

Assembly 在装配中何时应使用显式对齐指令?,assembly,alignment,Assembly,Alignment,我花了一些时间在汇编编程上(特别是Gas),最近我学习了align指令。我想我已经了解了最基本的内容,但我想更深入地了解它的本质以及何时使用对齐 例如,我想知道一个简单的C++交换语句的汇编代码。我知道在某些情况下,switch语句基于跳转表,如下几行代码所示: .section .rodata .align 4 .align 4 .L8: .long .L2 .long .L3 .long .L4 .long .L5

我花了一些时间在汇编编程上(特别是Gas),最近我学习了align指令。我想我已经了解了最基本的内容,但我想更深入地了解它的本质以及何时使用对齐

例如,我想知道一个简单的C++交换语句的汇编代码。我知道在某些情况下,switch语句基于跳转表,如下几行代码所示:

    .section    .rodata
    .align 4
    .align 4
.L8:
    .long   .L2
    .long   .L3
    .long   .L4
    .long   .L5
    ...
.align 4在下一个4字节边界上对齐以下数据,确保获取这些内存位置是高效的,对吗?我认为这样做是因为在switch语句之前可能会发生一些导致未对齐的事情。但为什么实际上有两个调用.align?何时调用.align有什么经验法则吗?还是只要在内存中存储了一个新的数据块,并且在此之前的某个操作可能会导致未对齐,就直接调用.align

对于数组,似乎只要数组占用至少32字节,就会在32字节边界上进行对齐。这样做效率更高,还是32字节边界还有其他原因


如果有任何关于文献的解释或提示,我将不胜感激。

有不止一个
.align
指令,这仅仅是因为编译器内部的工作方式;一个就足够了,只发射一个就需要额外的工作

就总体对齐而言,这是一个复杂的主题,但这里有一篇针对英特尔x64的文章,讨论了您感兴趣的一些问题:


其他体系结构可能会有很大的不同。

我对汇编语言的掌握仅限于6510,它没有对齐指令。但是,根据我在C++设置中的内存对齐知识,我猜想“对齐”指令不是实际的CPU指令。它可能只是一个汇编指令,指示在何处插入下一个操作码。如果是这样,一行中的两个align指令与只遇到一个指令相同。我认为
.align 2
将代码与2^2=4字节对齐。在您使用
.align 4
的情况下,我认为allignment是在2^4=16字节上。我怀疑第二个.align指令是由于编译器的工作方式,但现在知道它是件好事。也谢谢你的链接