打印
[ZLG-ARM]

请教C代码内嵌汇编地址装载问题!

[复制链接]
1432|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wlsui|  楼主 | 2007-4-25 11:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在我写的C程序中有一小段代码为了获得较高的执行效率,需要内嵌汇编,但不知道怎样才能正确加载C代码定义的变量地址.
比如:
在C代码中有如下定义:
      uint8 ADData[32] = {0};
那在汇编代码中如何将数组ADData的首地址装载入寄存器R1呢?
我试过  LDR   R1,[ADData],但汇编出来的代码却是空语句nop
而用 LDR   R1,=ADData,则会报语法错误

请高手指教!

相关帖子

沙发
zlgARM| | 2007-4-25 22:11 | 只看该作者

吴*穗

把ADData[32]设置为全局变量试试,(否则内嵌汇编部分代码会看不到该变量)。
或者,你在调用内嵌汇编的函数里声明个数组作试验,看内嵌汇编能不能看到它。

赋值的时候,用MOV R1,ADData这样的形式试试。

使用特权

评论回复
板凳
wlsui|  楼主 | 2007-4-26 21:41 | 只看该作者

谢谢!

您是...张工?近来还好吧!
呵呵(应该不会是陈工吧)
您说的那种方法我试过了,但汇编出来的代码也是nop
我现在找出了问题及解决的方法,在赵寒星的《ARM开发工具——ADS原理与应用》第120页:
“嵌入式汇编和armasm之间的区别”一点中:
嵌入汇编器“不支持LDR Rn,=expr伪指令而是使用MOV Rn,expr指令向寄存器赋值;不支持语句标号表达式,不支持ADR和ADRL伪指令”
MOV Rn,expr也就是您说的那种方法,我试过了,不行。
我现在的方法是将uint32 ADData[320]定义为全局变量,然后新建一个汇编文件ADRead.s,在该文件开头使用:
AREA    globals,CODE,READONLY    ; 声明代码段globals,只读属性
    EXPORT    TLC5510_READ    ; 可以被外部引用    
    IMPORT     ADData        ; 声明外部变量
声明就行了。然后在下面写自己的汇编代码。C程序调用时直接写TLC5510_READ().也就是仿照Startup.s和IRQ.s的写法。不过这已经不像是内嵌汇编了.
不知道有没有其它更简单的方法。
这是我在做毕业设计时遇到的问题.我现在想获得高速AD的数据,但又没有FIFO,所以想通过汇编来实现.
现在毕业设计遇到的问题是频率一高什么信号都乱了.20MHz的晶振接入SmartSOPC的带的AD DA PACK时就连输入电源都成20MHz了(泰克所测),用ARM产生5MHz的PWM作为ADC的CLK时就不会出现这种情况.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

263

帖子

1

粉丝