我花了一些时间进行汇编编程(特别是 Gas),最近我了解了对齐指令。我想我已经了解了最基本的知识,但我想更深入地了解其本质以及何时使用对齐。
例如,我想知道一个简单的 C++ switch 语句的汇编代码。我知道在某些情况下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
指令只是因为编译器内部的工作方式;一个就足够了,只发出一个需要额外的工作。
就一般而言的对齐而言,这是一个复杂的主题,但这里有一篇针对 Intel x64 的文章,讨论了您感兴趣的一些问题:
- 迁移到 64 位英特尔® 架构时的数据对齐 http://software.intel.com/en-us/articles/data-alignment-when-migrating-to-64-bit-intel-architecture/
其他架构可能有很大不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)