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