ARM匯編指令的一些總結
比較有用的是MOV
還是通過(guò)具體匯編代碼來(lái)學(xué)習吧。
MOV沒(méi)有什么好說(shuō)的,只要掌握幾個(gè)尋址方式就可以了,而且ARM的尋址方式比386的簡(jiǎn)單很多。立即數尋址方式,立即數要求以“#”作前綴,對于十六進(jìn)制的數,還要求在#后面加上0x或者&。0x大家很好理解。有一次我碰到了&ff這個(gè)數,現在才明白跟0xff是一樣的。
STR是比較重要的指令了,跟它對應的是LDR。ARM指令集是加載/
比如STR R0, [R1],意思是R0-> [R1],它把源寄存器寫(xiě)在前面,跟MOV、LDR都相反。
LDR應該是非常常見(jiàn)了。LDR就是把數據從存儲器傳輸到寄存器上。而且有個(gè)偽指令也是LDR,因此我有個(gè)百思不得其解的問(wèn)題??催@段代碼:
movr1, #GPIO_CTL_BASE
對于當中的ldr那句,我就不明白了,如果你把=去掉,是不能通過(guò)編譯的。我查了一些資料,個(gè)人感覺(jué)知道了原因:這個(gè)=應該表示LDR不是ARM指令,而是偽指令。作為偽指令的時(shí)候,LDR的格式如下:
它的作用是把一個(gè)32位的地址或者常量調入寄存器。嗬嗬,那大家可能會(huì )問(wèn),
“MOV r2,#0x55aa”也可以啊。應該是這樣的。不過(guò),LDR是偽指令啊,也就是說(shuō)編譯時(shí)編譯器會(huì )處理它的。怎么處理的呢?——規則如下:如果該數字常量在MOV指令范圍內,匯編器會(huì )把這個(gè)指令作為MOV。如果不在MOV范圍中,匯編器把該常量放在程序后面,用LDR來(lái)讀取,PC和該常量的偏移量不能超過(guò)4KB。
這么一說(shuō),雖然似懂非懂,但是能夠解釋這個(gè)語(yǔ)句了。
然后說(shuō)一下跳轉指令。ARM有兩種跳轉方式。
(1)mov pc <跳轉地址〉
(2)通過(guò)B
B是最簡(jiǎn)單的跳轉指令。要注意的是,跳轉指令的實(shí)際值不是絕對地址,而是相對地址——是相對當前PC值的一個(gè)偏移量,它的值由匯編器計算得出。
BL非常常用。它在跳轉之前會(huì )在寄存器LR(R14)中保存PC的當前內容。BL的經(jīng)典用法如下:
最后提一下Thumb指令。ARM體系結構還支持16位的Thumb指令集。Thumb指令集是ARM指令集的子集,它保留了32位代碼優(yōu)勢的同時(shí)還大大節省了存儲空間。由于Thumb指令集的長(cháng)度只有16位,所以它的指令比較多。它和ARM各有自己的應用場(chǎng)合。對于系統性能有較高要求,應使用32位存儲系統和ARM指令集;對于系統成本和功耗有較高要求,應使用16位存儲系統和ARM指令集。
評論