打印
[嵌入式Linux]

关于ldr 伪指令

[复制链接]
1393|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maowa_2005|  楼主 | 2014-6-4 11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
arm 的伪指令 ldr
先上例子
COUNT EQU       0x40003100
……
LDR       R1,=COUNT
如果定义一个宏的话,我知道执行完此指令后r1 寄存器的值就是0x40003100
现在遇到一个问题,我想在C语言中插入这条汇编指令,大致的代码如下
{
  int COUNT=100;
  __ASM__("ldr r8,=COUNT");
}
但好像会有问题,请教大神,这样写可以不,如果想在c语言中实现这个功能的话,应该如何写

相关帖子

沙发
dirtwillfly| | 2014-6-4 17:43 | 只看该作者
不懂汇编,帮顶

使用特权

评论回复
板凳
airwill| | 2014-6-4 20:42 | 只看该作者
在 Keil MDK 里, 可以
    __asm
    {
        MOV r8, COUNT
        LDR  R0, [R8, #0]
    }

不同的编译器, 写法是不同的. 另外, 内嵌汇编并不支持 Thumb 指令, 在 Cortex Mx 里就不能使用. 而只能使用 嵌入式汇编器.

使用特权

评论回复
地板
maowa_2005|  楼主 | 2014-6-4 21:20 | 只看该作者
airwill 发表于 2014-6-4 20:42
在 Keil MDK 里, 可以
    __asm
    {

现在我的count是个大于256的32位数啊,这应该怎么办啊

使用特权

评论回复
5
江陵龙少| | 2014-6-5 10:01 | 只看该作者
本帖最后由 江陵龙少 于 2014-6-5 10:02 编辑

关于楼主的问题:1、COUNT是一个变量,获取它的地址,使用LDR R2, =COUNT。然后,获取变量的值,使用 LDR R1,[R2]。这时,COUNT的值可取32位内的任何值。2,使用MOV R1,#立即数 的形式,要求立即数必须是2的n次方,不以是否大于256为限制。3、C语言下的写法那就更简单了。 希望对楼主有用。

使用特权

评论回复
6
maowa_2005|  楼主 | 2014-6-5 12:01 | 只看该作者
江陵龙少 发表于 2014-6-5 10:01
关于楼主的问题:1、COUNT是一个变量,获取它的地址,使用LDR R2, =COUNT。然后,获取变量的值,使用 LDR R ...

高手,LDR R2, =COUNT这个是用来获取COUNT这个变量的值还是地址?高手能否再详细解释下
还有,这种写法的话好像count如果声明是个局部变量的话,在ARM-GCC编译环境下会报错,但是换成全局变量的话好像就可以了,不知道你有没有遇到过这样的问题

使用特权

评论回复
7
江陵龙少| | 2014-6-5 13:01 | 只看该作者
1、地址。2、局部变量如果在堆栈中,并且在其生命周期内,应该不会报错,因为它肯定有地址。如果局部变量在通用寄存器中,肯定报错。

使用特权

评论回复
8
江陵龙少| | 2014-6-5 13:08 | 只看该作者
本帖最后由 江陵龙少 于 2014-6-5 13:09 编辑

对于ARM7,寄存器R0~R3用作参数传递,R4~R11用作局部变量,当局部变量较多,多得寄存器放不下时,才会放在堆栈中,所以,一般下,局部变量放于寄存器中,当然就没有地址了,有的是寄存器编号。楼主可以看看汇编,看放在哪里

使用特权

评论回复
9
maowa_2005|  楼主 | 2014-6-5 16:55 | 只看该作者
江陵龙少 发表于 2014-6-5 13:08
对于ARM7,寄存器R0~R3用作参数传递,R4~R11用作局部变量,当局部变量较多,多得寄存器放不下时,才会放在 ...

多谢,了然许多

使用特权

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

本版积分规则

26

主题

76

帖子

2

粉丝