在编译下面一段代码时:
STACK_TOP EQU 0x20002000
AREA Reset,CODE,READONLY
DCD 0x20002000
DCD Start
ENTRY
; CODE16
Start
ldr r2,=Test
LDRD r0,r1,[r2,#4]
LDRD r0,r1,[r2]
LDRD r0,r1,[r2]
; movs r0,r0
; NOP
; align 4
Test
DCD 0x12345678
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
这说明编译器会自动添加两个字节来帮你对齐,数据分布情况和下面很相似:
这说明编译器会自动添加两个字节来帮你对齐,数据分布情况和下面很相似:
STACK_TOP EQU 0x20002000
AREA Reset,CODE,READONLY
DCD 0x20002000
DCD Start
ENTRY
; CODE16
Start
ldr r2,=Test
LDRD r0,r1,[r2,#4]
LDRD r0,r1,[r2]
LDRD r0,r1,[r2]
; movs r0,r0
; NOP
; align 4
Test
dcb 00 ;编译器自动添加
dcb 00 ;编译器自动添加,而movs r0,r0的机器码就是0x0000,会被
;编译器翻译成movs r0,r0,不是当作数据0x0000
DCDU 0x12345678
END
也许看来这样就完美了,但是程序依然会跑飞。原因有两点:
1.即使加了两个字节那么Test的标号地址依然不是四字节对齐。
2.这两个字节的零会被编译器当作指令来处理的,这也就是说Test标号会被编译器来当作代码标号来处理,看到了吧,我们的数据编译器一插手就变成代码了,实在无奈的很。再来看一段手册上的讲解:
也就是实际上LDR r2,=Test执行后,r2=Test+1这也解释了为什么不加NOP或align 4的话r2=0x8000017而加了NOP或Align 4就r2=0x8000018。那么来看一下,加nop或align 4后的效果:
STACK_TOP EQU 0x20002000
AREA Reset,CODE,READONLY
DCD 0x20002000
DCD Start
ENTRY
; CODE16
Start
ldr r2,=Test
LDRD r0,r1,[r2,#4]
LDRD r0,r1,[r2]
LDRD r0,r1,[r2]
; movs r0,r0
; 如果是align 4会被加两个节字的movs r0,r0(机器码为0x0000)
; 如果是nop 则会被加上nop的机器码(0xBF00)
; NOP
align 4
Test
DCDU 0x12345678
END
需要说明的是,我总是把align 和nop 放在一块说,并不是说nop也具有对齐作用。是因为加上nop后刚好可以使Test标号地址放在4字节对齐的其他地方。在其他地方,nop也许并无此作用。
-
-
-
关键字:keil编译 cortex-m3 纯汇编 align地址
引用地址:
关于keil编译cortex-m3纯汇编时为什么问题使用align地址问题
推荐阅读最新更新时间: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行。 查看函数说明可
[单片机]
基于LM3S600的热敏微打技术方案设计
热敏微打凭借噪音低、速度快、可靠性高、打印字符清晰等优点,目前已在POS终端系统、银行系统、移动警务系统、移动政务系统、医疗仪器、汽车计价器、手持设备等领域得到广泛应用,并呈现突增趋势。另外热敏微打正在一些领域逐步替代针式微打,热敏微打市场进一步扩大。 系统结构 热敏微打控制模块(ThermalPrinter-376T)采用美国TI公司的32 ARM微控制器LM3S600(原流明诺瑞公司)作为主控芯片,外加输入电压检测、RS232通讯、字库扩展、打印电压控制、步进电机控制以及热敏打印机芯控制。其中热敏打印机芯控制增加过温保护和缺纸检测使系统更稳定。 方案优势 国内市场现有的热敏微打控制板多采用51单片机设计,
[单片机]
恩智浦出货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,以
[单片机]
售价低至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
[手机便携]