原文:
arm指令的編碼格式
實際指令語法格式為:
addeqs r0,r1,r2;
該指令的編碼格式為:
arm指令的助記符
arm指令在匯程式設計序中用助記符表示,一般arm指令的助記符格式為:
{} ,,
其中:
操作碼,如add表示算術加操作指令;
{} 決定指令執行的條件域;
決定指令執行是否影響cpsr暫存器的值;
目的暫存器;
第乙個運算元,為暫存器;
第二個運算元。
例如,指令 addeqs r1,r2,#5
條件域
幾乎所有的arm指令都可以根據當前程式狀態暫存器cpsr中標誌位的值,有條件地執行。
arm指令的條件域有16種型別。
arm指令中的第二運算元
靈活的使用第2個運算元「operand2」能夠提高**效率。它有如下的形式:
#immed_8r——常數表示式;
rm——暫存器方式;
rm,shift——暫存器移位方式
arm指令中的第二運算元
如果乙個32位立即數直接用在32位指令編碼中,就有可能完全佔據32位指令編碼空間。因此,arm指令的32位立即數是通過迴圈右移偶數字得到的。
立即數是由乙個8位的常數迴圈右移位偶數字得到的。
=immed_8迴圈右移(2×rotate_imm)
例如:下面的**段:
mov r0, #0x0000f200
mov r1, #0x00110000
mov r4, #0x00012800
上面的指令經過彙編之後得到的二進位制編碼為:
8000:e3a00cf2 (0xf200是由0xf2迴圈右移24位得到的)
8004:e3a01811(0x110000是由0x11迴圈右移16位得到的)
8008: e3a04b4a(0x12800是由0下4a迴圈右移24位得到的)
非法的立即數:0x1010,0x00102,0xff1000
定址方式
9種:
立即數定址
暫存器定址
暫存器移位定址
暫存器間接定址
基址變址定址
相對定址
多暫存器定址
塊拷貝定址
堆疊定址
立即數定址
在立即數定址中,運算元本身直接在指令中給出,取出指令也就獲得了運算元,這個運算元也稱為立即數。
#後接0x或&表示十六進製制數,0b表示二進位制數,0d或缺省表示十進位制數。
例: add r0,r1,#5; r0=r1+5
mov r0,#0x55; r0=0x55
其中:運算元5,0x55就是立即數,立即數在指令中要以「#」為字首,後面跟實際數值。
暫存器定址
在暫存器定址方式下,暫存器的值即為運算元。arm指令普遍採用此種定址方式。
例: add r0,r1,r2 ; r0=r1+r2
mov r0,r1 ; r0=r1
暫存器移位定址
暫存器移位定址的運算元由暫存器的數值做相應移位而得到。
移位的方式在指令中以助記符的形式給出,而移位的位數可用立即數或暫存器定址方式表示。
例: add r0,r1,r2,ror #5
;r0=r1+r2迴圈右移5位
mov r0,r1,lsl r3
;r0=r1邏輯左移r3位
移位操作在arm指令集中不作為單獨的指令使用,arm指令集共有5種位移操作。
arm指令集的5種位移操作
lsl邏輯左移 :rx,lsl
lsr邏輯右移 : rx,lsr
asr算術右移 :rx,asr
ror迴圈右移 :rx,ror
rrx帶擴充套件的迴圈右移:rx,rrx
暫存器間接定址
暫存器中的值為運算元的實體地址,而實際的運算元存放在儲存器中。
例: str r0,[r1] ; [r1]=r0
ldr r0,[r1] ; r0=[r1]
基址變址定址
將暫存器(稱為基址暫存器)的值與指令中給出的偏移位址量相加,所得結果作為運算元的實體地址。
例: ldr r0,[r1,#5] ; r0=[r1+5]
ldr r0,[r1,r2] ; r0=[r1+r2]
相對定址
相對定址同基址變址定址相似,區別只是將程式計數器pc作為基址暫存器,指令中的標記作為位址偏移量。
例: beq process1
…… process1
……多暫存器定址
在多暫存器定址方式中,一條指令可實現一組暫存器值的傳送。
連續的暫存器間用「-」連線,否則用「,」分隔。
例: ldmia r0,
;r1=[r0],r2=[r0+4],r3=[r0+8]
;r4=[r0+12],r5=[r0+16]
指令中ia表示在執行完一次load操作後,r0自增4。該指令將以r0為起始位址的5個字資料分別裝入r1,r2,r3,r4,r5中。
多暫存器定址
多暫存器定址一次可傳送幾個暫存器值,允許一條指令傳送16個暫存器的任何子集或所有暫存器。多暫存器定址指令舉例如下:
塊拷貝定址
塊拷貝定址可實現連續位址資料從儲存器的某一位置拷貝到另一位置。
例: ldmia r0,;
stmia r1,;
第一條指令從以r0的值為起始位址的儲存單元中取出5個字的資料,第二條指令將取出的資料存入以r1的值為起始位址的儲存單元中。
實際上是多暫存器定址的組合。
堆疊定址
堆疊定址用於資料棧與暫存器組之間批量資料傳輸。
當資料寫入和讀出記憶體的順序不同時,使用堆疊定址可以很好的解決這問題。
例: stmfd r13!,;
ldmfd r13!,
第一條指令,將r0-r4中的資料壓入堆疊,r13為堆疊指標;
第二條指令,將資料出棧,恢復r0-r4原先的值。
儲存器堆疊可分為兩種:
向上生長:向高位址方向生長,稱為遞增堆疊
向下生長:向低位址方向生長,稱為遞減堆疊
ARM指令定址方式
先看一下arm的各種定址方式,然後開始講一下指令的分類和基本的格式,接著看一下指令中必不可少的條件碼,最後看一下各類指令的操作碼!有些arm指令可能記錄的不是很詳細,可以檢視第七次課的培訓文件中的 命令幫助文件 一 arm定址方式 1 立即定址 立即定址也叫立即數定址,這是一種特殊的定址方式,運算元...
ARM指令集之定址方式
arm7 處理器有兩個指令集 32位的 arm指令集,16位的 thumb 指令集。1 arm指令集 效率高,密度高 2 thumb 指令集 具有較高的 密度。注 1.所有的arm 指令集都是有條件執行的,而 thumb 指令集僅有一條指令具備條件執行功能。2.arm程式和 thumb 程式可相互呼...
ARM彙編指令學習之定址方式
arm處理器共有9中定址方式 1.暫存器定址 運算元的值在暫存器中,指令執行時直接取出暫存器的值來操作 mov r1,r2 r2 r1 sub r0,r1,r2 r1 r2 r0 2.立即定址 mov r0,0xff00 0xff00 r0 subs r0,r0,1 r0 1 r0 3.暫存器移位定...