本文主要是介绍关于 立即数 LDR STR,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。
而我们使用的LDR有两种情况
1.伪指令 LDR R0, =0x12345678 就是把0x12345678这个地址放到R0中,而用MOV不行,因为MOV只能用于寄存器之间的数据传递,或者把立即数传递给寄存器。这个立即数我们下面会讲到
2.数据移动指令,就是内存到寄存器之间的传递,比如 LDR R0, 0x12345678 就是把0x12345678这个地址的内容传递给R0
STR 是把寄存器的内容写回内存也就是某处地址 STR R0 [R1] 就是把R0中的值写到R1中地址处。
立即数,立即数要符合一个8位数循环右移偶数位的取值,原因是,MOV本身就是一条32bit指令,除了指令码本身,它不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值x2),8bit用来表示要移位的一个基数
可以看出,并不是所有数都可以表示成一个8bit数循环右移偶数位的。
有些时候不能用MOV移动的数,可以使用LDR实现。
下面这个程序就是控制ARM gpio的一个例子
.global _start
_start:
LDR R0, =0x56000010 @GPBCON的地址
MOV R1, #0x00000400 @这是个立即数,所以可以使用MOV
STR R1, [R0] @相当于对GPBCON这个寄存器写0x00000400
LDR R0, =0x56000014 @GPBDAT的地址
MOV R1, #0x00000000
STR R1, [R0]
MAIN_LOOP:
B MAIN_LOOP
这篇关于关于 立即数 LDR STR的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!