為什么ARM匯編程序前要加PRESERVE8
require8和preserve8
c和匯編有8位對(duì)齊的要求,這兩個(gè)偽指令可以滿(mǎn)足此要求,存在REQUIRE8<——> PRESERVE8的對(duì)應(yīng)關(guān)系,但不是說(shuō)有一個(gè)REQUIRE8就要有一個(gè) PRESERVE8,如果是一個(gè)c文件和一個(gè)匯編文件的調(diào)用,也就涉及一個(gè)PRESERVE8或者是一個(gè)REQUIRE8, 以下剪自ADS1.2中 PDF,就很清楚,由此可見(jiàn),最好不要使用LDRD 或 STRD。 LDRD and STRD instructions (double-word transfers) only work correctly if the address they access is 8-byte aligned. If your code includes LDRD or STRD transfers to or from the stack, use REQUIRE8 to instruct the linker to ensure that your code is only called from objects that preserve 8-byte alignment of the stack. If your code preserves 8-byte alignment of the stack, use PRESERVE8 to inform the linker. The linker ensures that any code that requires 8-byte alignment of the stack is only called, directly or indirectly, by code that preserves 8-byte alignment of the stack. 另外,REQUIRE8和PRESERVE8并不完成8 byte 對(duì)齊的操作,對(duì)齊由ALIGN完成。 |
| |||
Home> 指令參考> 其他指令> REQUIRE8 和 PRESERVE8 |
7.8.14.REQUIRE8 和 PRESERVE8
REQUIRE8
指令指定當(dāng)前文件要求堆棧八字節(jié)對(duì)齊。 它設(shè)置 REQ8 編譯屬性以通知鏈接器。
PRESERVE8
指令指定當(dāng)前文件保持堆棧八字節(jié)對(duì)齊。 它設(shè)置 PRES8 編譯屬性以通知鏈接器。
鏈接器檢查要求堆棧八字節(jié)對(duì)齊的任何代碼是否僅由保持堆棧八字節(jié)對(duì)齊的代碼直接或間接地調(diào)用。
語(yǔ)法
REQUIRE8 {bool}
PRESERVE8 {bool}
其中:
bool是一個(gè)可選布爾常數(shù),取值為
{TRUE}
或
{FALSE}
。
用法
如果您的代碼保持堆棧八字節(jié)對(duì)齊,在需要時(shí),可使用
PRESERVE8
設(shè)置文件的 PRES8 編譯屬性。 如果您的代碼不保持堆棧八字節(jié)對(duì)齊,則可使用
PRESERVE8 {FALSE}
確保不設(shè)置 PRES8 編譯屬性。
Note
如果您省略
PRESERVE8
和
PRESERVE8 {FALSE}
,匯編程序會(huì)檢查修改 sp 的指令,以決定是否設(shè)置 PRES8 編譯屬性。 ARM 建議明確指定
PRESERVE8
。
您可以通過(guò)以下形式啟用警告:
armasm --diag_warning 1546
有關(guān)詳細(xì)信息,請(qǐng)參閱命令語(yǔ)法。
您將會(huì)收到類(lèi)似以下警告:
"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 {FALSE} ; equivalent to absence of REQUIRE8 PRESERVE8 {TRUE} ; equivalent to PRESERVE8 PRESERVE8 {FALSE} ; NOT exactly equivalent to absence of PRESERVE8
Copyright ? 2002-2007 ARM Limited. All rights reserved. | ARM DUI 0204HC |
Non-Confidential |
評(píng)論