ARM彙編指令的一些總結 csdeny 百度空間

2021-05-26 10:16:52 字數 1812 閱讀 9051

arm彙編指令的一些總結

arm彙編指令很多,但是真正常用的不是很多,而且需要認真琢磨的又更少了。

比較有用的是mov b bl ldr str

還是通過具體彙編**來學習吧。

@ disable watch dog timer

mov r1, #0x53000000 //立即數定址方式

mov r2, #0x0

str r2, [r1]

mov 沒有什麼好說的,只要掌握幾個定址方式就可以了,而且arm的定址方式比386的簡單很多。立即數定址方式,立即數要求以「#」作字首,對於十六進製制的 數,還要求在#後面加上0x或者&。0x大家很好理解。有一次我碰到了&ff這個數,現在才明白跟0xff是一樣的。

str是比較重要的指令了,跟它對應的是ldr。arm指令集是載入/儲存型的,也就是說它只處理在暫存器中的資料。那麼對於系統儲存器的訪問就經常用到str和ldr了。str是把暫存器上的資料傳輸到指定位址的儲存器上。它的格式我個人認為很特殊:

str(條件) 源暫存器,《儲存器位址》

比如 str r0, [r1] ,意思是r0-> [r1],它把源暫存器寫在前面,跟mov、ldr都相反。

ldr應該是非常常見了。ldr就是把資料從儲存器傳輸到暫存器上。而且有個偽指令也是ldr,因此我有個百思不得其解的問題。看這段**:

mov r1, #gpio_ctl_base

add r1, r1, #ogpio_f

ldr r2,=0x55aa // 0x55aa是個立即數啊,前面加個=幹什麼?

str r2, [r1, #ogpio_con]

mov r2, #0xff

str r2, [r1, #ogpio_up]

mov r2, #0x00

str r2, [r1, #ogpio_dat]

對於當中的ldr 那句,我就不明白了,如果你把=去掉,是不能通過編譯的。我查了一些資料,個人感覺知道了原因:這個=應該表示ldr不是arm指令,而是偽指令。作為偽指令的時候,ldr的格式如下:

ldr 暫存器, =數字常量/label

「mov r2,#0x55aa」也可以啊。應該是這樣的。不過,ldr是偽指令啊,也就是說編譯時編譯器會處理它的。怎麼處理的呢?——規則如下:如果該數字常量 在mov指令範圍內,彙編器會把這個指令作為mov。如果不在mov範圍中,彙編器把該常量放在程式後面,用ldr來讀取,pc和該常量的偏移量不能超過 4kb。

這麼一說,雖然似懂非懂,但是能夠解釋這個語句了。

然後說一下跳轉指令。arm有兩種跳轉方式。

(1) mov pc 《跳轉位址〉

這種向程式計數器pc直接寫跳轉位址,能在4gb連續空間內任意跳轉。

(2)通過 b bl blx bx 可以完成在當前指令向前或者向後32mb的位址空間的跳轉(為什麼是32mb呢?暫存器是32位的,此時的值是24位有符號數,所以32mb)。

b是最簡單的跳轉指令。要注意的是,跳轉指令的實際值不是絕對位址,而是相對位址——是相對當前pc值的乙個偏移量,它的值由彙編器計算得出。

bl非常常用。它在跳轉之前會在暫存器lr(r14)中儲存pc的當前內容。bl的經典用法如下:

bl next ; 跳轉到next

……next

……mov pc, lr ; 從子程式返回。

最 後提一下thumb指令。arm體系結構還支援16位的thumb指令集。thumb指令集是arm指令集的子集,它保留了32位**優勢的同時還大大節 省了儲存空間。由於thumb指令集的長度只有16位,所以它的指令比較多。它和arm各有自己的應用場合。對於系統效能有較高要求,應使用32位儲存系 統和arm指令集;對於系統成本和功耗有較高要求,應使用16位儲存系統和arm指令集。

彙編指令的一些使用

setb setb是 彙編指令 意思是把其後面的那個 暫存器的位置1 mcs 51的 位操作命令。setb et0 開定時 計數器0允許 setb是 彙編指令 意思是把其後面的那個 暫存器的位置1。et0是定時 計數器0的中斷允許位,為1時,微控制器會響應定時 計數器0的溢位中斷 當然,總中斷也必須...

ARM彙編中的LDR指令總結

ldr只能在當前pc的4kb範圍內跳轉 b只能在當前pc的32m範圍內跳轉 label標號實際上就是個位址 eg 合法 ldr r1,r2 ldr r1,r2,0x4 不能超過0xfff,否側編譯不能通過或者linker時有錯 ldr r1,r2,label 所以這個經常是編譯不能通過,因為labe...

ARM彙編中的常用指令總結

資料傳送指令 mov指令 mov rd目標暫存器,operand 常數 可用暫存器 例子 mov r0,10 r0 10 對應c語言形式 mov r0,r1 r0 r1 mvn指令 按位取反指令 mvn r0,0 r0 0 mvn r1,r2 r1 r2 算術指令 add指令 add rn通用暫存器...