㈠ ARM指令集的ARM 指令列表
ADC 帶進位的32位數加法 ADD 32位數相加 AND 32位數的邏輯與 B 在32M空間內的相對跳轉指令 BEQ相等則跳轉(Branch if EQual)BNE不相等則跳轉(Branch if Not Equal)BGE大於或等於跳轉(Branch if Greater than or Equa)BGT大於跳轉(Branch if Greater Than)BIC 32位數的邏輯位清零 BKPT 斷點指令 BL 帶鏈接的相對跳轉指令 BLE小於或等於跳轉(Branch if Less than or Equal)BLEQ帶鏈接等於跳轉(Branch with Link if EQual)BLLT帶鏈接小於跳轉(Branch with Link if Less Than)BLT小於跳轉(Branch if Less Than)BLX 帶鏈接的切換跳轉橘盯 BX 切換跳轉 CDP CDP2 協處理器數據處理操作 CLZ 零計數 CMN 比較兩個數的相反數 CMP 32位數比較 EOR 32位邏輯異或 LDC LDC2 從協處理器取一個或多個32位值 LDM 從內存送多個32位字到ARM寄存器 LDR 從虛擬地址取一個單個的32位值 MCR MCR2 MCRR 從寄存器送數據到協處理器 MLA 32位乘累加 MOV 傳送一個32位數到寄存器 MRC MRC2 MRRC 從協處理器傳送數據到寄存器 MRS 把狀態寄存器的值送到通用寄存器 MSR 把通用寄存器的值傳送到狀態寄存器 MUL 32位乘 MVN 把一個32位數的邏輯「非」送到寄穗握存器 ORR 32位邏輯或 PLD 預裝載提示指令 QADD 有符號32位飽和加 QDADD 有符號雙32位飽和加 QSUB 有符號32位飽和減 QDSUB 有符號雙32位飽和減 RSB 逆向32位減法 RSC 帶進位的逆向32法減法 SBC 帶進位的32位減法 SMLAxy 有符號乘累加(16位*16位)+32位=32位 SMLAL 64位有符號乘累加((32位*32位)+64位=64位) SMALxy 64位有符號乘累加((32位*32位)+64位=64位) SMLAWy 號乘累加((32位*16位)>>16位)+32位=32位 SMULL 64位有符號乘累加(32位*32位)=64位 SMULxy 有符號乘(16位*16位=32位) SMULWy 有符號乘(32位*16位>>16位=32位) STC STC2 從協處理器中把一個或多個32位值存到內存 STM 把多個32位的寄存器值存放到內存 STR 把寄存器的圓族和值存到一個內存的虛地址內間 SUB 32位減法 SWI 軟中斷 SWP 把一個字或者一個位元組和一個寄存器值交換 TEQ 等值測試 TST 位測試 UMLAL 64位無符號乘累加((32位*32位)+64位=64位) UMULL 64位無符號乘累加(32位*32位)=64位
㈡ 004.ARM指令之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=R1+8。
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-0XFF范圍內的數經過偶數次右移得到的數,所以MOV用起來比較麻煩,因為有些數不那麼容易看出來是否合法。
LDR 是ARM中的指令,也是偽指令。
當用 LDR r, =imd // r 為寄存器, imd為立即數
LDR 是一條偽指令。編譯器會根據 立即數的大小,決定用 ldr 指令或者是mov或mvn指令。
當imd能用mov或者mvn操作時,就將它翻譯成一條mov或mvn指令。當imd大於mov或mvn能夠操作的數時,編譯器會將imd存在一個內存單元中,然後再用一條ldr指令載入這個內存單元的的值到寄存器中。
LDR r, label 和 LDR r, =label的區別:
LDR r, =label 會把label表示的值載入到寄存器中,而LDR r, label會把label當做地址,把label指向的地址中的值載入到寄存器中。
譬如 label的值是 0x8000, LDR r, =label會將 0x8000載入到寄存器中,而LDR r, label則會將內存0x8000處的值載入到寄存器中。