ARM彙編學習筆記三

2021-10-19 08:25:14 字數 2842 閱讀 3859

常規

ldr r2,[r5] ;將r5為位址的儲存單元中的資料載入到r2中。

str r1,[r0,#0x04] ;將r1中的內容存放在以 r0 + 0x04 的記憶體位址單元中。

傳送指令型別:

ldrb r3,[r2],#1 ;以r2為位址讀取乙個位元組資料到r3中。r2更新 r2 = r2 + 1

strh r1,[r0,#2]! ;半字送達,傳送r1中低兩位元組資料至r0+2為位址的儲存單元,r0更新。

多暫存器補充:

在非使用者或系統模式下,可出現"^"字尾,若ldm指令暫存器列表包含pc,則會額外將spsr拷貝給cpsr。

例:

mov r1,r0 ;將r0的資料放進r1中;

mov r1,r0,lsl #3

;將r0的數值乘8賦值給r1;

mvn r0,#0;將立即數0取反傳賦值給r0;

例1:64為整數加法

r0/r1與r2/r3分別放兩個加數的低/高32位,r4/r5存放結果的低/高32位

adds r4,r0,r2 ;帶s字尾結果會影響cpsr中的標誌位c,如果不帶s那麼計算中的進製會被省略導致最終的結果發生錯誤。  

adc r5,r1,r3;帶進製的加法,c標誌位參與運算。

例2:64為整數減法

subs r4,r0,r2 

sbc r5,r1,r3

例3:逆向減法

rsb r0,r1,r2 ;r0 = r2 - r1。

rsc r0,r1,r2 ;r0 = r2 - r1 - c標誌位的反碼。

例4:邏輯運算

and r0,r0,#3

;保持r0的0位和1位,其餘清0。

orr r0,r0,#3

;置位r0的0位和1位, 其餘不變。

eor r0,r0,#3

;反轉r0的0位和1位,其餘不變。

bic r0,r0,#3

;清0 r0的0位和1位,其餘不變。

例5:比較指令

cmp r1,r0 ;r1 - r0,結果影響cpsr中的標誌位,但是不保留運算的結果。

cmn r0,#1

;判斷r0的數值是否是1的補碼,如果是則z置位。

例6:測試指令

tst r1,#3

;按位與,結果影響cpsr中的標誌位。

teq r1,r2 ;按位或,結果影響cpsr中的標誌位。

例7:乘法指令

mul:32位乘法。

mla:3位運算元,將運算元1與運算元2相乘,結果加第三個操作書,存入目的暫存器。

mal rd,rm,rs,rn ;rd = rm * rs + rn。
規則:rd和rm不能是用一暫存器;

形成兩個向量的標誌量積例程:

mov r11 ,#20

;計數即代表向量維度

mov r10,#0

;初始化結果暫存器

loop:

ldr r0,

[r8]

,#4;讀取向量1指標

ldr r1,

[r9]

,#4;讀去向量2指標

mal r10,r0,r1,r10

subs r11,r1,r10

bne loop

含義:跳轉指令用於控制程式的走向,可以完成從當前指令向前或向後4位元組的位址空間跳轉,包括基本跳轉指令,帶返回跳轉指令bl,帶狀態切換(arm與thumb之間)的跳轉指令bx,帶返回和狀態切換的跳轉指令blx

例:

bl label  ;程式無條件挑戰到label處執行

;同時將pc數值存放到r14中

mov lr,pc

b label ;利用b指令也可以完成上面的操作

此外還有不受範圍限制的跳轉指令:

ldr pc,

=label

cpsr[31:24]: _f(標誌域)

cpsr[23:16]: _s(狀態域)

cpsr[15:08]: _x(擴充套件域)

cpsr[07:00]: _c(控制域)

例:

清cpsr標誌位

msr r0,cpsr ;將cpsr的數值賦值給r0;msr指令用於cpsr賦值給暫存器

bic r0,r0,#0xf0000000

;清高四位

msr cpsr_f,r0 ;將r0的數值賦給cpsr,因為帶了標誌域,則指令只會修改31

-24其他自動遮蔽

-----繾綣

arm 彙編學習

一 暫存器和定址 arm有16個暫存器,r0 r15 pc r15 lr r14 sp r13 ip r12 push sp減少,pop sp增加 1.定址方式 從操作位址尋找運算元的方式 2.arm的定址方式 a 暫存器定址,運算元在暫存器中 b 立即定址,運算元就在指令中 subs r0,r0,...

ARM彙編學習

前言 任何彙編行都是如下結構 comment 注釋 gnu arm 彙編中,任何以冒號結尾的都被認為是乙個標籤,而不一定非要在一行的開始。下面是乙個簡單的例子,這段匯程式設計序定義了乙個 add 的函式,該函式返回兩個引數的和 section text,x global add give the s...

ARM彙編學習

前言 任何彙編行都是如下結構 comment 注釋 gnu arm 彙編中,任何以冒號結尾的都被認為是乙個標籤,而不一定非要在一行的開始。下面是乙個簡單的例子,這段匯程式設計序定義了乙個 add 的函式,該函式返回兩個引數的和 section text,x global add give the s...