cmp 位元組 彙編 Arm常用彙編指令

2021-10-14 05:26:29 字數 3454 閱讀 2687

1. 單暫存器載入指令(ldr)

ldr  r0, [r1]      r0

載入字指令:ldr r0, [r1],將記憶體中的乙個字(4個位元組)載入到暫存器r0中

載入位元組指令:ldrb r0, [r1],將記憶體中的乙個位元組載入到暫存器r0中

有符號數載入位元組指令:ldrsb r0, [r1],這條指令與上一條指令的不同之處在於,由於載入的是乙個位元組,而不是乙個字,所以需要確定暫存器r0的高24bit是什麼。對於上一條指令,r0的高24bit補0,而本條指令,r0的高24bit補符號位,也就是補r0的bit7

2. 單暫存器儲存指令(str)

str  r0, [r1]      r0 **********> [r1]   存資料

3. 多暫存器儲存指令(stm)

資料的儲存與讀取:ia、ib、da、db

stmia 完成操作後位址遞增            

stmib 位址先遞增而後完成操作

s***a 完成操作後位址遞減

s***b 位址先遞減再完成操作

用於堆疊操作 fa、ea、fd、ed

stmfa 滿遞增堆疊

stmea 空遞增堆疊

stmfd 滿遞減堆疊

stmed 空遞減堆疊

4. 多暫存器載入指令(ldm)

資料的儲存與讀取:ia、ib、da、db

ldmia  完成操作後位址遞增

ldmib  位址先遞增而後完成操作

ldmda 完成操作後位址遞減

ldmdb 位址先遞減再完成操作

滿堆疊:堆疊指標指向最後壓入棧的有效資料項,每次存入時需要先移動棧指標再存入;取出時先取出,然後再移動棧指標。

s***b   r13!,        r13

壓棧操作,將r12-r10指向的位址對應的記憶體中的內容,存入到r13中,r13每存乙個位址遞減一次。arm棧向下增長

ldmia   r13!,           r13 *****====》r2-r10,pc

出棧操作,將r13指向的位址對應的記憶體的內容存入r2,然後r13位址遞增,再r13遞增後指向的位址對應的記憶體的內容放入r3,以此類推。arm出棧向上增長

使用資料塊傳送指令進行堆疊操作

s***a r0!,     將r5、r6存入相應的r0指向的位址對應的記憶體

ldmib  r0!,      將r0指向的位址對應的記憶體的內容存入r5和r6

使用堆疊指令進行堆疊操作

stmed r13!,  空遞減堆疊,棧指標指向的位置沒有資料,寫入資料後,棧指標向減小的方向移動。

tmia, 比如當前r0指向的記憶體位址是 0x1000,stmia r0!, 就是 首先把r1存入 0x1000,然後r2存入0x1004,然後r3存入0x1008,如果是32位的處理器就是每次加4個位元組,以此類推把 r1-r7按照遞增的位址存入,這個r0!就是從r0的位址開始存的意思。s***b則是位址從r0開始減少,依次儲存

資料的儲存與讀取:ia、ib、da、db

ldmed

ldmfd

ldmea

ldmfa

可以發現:

表1   資料搬運條件助記符

模式說明

模式說明

ia每次傳送後位址加4

fd滿遞減堆疊

ib每次傳送前位址加4

ed空遞減堆疊

da每次傳送後位址減4

fa滿遞增堆疊

db每次傳送前位址減4

ea空遞增堆疊

資料塊傳送操作

堆疊操作

5. 分支指令,共3條:b、bl、bx

特別說明:

b和bl指令,其跳轉範圍限制在當前指令的±32m位元組位址內(arm指令為字對齊,最低2位位址固定為0)。

6. 資料處理指令

movr0, r1:將r1的值賦給r0;

add(sub) r0, r1, r2:將r1的值加上(減去)r2的值,結果存放到r0中;

and(orr, eor) r0, r1, r2:將r1的值與(或、異或)r2的值,結果存放到r0中;

cmpr1, r2:比較r1與r2值的大小;

特別需要說明的問題:

指令cmp r1,r2,其執行細節是:執行r1 - r2的操作,如果結果為負數,則置位cpsr的n位,清零z位;結果為0,則清零cpsr的n位,置位z位;結果為正,則清零cpsr的n位,清零z位。但r1-r2的結果並不儲存。cmp指令通常用於分支跳轉。例如,如下的c程式

int i,j;if (i = = j) else如果使用彙編語句改寫的話,就應該寫為:

使用ldr指令將變數i的值放入r0

使用ldr指令將變數j的值放入r1

cmp r0, r1

addeq r0, r0, #1

使用streq指令將r0的值放入變數i中

beq label

add r1, r1, #1

使用str指令將r1的值放入變數j中

label   其它**

其中addeq, streq, beq這幾條指令,是add, str, b指令的條件執行版本。講到這裡就不得不講解一下什麼是條件執行了。arm指令集的所有指令均支援條件執行,條件執行指的是,指令可以根據自己即將被執行時的情況(cpsr的條件**標誌位)決定自身是否被執行。eq表示如果cpsr的z位為1(對於本程式,實際上就是r0的值與r1的值相等,因為cmp會根據 r0與r1的值設定z位)的情況下,該指令要執行,否則不執行。

其它條件助記符如下:

表2  條件助記符

條件助記符

標誌含義

eqz=1

相等ne

z=0不相等

cs/hs

c=1無符號數大於或等於

cc/lo

c=0無符號數小於

min=1

負數pl

n=0正數或零

vsv=1

溢位vc

v=0沒有溢位

hic=1,z=0

無符號數大於

lsc=0,z=1

無符號數小於或等於

gen=v

有符號數大於或等於

ltn!=v

有符號數小於

gtz=0,n=v

有符號數大於

lez=1,n!=v

有符號數小於或等於

al任何

無條件執行 (指令預設條件)

nv任何

從不執行(不要使用)

ARM常用彙編指令

1 gbll 偽指令用於定義乙個全域性的邏輯變數,並初始化為。gbll bootloader bootloader setl 2 get 或 include get 偽指令用於將乙個原始檔包含到當前的原始檔中,並將被包含的原始檔在當前位置進行彙編處理。可以使用 include 代替 get。incl...

ARM架構常用彙編指令

博主自己的學習筆記,順便分享。不是教科書,有錯誤很正常,請指出,日後會修改。str r0,r1 r1是位址,將r0資料存放到r1指向的位址 str r0,r1,0x10 將r0資料寫入以r1 0x10為位址的儲存器中,r1不變 str r0,r1 0x10 將r0資料寫入以r1 0x10為位址的儲存...

ARM常用彙編指令介紹

b 跳轉指令 跳轉範圍為32mb pc 暫存器r15,程式計數器指向當前執行的程式位址 ldr 從記憶體中讀取資料載入到暫存器中 str 將暫存器中的資料儲存到記憶體 mov 暫存器與暫存器之間的資料傳送指令,也可以將立即數傳給目標暫存器 add 加法指令 sub 減法指令 bic 位清除指令 or...