ARM汇编AREA指令疑问及LPC1768数组求最值代码问题
问题解答
1. READWRITE段导致运行异常的原因
LPC1768基于Cortex-M3内核,其内存映射中ROM(程序存储区)和RAM(数据存储区)是物理分离的地址空间。在Keil uVision5中:
- 当数组放在
READWRITE属性段时,链接器会默认将其分配到RAM区域。若汇编代码使用PC相对寻址(比如LDR r1, =array这类伪指令生成的加载操作),PC的寻址范围仅限ROM空间,无法正确访问RAM中未初始化的数组(复位后RAM内容为随机值,且地址偏移计算错误),最终导致r1、r2加载失败,程序执行流程混乱(r0和PC持续递增是错误读取指令后的异常表现)。 - 改为
READONLY属性后,数组会被分配到ROM区域,与代码段同属一个地址空间,PC相对寻址能正确读取数组数据,程序恢复正常运行。
2. 数组放在代码段/同名只读段的合理性
如果你的数组是运行中无需修改的常量数组,这种做法完全合理,甚至是嵌入式开发的常规操作:
- 代码段(
CODE段)本身属于ROM区域,具备只读属性,存放常量数组不会引发任何问题,还能节省宝贵的RAM资源。 - 与代码段同名的只读数据段本质和
READONLY段一致,链接器会将其合并到ROM区域,同样能保证数据的正确访问。
只有当数组需要在运行中修改时,才必须放到READWRITE段(RAM),此时需注意初始化方式(比如用DATA属性配置,确保启动时将ROM中的初始值拷贝到RAM)。
3. 学习资源推荐
LPC1768相关汇编资源
- NXP官方《LPC176x/175x User Manual》:包含芯片内存映射、外设寄存器、Cortex-M3内核在该芯片上的实现细节,是硬件相关汇编编程的核心参考。
- Keil uVision5自带的LPC1768示例工程:在Keil的
Pack Installer中安装LPC1768支持包后,可找到带汇编代码的例程,学习实际项目中的汇编写法。
通用ARM汇编资源
- ARM官方《Cortex-M3 Technical Reference Manual》:详细讲解Cortex-M3的指令集、寄存器架构、寻址方式等核心内容。
- 《ARM体系结构与编程》:经典入门书籍,覆盖ARM汇编基础、指令集、编程模型,适合从0开始学习。
- Keil自带的《ARM Assembler Reference Guide》:在Keil帮助文档中可直接查看,针对Keil汇编器的语法、伪指令、段定义等做了详细说明。
内容的提问来源于stack exchange,提问作者Navaneeth Reddy Nalla
相关产品推荐
相关产品推荐

