關於 立即數 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   

發佈了31 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章