ARM 開發指令集(未完)

2021-07-25 11:19:39 字數 2884 閱讀 4220

/*******************************str**********************************/

str指令

格式:str  源暫存器,《儲存器位址》

介紹:str指令用於從源暫存器中將乙個32位的字資料傳送到儲存器中。該指令在程式設計中比較常

用,其定址方式靈活多樣,使用方式可參考指令ldr。

作用:從源暫存器中將乙個32位的字資料傳送到儲存器中。

示例:str r0,[r1],#8             ;將r0中的字資料寫入以r1為位址的儲存器中,並將新位址r1+8寫入r1。

str r0,[r1,#8]             ;將r0中的字資料寫入以r1+8為位址的儲存器中。」

/*******************************ldr載入指令**********************************/

ldr載入指令

格式:ldr  目的暫存器,《儲存器位址》

介紹:ldr指令用於從儲存器中將乙個32位的字資料傳送到目的暫存器中。該指令通常用於從儲存器

中讀取32位的字資料到通用暫存器,然後對資料迕行處理。當程式計數器pc作為目的暫存器時,

指令從儲存器中讀取的字資料被當作目的位址,從而可以實現程式流程的跳轉。該指令在程式設

計中比較常用,其定址方式靈活多樣,請讀者認真掌握。

作用:ldr指令用於從儲存器中將乙個32位的字資料傳送到目的暫存器中。

示例:ldr r0,[r1]         ;將儲存器位址為r1的字資料讀入暫存器r0。

ldr r0,[r1,r2]  ;將儲存器位址為r1+r2的字資料讀入暫存器r0。

ldr r0,[r1,#8]   ;將儲存器位址為r1+8的字資料讀入暫存器r0。

ldr r0,[r1,r2]!;將儲存器位址為r1+r2的字資料讀入暫存器r0,幵將新位址r1+r2寫入r1。

ldr r0,[r1,#8]!  ;將儲存器位址為r1+8的字資料讀入暫存器r0,幵將新位址r1+8寫入r1。 

ldr r0,[r1],r2  ;將儲存器位址為r1的字資料讀入暫存器r0,幵將新位址r1+r2寫入r1。

ldr r0,[r1,r2,lsl#2]!  ;將儲存器位址為r1+r2×4的字資料讀入暫存器r0,並將新位址r1+r2×4寫入r1。

ldr r0,[r1],r2,lsl#2  ;將儲存器位址為r1的字資料讀入暫存器r0,幵將新位址r1+r2×4寫入r1。」

補充:arm是risc結構,資料從記憶體到cpu之間的移動只能通過ldr/str指令完成。  

如果想把資料從記憶體中某處讀取到暫存器中,只能使用ldr 

比如: 

ldr r0, 0x12345678 

就是把0x12345678返個位址中的值存放到r0中。

/*******************************ldr載入指令**********************************/

ldr偽指令

格式:ldr rn,=expr

介紹:arm指令集中,ldr通常都是作載入指令的,但是它也可以作偽指令。

舉例:count equ       0x40003100

……ldr       r1,=count

mov      r0,#0

str       r0,[r1]

count是我們定義的乙個變數,位址為0x40003100。這中定義方法在組合語言中是很常見的,如果使用過微控制器的話,應該都熟悉這種用法。

ldr       r1,=count是將count這個變數的位址,也就是0x40003100放到r1中。

mov      r0,#0是將立即數0放到r0中。最後一句str      r0,[r1]是乙個典型的儲存指令,將r0中的值放到以r1中的值為位址的儲存單元去。實際就是將0放到位址為0x40003100的儲存單元中去。可 見這三條指令是為了完成對變數count賦值。用三條指令來完成對乙個變數的賦值,看起來有點不太舒服。這可能跟arm的採用risc有關。

下面還有乙個例子

;將count的值賦給r0

ldr       r1,=count

ldr       r0,[r1]

ldr       r1,=count這條偽指令,是怎樣完成將count的位址賦給r1,有興趣的可以看它編譯後的結果。這條指令實際上會編譯成一條ldr指令和一條dcd偽指令。

/*******************************bic**********************************/

bic指令

格式:bic  目的暫存器,運算元1,運算元2

介紹:bic指令用於清除運算元1的某些位,並把結果放置到目的暫存器中。運算元1應是乙個暫存器,

運算元2可以是乙個暫存器,被移位的暫存器,或乙個立即數。運算元2為32位的掩碼,如果在

掩碼中設定了某一位,則清除返一位。未設定的掩碼位保持不變。

作用:清除某些位。

示例:bic

r0,r0,#0x1f

//0x1f=11111b

其含義:清除r0的bit[4:0]位。

/*******************************orr**********************************/

orr指令

格式:orr  目的暫存器,運算元1,運算元2

介紹:orr指令用用於在兩個運算元上進行邏輯或運算,並把結果放置到目的暫存器中。運算元1應是一

個暫存器,運算元2可以是乙個暫存器,被移位的暫存器,或乙個立即數。

作用:置位某些位。

示例:orr

r0,r0,#0xd3

//0xd3=1101 0111

將r0與0xd3進行或運算,再將結果給r0,即把r0的bit[7:6]和bit[4]和bit[2:0]置為1。

ARM 指令集 比較指令

譯註 cmp 和 cmp 是算術指令,teq 和 tst 是邏輯指令。把它們歸入一類的原因是它們的 s 位總是設定的,就是說,它們總是影響標誌位。compare negative cmn status op 1 op 2 cmn同於cmp,但它允許你與小負值 運算元 2 的取負的值 進行比較,比如難...

ARM指令集 SWP指令

arm指令集 swp指令 swp和swpb是arm指令集中對儲存單元的原子操作,即對儲存單元的一次讀和一次不可被分割。swp和swpb分別完成儲存器和暫存器之間 乙個字 32bit 和乙個位元組 8bit 的資料交換。swp指令主要是完成arm體系架構處理器的同步操作,在linux作業系統中實現訊號...

Arm指令集 偽指令

目錄 arm指令集 跳轉指令 資料處理 程式狀態暫存器傳輸指令 load srote指令 協處理器指令 異常中斷產生指令 gnu arm偽指令 資料定義 彙編控制 其他指令 blx register string abcd efgh hello asciz qwer sun world ascii ...