ARM指令集 資料處理指令

2021-08-18 04:11:09 字數 3973 閱讀 9170

arm彙編指令集

arm彙編檔案的組成

指令:編譯完成後作為一條指令(機器碼)儲存在記憶體單元中,cpu執行時能夠完成處理的操作

偽指令:在編譯時替換成能被識別的arm指令

偽操作:知道編譯器進行編譯,編譯完成後不生成指令,也不占用記憶體空間。

arm彙編指令型別

資料處理指令

跳轉指令:實現程式執行過程中的跳轉

load/store指令:cpu與記憶體資料之間的操作指令

狀態暫存器存送指令:對狀態暫存器操作(只能使用這些指令對狀態暫存器操作)

協處理器指令:對協處理器進行操作

異常產生指令:產生異常(軟中斷),實現模式切換

資料處理指令 mov,add,adds,adc,sub,subs,sbc,rsb,mul,and,orr,eor,bic,cmp,tst,teq,lsl,lsr,asr,rorv

資料處理指令語法

《操作{}> , , 《操作碼》 《目標暫存器rd> 《第一操作暫存器rn> 《第二運算元operand2>

;第乙個位置必須是暫存器,第二運算元可以是暫存器,也可以是立即數

資料傳送指令  mov

mov r1, #0x1  ;

r1 = 0x1    0x1 是立即數

mov r2, r1  ;

r2 = r1

mvn r3, r2  ;

r3 = ~r2

mov r1, 0xffffff00  ;

0xffffff00 不是立即數,只是編譯器在編譯階段對其進行了替換

mvn r1, 0x000000ff  ;

替換的指令

;一條資料傳送指令 mov reg, #n mov reg占用 bit[31:12],bit[11:0]留給立即數使用,因此立即數自包含2^12個

;乙個立即數由 bits[8:0]迴圈右移 2 * bits[11:9]得到。(乙個八位的數迴圈右移偶數次得到)

;立即數的本質是包含於指令中的數,占用指令本身的空間

加法指令 add

;加法指令執行時,若沒有進製 cpsr 'c' 位置 0

mov r0, #1

mov r1, #1

add r2, r1, r0  ;

r2 = r1 + r0

add r2, r1, #2

;r2 = r1 + 2

資料操作對cpsr的影響

;

預設情況下,資料處理指令不影響條件碼標誌位,但可以選擇通過新增「s」來影響標誌位。

mov r1, #0

mov r2, #-1

adds r3, r1, r2 

帶進製的加法指令 adc

;

兩個64位數相加,第乙個64位的低32位放在 r0,高位放到 r1,第二個64位數的低32位放在 r2 高32位放在 r3

;編寫**實現兩個64位數的和,結果的低32位放在 r4 高32位放在 r5

mov r0, #0xfffffffe  ;

第乙個數的低32位

mov r1, #1

;第乙個數的高32位

mov r2, #0x5  ;

第二個數的低32位 

mov r3, #1

;第二個數的高32位

adds r4, r0, r2

adc r5, r1, r3  ;

adc運算的實質是 r5 = r1 + r3 + 'c'  'c'位 cpsr 進製標誌

減法指令 sub

;減法指令執行時,沒有借位時 cpsr 'c' 位置 1

mov r0, #5

mov r1, #3

sub r2, r0, r1  ;

r2 = r0 - r1

帶借位的減法指令 sbc

mov r0, #1

;第乙個數的低32位

mov r1, #3

;第乙個數的高32位

mov r2, #3

;第二個數的低32位

mov r3, #1

;第二個輸的高32位

subs r4, r0, r2  

sbc r5, r1, r3

逆向減法指令 rsb

mov r0, #3

rsb r1, r0, #5;

r1 = 5 - r0

乘法指令 mul

;

為了提高效率,任何乘法指令不可以使用立即數

mov r0, #3

mov r1, #5

mov r2, r0, r1  ;

r2 = r0 * r1

乘——累加指令 mla

mla r3 ,r0, r1, r2  ;

r3 = (r0 * r1) + r2

邏輯與指令 and

mov

r0, #0xf0

movr1, #0x0f

and r2, r0, r1  ;

r2 = r0 & r1

邏輯或指令 orr

mov

r0, #0xf0

movr1, #0x0f

orr r2, r0, r1  

;r2 = r0 | r1

邏輯異或運算指令 eor

mov

r0, #0xf0

movr1, #0x0f

eor r2, r0, r1  

;r2 = r0 ^ r1

位清零指令 bic

mov

r0, #0xff

bic r0, r0, #0xf  

;第二個運算元的每一位為 1 就把第乙個運算元對應的位清零

比較指令 cmp

;

實質是一條減法指令

;沒有目標register,用來比較兩個數是否相等,結果放到 cpsr 的 'z' 位判斷

mov r0, #2

mov r1, #1

cmp r0, r1

位測試指令 tst

;

實質是與運算 常用於用來測試某一位或某幾位是 0 還是 1,結果通過 cpsr 的 'z' 位判斷

tst r0, #0x3

相等測試指令 teq

;

實質是異或運算,測試兩個數是否相等,兩個數相等時異或結果位 0,通過 cpsr 的 'z' 位判斷

teq r0, r1

移位指令 lsl、lsr、asr、ror

;

需要與mov配合,不能夠單獨使用

movr0, #0xff

mov r1, r0, lsl #4

;將 r0 邏輯左移 4 位放入 r1 中

;lsl 邏輯左移:高位移出,低位補零

;lsr 邏輯右移:低位移出,高位補零

;asr 算是右移:低位移出,高位補符號位

;ror 迴圈右移:低位移出,高位補低位移出位

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 ...