金牌会员
- 积分
- 1765
- 金钱
- 1765
- 注册时间
- 2015-9-21
- 在线时间
- 544 小时
|
5.11 对齐 REQUIRE8 and PRESERVE8
数据和代码必须与适当的边界对齐。
例如,T32伪指令ADR只能加载单词对齐的地址,但是T32代码中的标签可能不是单词对齐的。您必须使用对齐指令来确保T32代码中地址的4字节对齐。
对齐指令通过填充零或NOP指令将当前位置对齐到指定边界。
注解:
集成的汇编器为一个.text部分设置最小4字节对齐。但是,如果使用集成的汇编器定义自己的部分,则必须包含.balign指令来设置正确的对齐方式。对于包含T32指令的部分,将对齐方式设置为2字节。对于包含A32指令的部分,将对齐方式设置为4字节。
armasm syntax
armasm语法程序集提供ALIGN n指令,其中n以字节为单位指定对齐边界。例如,指令ALIGN 128将地址对齐到128字节的边界。
armasm语法程序集还提供了PRESERVE8指令。PRESERVE8指令指定当前文件保持堆栈的8字节对齐。
GNU syntax
GNU语法程序集提供了.balign n指令,该指令使用与ALIGN相同的格式。
将ALIGN n的所有实例转换为.balign n。
注解:
GNU语法程序集还提供了.align n指令。然而,n的格式因系统而异。.balign指令提供了与.align相同的对齐功能,并在所有架构中提供一致的行为。
将PRESERVE8的所有实例转换为.eabi_attribute Tag_ABI_align_preserved, 1。
REQUIRE8 and PRESERVE8
REQUIRE8和PRESERVE8指令指定当前文件需要或保持堆栈的8字节对齐。
语法:
REQUIRE8 {bool}
PRESERVE8 {bool}
bool是一个可选的布尔常数,{TRUE}或{FALSE}。
用法:
在需要的地方,如果您的代码保持堆栈的8字节对齐,请使用preve8设置文件上的PRES8构建属性。如果您的代码没有保持堆栈的8字节对齐,请使用PRESERVE8 {FALSE}来确保没有设置PRES8构建属性。使用REQUIRE8设置REQ8构建属性。如果一个文件中有多个REQUIRE8或PRESERVE8指令,那么汇编器将使用最后一个指令的值。
链接器检查任何需要堆栈八字节对齐的代码只被保持堆栈八字节对齐的代码直接或间接调用。
注解:
如果您省略了preve8和preve8 {FALSE},那么汇编程序将通过检查修改SP的指令来决定是否设置PRES8构建属性。ARM建议您显式指定preve8。
在调用armasm时,可以使用——diag_warning 1546选项来启用警告。
这会给你以下警告:
"test.s", line 37: Warning: A1546W: Stack pointer update potentially breaks 8 byte stack alignment
37 00000044 STMFD sp!,{r2,r3,lr}
实例:
REQUIRE8
REQUIRE8 {TRUE} ; equivalent to REQUIRE8 相当于REQUIRE8
REQUIRE8 {FALSE} ; equivalent to absence of REQUIRE8 等同于缺少REQUIRE8
PRESERVE8 {TRUE} ; equivalent to PRESERVE8 相当于PRESERVE8
PRESERVE8 {FALSE} ; NOT exactly equivalent to absence of PRESERVE8 不完全等同于没有PRESERVE8
REQUIRE8 and PRESERVE8
REQUIRE8和PRESERVE8指令指定当前文件需要或保持堆栈的8字节对齐。
注解:
这个指令需要支持非abi标准的工具链。它对AArch64装配没有影响,针对AArch64不需要。
语法:
REQUIRE8 {bool}
PRESERVE8 {bool}
bool 是一个可选的布尔常数,{TRUE}或{FALSE}。
|
|