LDR 和STR——用于字和無符號字節
指令格式:
LDR/STR{cond}{T} Rd,<地址>
LDR/STR{cond}B{T} Rd,<地址>
LDR{cond}{T} Rd,<地址> 加載指定地址的字數據到Rd中;
STR{cond}{T} Rd,<地址> 存儲Rd中的字數據到指定的地址單元中;
LDR{cond}B{T} Rd,<地址> 指令加載指定地址的字節數據到Rd的的最低字節中(Rd的高24位清零);
STR{cond}B{T} Rd, <地址> 指令存儲Rd中的最低字節數據到指定的地址單元中。
T為可選后綴,若有T,那么即使處理器是在特權模式下,存儲系統也將訪問看成處理器是在用戶模式下,T 在用戶模式下無效,不能與前索引偏移一起使用T。
地址部分可用的形式有4種:
- 零偏移(zero offset) [Rn] ,Rn的值作為傳送數據的地址。如:
LDR R0,[R1]; - 前索引偏移(pre-indexed offset) [Rn,Flexoffset]{!} 在數據傳送之前,將偏移量Flexoffset加到Rn 中。其結果作為傳送數據的存儲器地址。若使用后綴“!”,則結果寫回到Rn 中,且Rn 不允許是R15,如:
LDRB R0,[R1,#8]
LDR R0,[R1,#8]! - 程序相對偏移(program relative) label(label 必須是在當前指令的土4KB 范圍內) 。
程序相對偏移是前索引形式的另一種版本。從PC 計算偏移量,并將PC 作為Rn 生成前索引指令,不能使用后綴“!”,如:
LDR R0,place ;
place地址裝入R0 - 后索引偏移(post-indexed offset) [Rn],Flexoffset。在數據傳送后,將偏移量Flexoffset 加到Rn 中,結果寫回到Rn,Rn 不允許是R15,如:
LDR R0,[R1],R2,LSL#2 ;
將存儲器地址為R1 的字數據讀入寄存器R0,并將新地址R1+R2×4寫入R1。
偏移量Flexoffset可以是下兩種形式之:
1) 取值范圍是-4095 到+4095 的整數的表達式,經常是數字常量,如:
STR R5,[R7],#--8
2) 一個寄存器再加上移位(移位由立即數指定),如:
{-}Rm{,shift}
其中:
- :可選負號。若帶符號“一”,則從Rn 中減去偏移量。否則,將偏移量加到Rn 中。
Rm :內含偏移量的寄存器。Rm 不允許是R15。
Shift:Rm 的可選移位方法。可以是下列形式的任何一種:
ASR n :算術右移n 位(1<=n<=32)
LSL n :邏輯左移n 位(1<=n<=31)
LSR n :邏輯右移n 位(1<=n<=32)
ROR n :循環右移n 位(1<=n<=31)
RRX :循環右移1 位,帶擴展。
AND―――――邏輯"與"操作指令
指令格式:
AND{cond}{S} Rd,Rn,operand2
AND指令將操作數operand2 與Rn 的值按位邏輯"與",結果存放到目的寄存器Rd 中。若設置S,則根據運算結果影響N、Z位,在計算第二操作數時,更新C位,不影響V位(指令ORR、EOR、BIC 對標志位的影響同AND 指令)。
指令示例:
ANDS R1,R1,R2 ;R1=R1&R2,并根據運算的結果更新標志位
AND R0,R0,#0x0F ;R0=R0&0x0F,取出R0最低4位數據。
ORR―――――邏輯"或"操作指令
指令格式:ORR{cond}{S} Rd,Rn,operand2 ORR指令將操作數operand2 與Rn 的值按位邏輯"或",結果存放到目的寄存器Rd 中。指令示例:
ORRS R1,R1,R2 ;R1=R1|R2,并根據運算的結果更新標志位
ORR R0,R0,#0x0F ;R0=R0|0x0F,將R0最低4位置1,其余位不變。
BIC―――――位清除指令
指令格式:
BIC{cond}{S} Rd,Rn,operand2
BIC指令將Rn 的值與操作數operand2 的反碼按位邏輯"與",結果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;將R0最低4位清零,其余位不變。
CMP―――――比較指令
指令格式:
CMP{cond} Rn,operand2
CMP指令用Rn的值減去操作數operand2 ,并將結果的狀態(Rn 與operand2比較是大、小、相等)反映在CPSR中,以便后面的指令根據條件標志決定程序的走向。CMP指令與SUBS指令完成的操作一樣,只是CMP指令只減,不存結果。
指令示例:
cmp R0,R1 ;比較R0,R1
beq stop ;R0=R1跳到stop
blt less ;R0<R1跳到Less
.
.
.
Less:
.
.
.
Stop:
.
.
.
SUB―――――減法運算指令
指令格式:
SUB{cond}{S} Rd,Rn,operand2 SUB指令用Rn 的值減去操作數operand2 ,并將結果存放到目的寄存器Rd 中。 指令示例:
SUBS R1,R1,R2 ;R1=R1-R2,并并根據運算的結果更新標志位
SUBGT R3,3,#1 ;大于則 R3=R3-1
SUB R0,R2,R3,LSL#2; R0=R2-(R3<<2)
ARM分支指令
指令的條件碼
條件碼 | 助記符后綴 | 標志 | 含義 | 0000 | EQ | Z置位(Z=1) | 相等 | 0001 | NE | Z清零(Z=0) | 不相等 | 0010 | CS | C置位 | 無符號數大于等于 | 0011 | CC | C清零 | 無符號數小于 | 0100 | MI | N置位 | 負數 | 0101 | PL | N清零 | 整數或0 | 0110 | VS | V置位 | 溢出 | 0111 | VC | V清零 | 未溢出 | 1000 | HI | C置位且Z清零 | 無符號數大于 | 1001 | LS | Z置位且C清零 | 無符號數小于等于 | 1010 | GE | N等于V(N=V=1或N=V=0) | 帶符號數大于或等于 | 1011 | LT | N不等于V | 帶符號數小于 | 1100 | GT | Z清零且N等于V | 帶符號數大于 | 1101 | LE | Z置位或N不等于V | 帶符號數小于或等于 | 1110 | AL | 忽略 | 無條件執行 |
;GPIO寄存器宏定義
GPFCON EQU 0x56000050
GPFDAT EQU 0x56000054
GPFUP EQU 0x56000058
EXPORT LEDTEST
AREA LEDTESTASM,CODE,READONLY ;該偽指令定義了一個代碼段,段名為LEDTESTASM,屬性只讀
LEDTEST
;設置GPF4-GPF7為output
ldr r0,=GPFCON
ldr r1,[r0]
bic r1,r1,#0xff00
orr r1,r1,#0x5500
str r1,[r0]
;禁止GPF4-GPF7端口的上拉電阻
ldr r0,=GPFUP
ldr r1,[r0]
orr r1,r1,#0xf0
str r1,[r0]
looptest
;將數據端口F的數據寄存器的地址附給寄存器r2
ldr r2,=GPFDAT
ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0xb0
str r3,[r2] ;GPF6 output 0
ldr r0,=0x2fffff
bl delay ;調用延遲子程序
ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0x70
str r3,[r2] ;GPF7 output 0
ldr r0,=0x2fffff ;初始計數值
bl delay ;調用延遲子程序
ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0xd0
str r3,[r2] ;GPF5 output 0
ldr r0,=0x2fffff
bl delay ;調用延遲子程序
ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0xe0
str r3,[r2] ;GPF4 output 0
ldr r0,=0x2fffff
bl delay ;調用延遲子程序
b looptest
delay
sub r0,r0,#1 ;r0=r0-1
cmp r0,#0x0 ;將r0的值與0相比較
bne delay ;比較的結果不為0(r0不為0),繼續調用delay,否則執行下一條語句
mov pc,lr ;返回
END ;程序結束符
|