单片机
返回首页

为什么ARM汇编程序前要加PRESERVE8

2016-07-28 来源:eefocus

这是字节对齐关键词,以前用ADS编译器的时候可以不用,但是后来的keil编译器时需要加上(譬如用周立功模板时,将ADS工程转到keil工程时就必须加上)。
 
require8和preserve8


c和汇编有8位对齐的要求,这两个伪指令可以满足此要求,存在REQUIRE8<——> PRESERVE8的对应关系,但不是说有一个REQUIRE8就要有一个 PRESERVE8,如果是一个c文件和一个汇编文件的调用,也就涉及一个PRESERVE8或者是一个REQUIRE8,   以下剪自ADS1.2中 PDF,就很清楚,由此可见,最好不要使用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 对齐的操作,对齐由ALIGN完成。

 

RealView? 编译工具 汇编程序指南 3.1 版
Home > 指令参考 > 其他指令 > REQUIRE8 和 PRESERVE8

7.8.14. REQUIRE8 和 PRESERVE8


REQUIRE8
指令指定当前文件要求堆栈八字节对齐。 它设置 REQ8 编译属性以通知链接器。


PRESERVE8
指令指定当前文件保持堆栈八字节对齐。 它设置 PRES8 编译属性以通知链接器。

链接器检查要求堆栈八字节对齐的任何代码是否仅由保持堆栈八字节对齐的代码直接或间接地调用。


语法
REQUIRE8 {
bool
}    
PRESERVE8 {
bool
}    

其中:



bool

是一个可选布尔常数,取值为
{TRUE}

{FALSE}


用法

如果您的代码保持堆栈八字节对齐,在需要时,可使用
PRESERVE8
设置文件的 PRES8 编译属性。 如果您的代码不保持堆栈八字节对齐,则可使用
PRESERVE8 {FALSE}
确保不设置 PRES8 编译属性。


Note

如果您省略
PRESERVE8

PRESERVE8 {FALSE}
,汇编程序会检查修改 sp 的指令,以决定是否设置 PRES8 编译属性。 ARM 建议明确指定
PRESERVE8

您可以通过以下形式启用警告:

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     {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

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • PIC单片机控制的遥控防盗报警器电路

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 如何构建一个触摸传感器电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章