1、 內(nèi)存訪問指令
基本指令:
LDR:memory -> register (memory包括映射到內(nèi)存空間的非通用寄存器)
STR:register -> memory
語法:
op{cond }{B}{T} Rd , [Rn ]
op{cond }{B} Rd , [Rn , FlexOffset ]{!}
op{cond }{B} Rd , label
op{cond }{B}{T} Rd , [Rn ], FlexOffset
op:基本指令,如LDR、STR
cond:條件執(zhí)行后綴
B:字節(jié)操作后綴
T:用戶指令后綴
Rd:源寄存器,對(duì)于LDR指令,Rd將保存從memory中讀取的數(shù)值;對(duì)于STR指令,Rd保存著將寫入memory的數(shù)值
Rn:指針寄存器
FlexOffset:偏移量
例子:
ldr r0, [r1] ;r1作為指針,該指針指向的數(shù)存入r0
str r0, [r1, #4] ;r1+4作為指針,r0的值存入該地址
str r0, [r1, #4]! ;同上,并且r1 = r1 + 4
ldr r1, =0x08100000 ;立即數(shù)0x08100000存到r1
ldr r1, [r2], #4 ;r2+4作為指針,指向的值存入r1,并且r2=r2+4
【label的使用】
addr1 ;定義一個(gè)名為“addr1”的label,addr1 = 當(dāng)前地址
dcd 0 ;在當(dāng)前地址出定義一個(gè)32bit的變量
~ ~ ~
ldr r1, label1 ;r1 = addr1,r1即可以作為var1的指針
ldr r0, [r1]
add r0, r0, #1
str r0, [r1] ;變量var1的值加1
【FlexOffset的使用】
FlexOffset可以是立即數(shù),也可以是寄存器,還可以是簡(jiǎn)單的表達(dá)式
2、 多字節(jié)存取指令(常用于堆棧操作)
基本指令:
LDM:memory ――> 多個(gè)寄存器
STM:多個(gè)寄存器 ――> memory
語法:
op{cond }mode Rn{!}, reglist {^}
mode:指針更新模式,對(duì)應(yīng)于不同類型的棧。最常用的是“FD”模式,相當(dāng)于初始棧指針在高位,壓棧后指針值減小。
Rn:指針寄存器
!:最后的指針值將寫入Rn中
reglist:要操作的寄存器列表,如{r0-r8, r10}
^ :完成存取操作后從異常模式下返回
例子:
;異常處理程序:
sub lr, lr, #4 ; lr – 4是異常處理完后應(yīng)該返回的地方
;保存r0~r12和lr寄存器的值到堆棧并更新堆棧指針。
stmfd sp!, {r0-r12, lr}
;異常處理
ldmfd sp!, {r0-r12, pc}^ ;從堆棧中恢復(fù)r0~r12
,返回地址賦給pc指針,使程序返回到異常發(fā)生前所執(zhí)行的地方,^標(biāo)記用來使CPU
退出異常模式,進(jìn)入普通狀態(tài)。
3、 算術(shù)運(yùn)算指令
基本指令:
ADD:加
SUB:減
語法:
op{cond }{S} Rd, Rn, Operand2
S:是否設(shè)置狀態(tài)寄存器(CPSR),如:N(有符號(hào)運(yùn)算結(jié)果得負(fù)數(shù))、Z(結(jié)果得0)、C(運(yùn)算的進(jìn)位或移位)、V(有符號(hào)數(shù)的溢出)等等。
Rd:保存結(jié)果的寄存器
Rn:運(yùn)算的第一個(gè)操作數(shù)
Operand2:運(yùn)算的第二個(gè)操作數(shù),這個(gè)操作數(shù)的值有一些限定:如可以是8位立即數(shù)(例:0xa8)或一個(gè)8為立即數(shù)的移位(例:0xa800,而0xa801就不符合)。也可以是寄存器,或寄存器的移位(如“r2, lsl #4”)。
例子:
add r0, r1, r2 ; r0 = r1 + r2
adds r0, r1, #0x80 ; r0 = r1 + 0x80,并設(shè)置狀態(tài)寄存器
subs r0, r1, #2000 ; r0 = r1 – 2000,并設(shè)置狀態(tài)寄存器
4、 邏輯運(yùn)算指令
基本指令:
AND:與
ORR:或
EOR:異或
BIC:位清0
語法:
op{cond }{S} Rd, Rn, Operand2
語法類似算術(shù)運(yùn)算指令
例子:
ands r0, r1, #0xff00 ; r0 = r1 and 0xff00,并設(shè)置狀態(tài)寄存器
orr r0, r1, r2 ; r0 = r1 and r2
bics r0, r1, #0xff00 ; r0 = r1 and ! (0xff00)
ands r0, r1, #0xffff00ff ; 錯(cuò)誤
5、 MOV指令
語法:
MOV{cond}{S} Rd, Operand2
例子:
mov r0, #8 ; r0 = 8
mov r0, r1 ; r0 = r1
不同于LDR、STR指令,該指令可以寄存器間賦值
6、 比較指令
基本指令:
CMP:比較兩個(gè)操作數(shù),并設(shè)置狀態(tài)寄存器
語法:
CMP{cond } Rn, Operand2
例子:
cmp r0, r1 ; 計(jì)算r0 – r1,并設(shè)置狀態(tài)寄存器,由狀態(tài)寄存器可以知r0是否大于、小于或等于r1
cmp r0, #0 ;
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |