(基于ARM的)微機(jī)原理與接口技術(shù)筆記(5)
ARM(7TDMI)的指令(復(fù)習(xí))
一般的ARM指令形式: 32位ARM指令集(4字節(jié)) 16位Thumb指令集(2字節(jié))
一般的ARM匯編格式,其中<>
內(nèi)是必須的 {}
內(nèi)的是可選的.
Rd
目標(biāo)寄存器 Rn
操作數(shù) operand2
第二操作數(shù)
<opcode> {<cond>}{s} <Rd>,<Rn>{,<operand2>}
數(shù)據(jù)處理
存儲(chǔ)器訪問
分支跳轉(zhuǎn)
條件碼:基于狀態(tài)寄存器高4位(N
負(fù)數(shù)標(biāo)志,Z
零標(biāo)志,C
進(jìn)位借位,V
溢出)指令條件執(zhí)行
operand2
可以是
寄存器 R0-R15
寄存器進(jìn)行移位以后
立即數(shù)
#immed_8r
常數(shù)表達(dá)式 ?可以由8位二進(jìn)制數(shù)通過循環(huán)右移偶數(shù)位可以得到的數(shù)算術(shù)移位(右)
邏輯移位(左,右)
寄存器方式下
operand2
即為寄存器的值例如
sub r1,r2,r2
addeq r2,r4,r5;條件執(zhí)行sub r0,r0,r1,lsl #4
;r0是目標(biāo)寄存器 r0減(r1邏輯左移位4)扔到r0寄存器移位方式
立即數(shù)方式
ARM(7TDMI)的尋址方式
尋址:
處理器如何根據(jù)指令中的地址來(lái)尋找真實(shí)操作數(shù)的地址
外設(shè)(IO口等)可以映射到內(nèi)存里當(dāng)做內(nèi)存處理
操作數(shù)可能在
(1)指令中直接給出
(2)寄存器
(3)內(nèi)存單元
ARM處理器8種尋址方式
寄存器尋址
操作數(shù)就是寄存器 取寄存器的數(shù)值 來(lái)的很快
舉例
mov r1,r2;把r2的值扔到r1里面
sub r0,r1,r2;把[r1的值減去r2的值]扔到r0里面設(shè)r1:
0x55
r2:0xaa
在
mov r1,r2
后r1:0xaa
r2:0xaa
立即尋址
immediate
指令里面帶操作數(shù)舉例
subs r0,r0,#1 ;把r0減1扔到r0并影響狀態(tài)位
mov r0,#0xff000 ;把0xff000扔到r0設(shè)r0:
0xaa
執(zhí)行mov r0,#0xff000
寄存器偏移尋址
ARM指令集特有,寄存器值移位后
舉例
mov r0,r2, lsl #3 把[r2左移3位]扔到r0
ands r1,r1,r2,lsl r3 ;把[r2左移[r3]位 和r1與]扔到r1注意r2的真實(shí)值不變
寄存器間接尋址
從內(nèi)存讀數(shù)據(jù)/寫內(nèi)存
舉例
ldr r1,[r2];此處r2儲(chǔ)存的是地址(類比指針) 把r2指向的內(nèi)容扔到r1
swp r1,r1,[r2];把r1的值的r2指向的存儲(chǔ)內(nèi)容交換注意r2是地址.執(zhí)行時(shí)間要長(zhǎng)()
基址尋址
基址寄存器中內(nèi)容(地址)+偏移量OFFSET得一個(gè)地址
offset為0則為間接尋址
舉例
ldr r2,[r3,#0x0c] ;r3是地址 offset 0x0c
str r1,[r0,#-4] ;把r1的內(nèi)容保存到[r0的地址-4]的內(nèi)容先算offset再尋址
多寄存器尋址
一次搬一堆,把內(nèi)存中一堆連續(xù)32位數(shù)搬到多個(gè)寄存器
或者反過來(lái)把多個(gè)寄存器的值扔到內(nèi)存中
最多16個(gè)
舉例
ldmia r1!,{r2-r7,r12};把r1儲(chǔ)存的地址處連續(xù)的數(shù)據(jù)扔到{r2到r7,r12} (r1自動(dòng)偏移)
stmia r0!,{r2-r7,r12};把{r2到r7,r12}的值扔到r1儲(chǔ)存的地址處(連續(xù)的 r0自動(dòng)偏移)r1!
表示執(zhí)行完指令r1的值會(huì)變化這個(gè)指令A(yù)RM指令集肯定有 Thumb可能沒有
堆棧尋址(其實(shí)只是用的棧)
STACK
是一個(gè)按特定順序進(jìn)行存取的區(qū)域.后進(jìn)先出.人為在內(nèi)存中劃的(可以認(rèn)為是"設(shè)置棧指針和棧大小")主要保存臨時(shí)數(shù)據(jù),"函數(shù)調(diào)用棧"
STACK OVERFLOW
有2種 上溢/下溢 (也有可能沒事?但是會(huì)導(dǎo)致runtime error )向上生長(zhǎng)(扔一個(gè)數(shù)進(jìn)棧,棧指針向上)
向下生長(zhǎng)(棧從高地址開始,扔一個(gè)數(shù)進(jìn)棧,棧指針向下)
棧指針
SP
進(jìn)棧LDM 出棧STM
后期arm指令有PUSH或者POP like this
相對(duì)尋址
基于PC(R15)的尋址,加上OFFSET得到一個(gè)地址
(可能有錯(cuò))
ARM指令集(及其匯編語(yǔ)言)
全部是ARM7的ARM指令
先上例子
area example1,code,readonly ;用分號(hào)注釋
entry
code32
start mov r0,#0
mov r1,#10
loop bl add_sub
?b loop
add_sub
adds r0,r0,r1
mov pc,lr
end
1.存儲(chǔ)器訪問指令
分為單寄存器操作指令和多寄存器操作指令
ldr
和str
訪問內(nèi)存變量
程序加載數(shù)據(jù)到PC實(shí)現(xiàn)散轉(zhuǎn)
單寄存器加載/存儲(chǔ)可以實(shí)現(xiàn)32位/16位/8位
零偏移:Rn就是地址
前索引偏移:先對(duì)[]
計(jì)算OFFSET,得到地址,然后取地址 !
執(zhí)行完Rn變化
程序相對(duì)偏移:
后索引偏移:先對(duì)[]
取地址后算OFFSET 下一次影響
ldr r2,[r5] ;把r2
str r1,[r2,#0x04] ;把r1的值扔到[r2+0x04]的地址 r2的值不變
pdf下載: