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的内容