关于keil编译cortex-m3纯汇编时为什么问题使用align地址问题

发布者:脑洞飞扬最新更新时间:2017-01-22 来源: eefocus关键字:keil编译  cortex-m3  纯汇编  align地址 手机看文章 扫描二维码
随时随地手机看文章

  在编译下面一段代码时:

  1. STACK_TOP   EQU 0x20002000  

  2.     AREA    Reset,CODE,READONLY  

  3.     DCD 0x20002000  

  4.     DCD Start  

  5.     ENTRY  

  6. ;   CODE16   

  7.   

  8. Start  

  9.     ldr r2,=Test  

  10.     LDRD r0,r1,[r2,#4]  

  11.     LDRD r0,r1,[r2]  

  12.     LDRD r0,r1,[r2]  

  13. ;   movs    r0,r0  

  14. ;   NOP  

  15. ;   align 4  

  16. Test  

  17.     DCD 0x12345678  

  18.     END  

我发现,如果加上NOP或align4,程序就不会跑飞,否则程序就跑飞了。

  经调试发现:    如果不加NOP或align 4的话产生的Test的标号地址就会产生错误,而LDRD 指令操作的地址必须是4字节对节的,如果使用的地址不是四字节对齐,那么程序就会产生异常,所以程序就跑飞了。  那么为什么不加NOP或align 4的话Test标号地址就会产生错误呢?  来看一段手册上的话:
也就是说DCD是需要标号地址按字对齐的,如果你没有对齐就可以看到如下的编译警告:test.asm(18): warning: A1581W: Added 2 bytes of padding at address 0x1a
这说明编译器会自动添加两个字节来帮你对齐,数据分布情况和下面很相似:

这说明编译器会自动添加两个字节来帮你对齐,数据分布情况和下面很相似:

  1. STACK_TOP   EQU 0x20002000  

  2.     AREA    Reset,CODE,READONLY  

  3.     DCD 0x20002000  

  4.     DCD Start  

  5.     ENTRY  

  6. ;   CODE16   

  7.   

  8. Start  

  9.     ldr r2,=Test  

  10.     LDRD r0,r1,[r2,#4]  

  11.     LDRD r0,r1,[r2]  

  12.     LDRD r0,r1,[r2]  

  13. ;   movs    r0,r0  

  14. ;   NOP  

  15. ;   align 4  

  16. Test  

  17.     dcb 00      ;编译器自动添加  

  18.     dcb 00      ;编译器自动添加,而movs  r0,r0的机器码就是0x0000,会被      

  19.                 ;编译器翻译成movs r0,r0,不是当作数据0x0000  

  20.     DCDU    0x12345678  

  21.     END  

也许看来这样就完美了,但是程序依然会跑飞。原因有两点:
 1.即使加了两个字节那么Test的标号地址依然不是四字节对齐。

 2.这两个字节的零会被编译器当作指令来处理的,这也就是说Test标号会被编译器来当作代码标号来处理,看到了吧,我们的数据编译器一插手就变成代码了,实在无奈的很。再来看一段手册上的讲解:

                      

也就是实际上LDR r2,=Test执行后,r2=Test+1这也解释了为什么不加NOP或align 4的话r2=0x8000017而加了NOP或Align 4就r2=0x8000018。那么来看一下,加nop或align 4后的效果:

  1. STACK_TOP   EQU 0x20002000  

  2.     AREA    Reset,CODE,READONLY  

  3.     DCD 0x20002000  

  4.     DCD Start  

  5.     ENTRY  

  6. ;   CODE16   

  7.   

  8. Start  

  9.     ldr r2,=Test  

  10.     LDRD r0,r1,[r2,#4]  

  11.     LDRD r0,r1,[r2]  

  12.     LDRD r0,r1,[r2]  

  13. ;   movs    r0,r0  

  14.     ; 如果是align 4会被加两个节字的movs r0,r0(机器码为0x0000)  

  15.     ; 如果是nop 则会被加上nop的机器码(0xBF00)  

  16.   

  17. ;   NOP  

  18.   

  19.     align 4  

  20. Test  

  21.     DCDU    0x12345678  

  22.     END  

需要说明的是,我总是把align 和nop 放在一块说,并不是说nop也具有对齐作用。是因为加上nop后刚好可以使Test标号地址放在4字节对齐的其他地方。在其他地方,nop也许并无此作用。

  1.   

  2.   

  3.   



关键字:keil编译  cortex-m3  纯汇编  align地址 引用地址:关于keil编译cortex-m3纯汇编时为什么问题使用align地址问题

上一篇:corte-m3中的pc值的问题
下一篇:LPC43xx系列使用IAP的注意事项

推荐阅读最新更新时间:2024-03-16 15:32

意法半导体在IIC上展示可持续发展技术
中国深圳,2011年2月23日 —— 全球领先半导体生产商之一意法半导体(STMicroelectronics,简称ST)以“满足地球与人类的需求”为主题,参展2月24日至26日在深圳举办的第十六届中国国际集成电路研讨会暨展览会(IIC China 2011)。意法半导体坚持一贯的创新承诺,将展示最新的先进半导体技术和芯片产品,满足终端用户对更高性能产品和服务日益增长的需求,应对越来越艰巨的世界环境挑战。 “中国是世界上最大的增长最快的发展中国家,可持续发展问题在中国变得越来越突出。”意法半导体执行副总裁兼大中华与南亚区总裁纪衡华(Francois Guibert)表示,“意法半导体坚信:满足地球和人类需求必须遵守可持续
[半导体设计/制造]
STM32(Cortex-M3)中的中断优先级概念
STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中
[单片机]
Keil编译警告:function "assert_param" declared implicitly的解决方法
1 问题描述 新建STM32的keil工程,在编译时出现警告“..FWLIBsrcstm32f10x_rcc.c(273): warning: #223-D: function “assert_param” declared implicitly”,接下来一堆警告和错误。 出错的原因:函数“assert_param”未声明。assert_param 2 问题分析 函数assert_param是STM32官方库文件中用到的。 对于我采用的《STM32F10x_StdPeriph_Lib_V3.5.0》库文件来说,assert_param函数在文件“stm32f10x_conf.h”的第59-73行。 查看函数说明可
[单片机]
<font color='red'>Keil</font><font color='red'>编译</font>警告:function
基于LM3S600的热敏微打技术方案设计
热敏微打凭借噪音低、速度快、可靠性高、打印字符清晰等优点,目前已在POS终端系统、银行系统、移动警务系统、移动政务系统、医疗仪器、汽车计价器、手持设备等领域得到广泛应用,并呈现突增趋势。另外热敏微打正在一些领域逐步替代针式微打,热敏微打市场进一步扩大。 系统结构 热敏微打控制模块(ThermalPrinter-376T)采用美国TI公司的32 ARM微控制器LM3S600(原流明诺瑞公司)作为主控芯片,外加输入电压检测、RS232通讯、字库扩展、打印电压控制、步进电机控制以及热敏打印机芯控制。其中热敏打印机芯控制增加过温保护和缺纸检测使系统更稳定。 方案优势 国内市场现有的热敏微打控制板多采用51单片机设计,
[单片机]
基于LM3S600的热敏微打技术方案设计
恩智浦出货ARM Cortex-M4及Cortex-M3微控制器
   恩智浦半导体NXP Semiconductors N.V.近日发布LPC4300数字信号控制器(DSC),这是迄今为止业内速度最快的ARM® Cortex™-M4微控制器,其速度高达204MHz。另外,LPC4300也是业界首个带有Cortex-M0协处理器的双核非对称架构DSC。恩智浦还同时宣布将LPC1800系列的性能提升到180MHz,使之成为目前世界上最快的基于Cortex-M3的微处理器。LPC4300和LPC1800系列同步开发,并且共同采用90纳米超低漏电流技术制造,实现引脚兼容和软件兼容,有许多相同的重要功能。    恩智浦半导体微控制器全球产品市场经理Gordon Cooper表示,“LPC4300不同
[工业控制]
keil编译中所有编译的错误信息
1. c not an argument in function sum 该标识符不是函数的参数 2.array bounds missing ] in function main 缺少数组界限符 ] 3.Array size too large in function main 数组规模太大 4.bad file name format in include directive 在包含指令中的文件名格式不正确. 5.Call of non-function in function main 调用未经过定义的函数. 6.cannot modify a const object in function main 对常量不
[单片机]
Cortex-M3 (NXP LPC1788)之UART用法
在工作中经常将平台的串口和PC机连接,通过串口打印信息进行程序调试。LPC1788共有5个串口Uart0~Uart4,跟具开发板的资源,将使用Uart2进行简单的串口输出和输入中断的操作。开发板上使用74HC4052多路开关对UART2的RXD和TXD进行选择,使用SP3243E进行3.0V到5.5V的RS-232电平转换。查看手册配置好相关的跳线帽,保证DB口上的串口输出采用的是Uart2。 下面介绍Uart相关系统配置和Uart模块的配置。Uart的时钟采用PCLK,我们配置系统的CCLK为120M,PCLK为60M,后面设置串口的波特率就采用PLCK进行计算。要使用串口2的功能需要使能系统时钟控制PCONP,以
[单片机]
<font color='red'>Cortex-M3</font> (NXP LPC1788)之UART用法
售价低至30美分:兆易创新推出超值型Cortex-M3 MCU
   售价低至30美分:兆易创新推出20pin封装的GD32F130Fx系列超值型Cortex-M3 MCU   GigaDevice全新的GD32F130Fx系列TSSOP20封装超值型MCU批量售价低至30美分,持续以最优价格释放Cortex-M3主流内核的卓越动力,并为成本敏感应用带来更高效能。   集微网消息,2016年5月5日 —日前,业界领先的存储器和控制器供应商兆易创新(GigaDevice)宣布推出GD32微控制器家族的新成员,20引脚的GD32F130Fx系列超值型Cortex-M3 MCU。新产品在支持超低开发预算需求的基础上持续释放Cortex-M3内核的卓越动力,并为提升及取代传统的8位和16
[手机便携]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved