作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我花了一些时间进行汇编编程(特别是 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 是否有任何经验规则,或者是否应该在内存中存储新数据 block 时调用 .align,而在此之前的某些内容可能会导致未对齐?
对于数组,似乎只要数组占用至少 32 字节,就会在 32 字节边界上进行对齐。这样做是否更有效,或者 32 字节边界还有其他原因吗?
我很感激任何有关文学的解释或提示。
最佳答案
由于编译器内部的工作方式,有多个 .align
指令;一个就足够了,只发出一个需要额外的工作。
就总体而言,这是一个复杂的主题,但这里有一篇针对 Intel x64 的文章,讨论了您感兴趣的一些问题:
其他架构可能有很大不同。
关于assembly - 什么时候应该在汇编中使用显式对齐指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4567938/
我是一名优秀的程序员,十分优秀!