[ARM] ARM彙編指令
一、LDR 指令 和 MOV的區別
ARM是RISC結構,資料從記憶體到CPU之間的移動只能通過L/S指令來完成,也就是ldr/str指令。 比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr 比如: ldr r0, 0x12345678 就是把0x12345678這個地址中的值存放到r0中。 而mov不能幹這個活,mov只能在暫存器之間移動資料,或者把立即數移動到暫存器中,這個和x86這種CISC架構的晶片區別最大的地方。 x86中沒有ldr這種指令,因為x86的mov指令可以將資料從記憶體中移動到暫存器中。 另外還有一個就是ldr偽指令,雖然ldr偽指令和ARM的ldr指令很像,但是作用不太一樣。ldr偽指令可以在立即數前加上=,以表示把一個地址寫到某暫存器中,比如: ldr r0, =0x12345678 這樣,就把0x12345678這個地址寫到r0中了。所以,ldr偽指令和mov是比較相似的。只不過mov指令限制了立即數的長度為8位,也就是不能超過512。而ldr偽指令沒有這個限制。如果使用ldr偽指令時,後面跟的立即數沒有超過8位,那麼在實際彙編的時候該ldr偽指令是被轉換為mov指令的。 ldr偽指令和ldr指令不是一個同東西
----------------------------------------------------------------------------------------------------------
LDR指令的格式:
LDR{條件} 目的暫存器 <儲存器地址>
作用:將 儲存器地址 所指地址處連續的4個位元組(1個字)的資料傳送到目的暫存器中。
LDR指令的定址方式比較靈活,例項如下:
LDR R0,[R1] ;將儲存器地址為R1的字資料讀入暫存器R0。
LDR R0,[R1,R2] ;將儲存器地址為R1+R2的字資料讀入暫存器R0。
LDR R0,[R1,#8] ;將儲存器地址為R1+8的字資料讀入暫存器R0。
LDR R0,[R1],R2 ;將儲存器地址為R1的字資料讀入暫存器R0,並將R1+R2的值存入R1。
LDR R0,[R1],#8 ;將儲存器地址為R1的字資料讀入暫存器R0,並將R1+8的值存入R1。
LDR R0,[R1,R2]! ;將儲存器地址為R1+R2的字資料讀入暫存器R0,並將R1+R2的值存入R1。
LDR R0,[R1,LSL #3] ;將儲存器地址為R1*8的字資料讀入暫存器R0。
LDR R0,[R1,R2,LSL #2] ;將儲存器地址為R1+R2*4的字資料讀入暫存器R0。
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。
LDR R0,Label ;Label為程式標號,Label必須是當前指令的-4~4KB範圍內。
要注意的是
LDR Rd,[Rn],#0x04 ;這裡Rd不允許是R15。
另外LDRB 的指令格式與LDR相似,只不過它是將儲存器地址中的8位(1個位元組)讀到目的暫存器中。
LDRH的指令格式也與LDR相似,它是將記憶體中的16位(半字)讀到目的暫存器中。
LDR R0,=0xff
這裡的LDR不是arm指令,而是偽指令。這個時候與MOVE很相似,只不過MOV指令後的立即數是有限制的。這個立即數必須是0X00-OXFF範圍內的數經過偶數次右移得到的數,所以MOV用起來比較麻煩,因為有些數不那麼容易看出來是否合法。
二、STR指令
STR指令的格式為:
STR{條件} 源暫存器,<儲存器地址>
STR指令用亍從源暫存器中將一個32位的字資料傳送到儲存器中。該指令在程式設計中比較常
用,丏定址方式靈活多樣,使用方式可參考指令LDR。
指令示例:
STR R0,[R1],#8 ;將R0中的字資料寫入以R1為地址的儲存器中,並將新地址R1+8寫入R1。
STR R0,[R1,#8] ;將R0中的字資料寫入以R1+8為地址的儲存器中。”
str r1, [r0] ;將r1暫存器的值,傳送到地址值為r0的(儲存器)記憶體中
三、MOV
MOV PC LR ;返回主程式
相關文章
- ARM彙編指令集彙總
- ARM-GUN彙編簡介
- 4. ARM彙編定址模式-2模式
- iOS彙編入門教程(一)ARM64彙編基礎iOS
- ARM彙編解決階乘以及大小寫轉換
- ARM 之主流編譯器編譯
- Android NDK之使用 arm-v7a 彙編實現兩數之和Android
- arm uart
- Tinyx 交叉編譯配置檔案(arm版)編譯
- 我竟在arm彙編除法演算法裡找到了leetcode某道題的解法演算法LeetCode
- linux彙編指令Linux
- ARM架構架構
- ARM 詳解
- ARM彙編和C語言混合程式設計中陣列的陣列的操作C語言程式設計陣列
- 交叉編譯場景分析(arm-linux)--序編譯Linux
- openEuler arm 環境原始碼編譯mysql 8.0.37原始碼編譯MySql
- 彙編指令(待完善)
- 彙編跳轉指令
- 彙編---移位指令
- Arm64架構下靜態編譯Nginx架構編譯Nginx
- Arm64架構下編譯便攜Python架構編譯Python
- Arm pwn學習
- 交叉編譯場景分析(arm-linux)(四)--編譯readline和ncurses編譯Linux
- ARM晶片、核心、架構、指令集的聯絡與區別晶片架構
- 視訊更新:程式碼分析8之單步除錯ARM64啟動彙編與重定位除錯
- mplayer 移植到 arm 心得
- Arch Linux ARM相關Linux
- arm相關學習
- ARM財報:2021年ARM營收27億美元 同比增長35%營收
- 8086彙編指令快速參考
- 彙編--串傳送指令 MOVS
- Go ARM64 Base64編碼優化小記Go優化
- 如何正確選擇ARM核心板、ARM工控板的儲存型別?型別
- iOS arm 64 的瞭解iOS
- Chrome移植Win10 on ARMChromeWin10
- ARM常用的22個概念!
- ARM 匯流排協議協議
- 嵌入式--ARM架構架構
- ARM SMMU中 SteamTable的作用