这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 在Keil for ARM的嵌入汇编中引用C变量的方法

共1条 1/1 1 跳转至

在Keil for ARM的嵌入汇编中引用C变量的方法

高工
2008-09-17 14:18:51     打赏

Keil AARM中,LDAV指令可以把一个局部变量或者函数的参数放入一个寄存器中,STAV指令把寄存器内容存入到局部变量。

用法:

1、LDAV

LDAV    Rd, Rn, var

Rd - 要存放变量var内容的寄存器
Rn - 临时使用的寄存器(当变量var放在堆栈中时有可能使用),必须与Rd不同。
var - 变量名

LDAV并非ARM或Thumb指令,而是Keil的嵌入汇编特有的标识符,在编译时会根据情况生成下列3种代码:

(1) 当变量var存放在寄存器Rv中

        MOV     Rd, Rv

(2) 当变量var存放在堆栈,而堆栈在指令的寻址范围内

        LDR     Rd, [R13, #(偏移量)]

(3) 当变量var存放在堆栈,但堆栈在指令的寻址范围外

        LDR     Rn, #(偏移量)      // 借助临时寄存器Rn
        ADD     Rn, R13
        LDR     Rd, [Rn]

2、STAV

STAV    Rd, Rn, var

Rd - 要存放至变量var的寄存器
Rn - 临时使用的寄存器(当变量var放在堆栈中时有可能使用),必须与Rd不同。
var - 变量名

与LDAV类似,编译时会被分为3种情况:

(1) 当变量var存放在寄存器Rv中

        MOV     Rv, Rd

(2) 当变量var存放在堆栈,而堆栈在指令的寻址范围内

        STR     Rd, [R13, #(偏移量)]

(3) 当变量var存放在堆栈,但堆栈在指令的寻址范围外

        LDR     Rn, #(偏移量)      ; 借助临时寄存器Rn
        ADD     Rn, R13
        STR     Rd, [Rn]

注意的是LDAV和STAV不能操作全局变量。要操作全局变量,可以先定义一个局部指针变量指向全局变量再间接操作。例如有全局变量char var_static,则可以先定义局部指针变量

char *p = &var_static;

然后再使用

LDAV    R1, R0, p     ; r1 = var_static的地址
LDRB    R2, [R1]      ; var_static的值放入R2中
......
STRB    R2, [R1]      ; var_static的值置为R2的内容




关键词: 嵌入     汇编     引用     变量     方法     寄存器     堆栈    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]