返回信息流CPU:AT91SAM7S256 (ARM7TDMI)
开发环境:iar4.3
指令集:thumb
部分代码:
#define LED_SIZE (a) * (b)
……
IMPORT ledScan ;a
IMPORT LED_SIZE ;b
IMPORT ledColor ;c
EXPORT ConvertMatrix
RSEG CODE: CODE: NOROOT(2)
CODE16
ConvertMatrix:
PUSH {R0-R7, LR}
LDR R2, =ledScan ;(1)
LDRH R2, [R2, #0]
LSL R2, R2, #5
MOV R3, R2
……
LDR R7, =ledColor ;(2)
LDRH R7, [R7, #0]
……
LDR R7, =LED_SIZE ;(3)
LDR R7, [R7, #0]
目的:
a、c是全局变量,b是宏定义,定义在其它文件中,现在要获取这3个变量的值
编译错误:
Error[400]: Expression out of range D:\temp\ConvertMatrix.asm 12
=>>LDR R2, =ledScan (出错的地方)
问题:
1、为什么只有(1)报错,(2)、(3)没报错呢,把(1)注释掉以后(2)、(3)也没报错?
2、这个错误该怎么修改呢?偶没有查到对该指令有取值范围上的限制。
3、b是个宏定义,直接放到这里,个人觉得是错的,为什么没报错呢?
欢迎指教!
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #698同步于 2008/6/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
[求助]汇编问题
wangzai
2008/6/20镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
问题已解决,过程如下:
LTORG
//LTORG是在此指令出现的地方放一个文本池(literal pool). 在ARM汇编中常用到
ldr r0, =instruction 将地址instruction载入r0
此时编译器将ldr尽可能的转变成mov或mvn指令。 如果转变不成, 将产生一个ldr指令,通过pc相对地址从一块保存常数的内存区读出instruction的值。此内存区既是文本池。一般的, 文本池放在END指令之后的地方。但是, 如果偏移地址大于4k空间, ldr指令会出错(因为ldr的相对偏移地址为12-bit的值). 此时使用LTORG放到会出错的ldr指令附近,以解决此问题。编译器会收集没有分配的ldr的值放到此文本池中。所以必须在LDR指令前后4KB的范围内用LTORG显式地在代码段中添加一个文字池。
衷心感谢牛哥的帮助!!!!