arm彙編指令

2021-09-23 22:27:24 字數 3637 閱讀 1044

條件碼:

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