條件碼:
code suffix flags meaning
0000 eq z set equal (= =)
0001 ne z clear not equal (! =)
0010 cs/hs c set unsigned higher or same (>=) unsigned
0011 cc/lo c clear unsigned lower (<) unsigned
0100 mi n set negative
0101 pl n clear positive or zero
0110 vs v set overflow
0111 vc v clear no overflow
1000 hi c set and z clear unsigned higher (>) unsigned
1001 ls c clear or z set unsigned lower or same (<=) unsigned
1010 ge n equals v greater or equal (>=) signed
1011 lt n not equal to v less than (<) signed
1100 gt z clear & (n ==v) greater than (>) signed
1101 le z set | (n != v) less than or equal (<=) signed
1110 al (ignored) always this suffix is normally omitted.
lr 儲存返回pc位址
指令+s 則會影響cpsr
b 類似 goto fun # pc = fun
bl 類似子函式呼叫 lr = pc pc = fun
mov r0,r0 相當於 nop
mov r0 , r1 , lsl #n //左移n位,相當於乘於 2^n次方
mov r0 , r1 , lsr #n //右移n位,相當於乘於 2^n次方
mvn r0, r1 //將源運算元,取反賦值給目標
加法操作:
add rd,rn,op2 // rd = rn + op2
adc rd,rn,op2 // rd = rn + op2 !c 帶進製翻轉減法
減法操作:
sub rd,rn,op2 // rd = rn - op2
suc rd,rn,op2 // rd = rn - op2 !c 帶進製翻轉減法
rsb rd,rn,op2 // rd = op2 - rn
rsc rd,rn,op2 // rd = op2 - rn !c 帶進製翻轉減法
乘法操作:
mul rd,rn,op2 //rd = rn *op2 保留32位結果同時影響 cpsr -》multiply
mla r1,r2,r3,r4 //r1 = r2 * r3 + r4 乘----累加指令 ,同時影響cpsr ->multiply accumulate
umull r0,r1,r2,r3 //(r0,r1) = r2 *r3 64位無符號乘法指令,結果地位存在r0中,高位存在 r1中
umlal r0,r1,r2,r3 //(r0,r1) = r2 *r3 + (r0,r1) 64位無符號乘法指令 , 結果低位加上 r0 存放在r0中,高位 加上r1,存放在r1中
smull r0,r1,r2,r3 //(r0,r1) = r2 *r3 64位有符號乘法指令,結果地位存在r0中,高位存在 r1中
smlal r0,r1,r2,r3 //(r0,r1) = r2 *r3 + (r0,r1) 64位有符號乘法指令 , 結果低位加上 r0 存放在r0中,高位 加上r1,存放在r1中
邏輯操作:
cmp rn,op2 //比較 rn 與 op 2 是否相等;標識 為 rn - op2
cmn rn,0p2 // rn + op2 來影響 標識位 ,以作為 後續操作 的條件判斷
and r0, r1, r2 //將r1,r2按位與,將值賦給r0
orr 或 操作
eor 異或 操作
bic rd ,rn , op2 位清零 將rn 按照 op2 中為1的位 進行清零,,結果放在rd中
tst rn,op2 做邏輯與 ,結果不放在目標暫存器中
teq rn,op2 做邏輯異或,這兩個不影響cpsr
與條件碼 聯合使用
load / store
ldr rd,將儲存器中的乙個字裝進rd中
ldr r0,=0x80009000 此時ldr為偽指令
ldr r0,[r1] 取出r1中位址所指向內容的值 為彙編指令
str rd,將暫存器中的值儲存到儲存器中
ldr b h t s
str b h t
b是指操作乙個位元組 ,從低位開始操作
h是指操作半個字,從低位開始
t 是指在使用者模式下,
s是指 有符號數
沒有b/h 則指操作乙個字(32位)
ldm
ldmia r1! , r1中儲存了記憶體中的位址,將r1中位址指向的內容 分別存入r3 到 r9的暫存器 中,ia 為 每次位址增加4
stmia r1!, r1中儲存了記憶體中的位址, 將r3 -r9 的內容寫入到 r1 對應的位址中,位址每次遞增 4
swp 字交換指令
swp rd,rm,[rn]
swpb rd,rm,[rn] 位元組交換指令
跳轉指令
b 跳轉指令 b label //使pc = label
bl 帶返回的跳轉指令 bl label //使lr = pc pc = label
狀態操作指令
mrs 把狀態暫存器的值 傳入 通用暫存器
mrs r0,cpsr//
msr 把暫存器 的值傳入 狀態暫存器中,
msr cpsr ,r0
使能irq:
enable_irq
mrs r0,cpsr
bic r0,r0,#80
msr cpsr_c ,r0
mov pc,lr
disable_irq
mrs r0,cpsr
orr r0,r0,#80
msr cpsr_c ,r0
mov pc,lr
ARM彙編指令
b或bl指令引起處理器轉移到 子程式名 也就是位址 處開始執行,這兩個指令都是相對跳轉指令。兩者的不同之處在於bl指令在轉移到子程式執行之前,將其下一條指令的位址拷貝到r14 lr,鏈結暫存器 由於bl指令儲存了下條指令的位址,因此使用指令 mov pc lr 即可實現子程式的返回。而b指令則無法實...
arm彙編指令
一般arm官方風格彙編指令為大寫,windows ads mdk 實際運用一般用gnu風格,為小寫,linux 1 arm採用risc架構,cpu本身不能直接讀取內 存,而需要先將記憶體中內容加載入cpu中通用寄 存器中才能被 cpu處理 ldr loadregister 指令 將記憶體內容加載入通...
ARM彙編指令
1.彙編概述 2.指令分類學習 3.偽指令 4.協處理訪問指令 為什麼要學習使用匯程式設計序?bootloader kernel的初始化和需要執行效率極高的程式中 1.arm標準彙編 2.gnu彙編 section.data 初始化的資料 section.bss 未初始化的資料 section.te...