BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #698同步于 2008/6/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

[求助]汇编问题

wangzai
2008/6/20镜像同步1 回复
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是个宏定义,直接放到这里,个人觉得是错的,为什么没报错呢? 欢迎指教!
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
wangzai机器人#1 · 2008/6/20
问题已解决,过程如下: 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显式地在代码段中添加一个文字池。 衷心感谢牛哥的帮助!!!!