找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1730|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

ARM常用匯編指令

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:107189 發(fā)表于 2016-3-6 13:08 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
LDR STR——用于字和無符號字節(jié)
指令格式
LDR/STR{cond}{T} Rd,<地址>
LDR/STR{cond}B{T} Rd<地址>
LDR{cond}{T} Rd,<地址> 加載指定地址的字?jǐn)?shù)據(jù)到Rd中;
STR{cond}{T}  Rd,<地址>    存儲Rd中的字?jǐn)?shù)據(jù)到指定的地址單元中;
LDR{cond}B{T} Rd,<地址>    指令加載指定地址的字節(jié)數(shù)據(jù)到Rd的的最低字節(jié)中(Rd的高24位清零);
STR{cond}B{T} Rd, <地址>   指令存儲Rd中的最低字節(jié)數(shù)據(jù)到指定的地址單元中。
     T為可選后綴,若有T,那么即使處理器是在特權(quán)模式下,存儲系統(tǒng)也將訪問看成處理器是在用戶模式下,T 在用戶模式下無效,不能與前索引偏移一起使用T。

地址部分可用的形式有4種:
  • 零偏移(zero offset) [Rn] Rn的值作為傳送數(shù)據(jù)的地址。如
    LDR R0,[R1]
  • 前索引偏移(pre-indexed offset) [Rn,Flexoffset]{!} 在數(shù)據(jù)傳送之前,將偏移量Flexoffset加到Rn 中。其結(jié)果作為傳送數(shù)據(jù)的存儲器地址。若使用后綴“!”,則結(jié)果寫回到Rn 中,且Rn 不允許是R15,如:
    LDRB R0,[R1,#8]
    LDR R0,[R1,#8]!
  • 程序相對偏移(program relative) label(label 必須是在當(dāng)前指令的土4KB 范圍內(nèi)) 。
    程序相對偏移是前索引形式的另一種版本。從PC 計算偏移量,并將PC 作為Rn 生成前索引指令,不能使用后綴“!”,如:
    LDR R0,place ;
    place地址裝入R0
  • 后索引偏移(post-indexed offset) [Rn],F(xiàn)lexoffset。在數(shù)據(jù)傳送后,將偏移量Flexoffset 加到Rn 中,結(jié)果寫回到Rn,Rn 不允許是R15,如:
    LDR R0,[R1],R2,LSL#2 ;
    將存儲器地址為R1 的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1+R2×4寫入R1。
    偏移量Flexoffset可以是下兩種形式之:
    1) 取值范圍是-4095 到+4095 的整數(shù)的表達(dá)式,經(jīng)常是數(shù)字常量,如:
    STR R5,[R7],#--8
    2) 一個寄存器再加上移位(移位由立即數(shù)指定),如:
    {-}Rm{,shift}
    其中:
    - :可選負(fù)號。若帶符號“一”,則從Rn 中減去偏移量。否則,將偏移量加到Rn 中。
    Rm :內(nèi)含偏移量的寄存器。Rm 不允許是R15。
    Shift:Rm 的可選移位方法?梢允窍铝行问降娜魏我环N:
    ASR n :算術(shù)右移n 位(1<=n<=32)
    LSL n :邏輯左移n 位(1<=n<=31)
    LSR n :邏輯右移n 位(1<=n<=32)
    ROR n :循環(huán)右移n 位(1<=n<=31)
    RRX :循環(huán)右移1 位,帶擴(kuò)展。

AND―――――邏輯"與"操作指令
指令格式:

AND{cond}{S} Rd,Rn,operand2
AND指令將操作數(shù)operand2 與Rn 的值按位邏輯"與",結(jié)果存放到目的寄存器Rd 中。若設(shè)置S,則根據(jù)運(yùn)算結(jié)果影響N、Z位,在計算第二操作數(shù)時,更新C位,不影響V位(指令ORR、EOR、BIC 對標(biāo)志位的影響同AND 指令)。
指令示例:
ANDS R1,R1,R2 ;R1=R1&R2,并根據(jù)運(yùn)算的結(jié)果更新標(biāo)志位
AND R0,R0,#0x0F ;R0=R0&0x0F,取出R0最低4位數(shù)據(jù)。


ORR―――――邏輯"或"操作指令
指令格式:ORR{cond}{S} Rd,Rn,operand2 ORR指令將操作數(shù)operand2 與Rn 的值按位邏輯"或",結(jié)果存放到目的寄存器Rd 中。指令示例:
ORRS R1,R1,R2 ;R1=R1|R2,并根據(jù)運(yùn)算的結(jié)果更新標(biāo)志位

ORR R0,R0,#0x0F ;R0=R0|0x0F,將R0最低4位置1,其余位不變。

BIC―――――位清除指
指令格式
BIC{cond}{S} Rd,Rn,operand2
BIC指令將Rn 的值與操作數(shù)operand2 的反碼按位邏輯"與",結(jié)果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;將R0最低4位清零,其余位不變。

CMP―――――比較指令
指令格式:
CMP{cond} Rn,operand2
CMP指令用Rn的值減去操作數(shù)operand2 ,并將結(jié)果的狀態(tài)(Rn 與operand2比較是大、小、相等)反映在CPSR中,以便后面的指令根據(jù)條件標(biāo)志決定程序的走向。CMP指令與SUBS指令完成的操作一樣,只是CMP指令只減,不存結(jié)果。
指令示例:
cmp R0,R1 ;比較R0,R1
beq stop ;R0=R1跳到stop
blt less ;R0<R1跳到Less


.
.
.


Less:
.
.
.
Stop:

.
.
.
SUB―――――減法運(yùn)算指令
指令格式:
SUB{cond}{S} Rd,Rn,operand2 SUB指令用Rn 的值減去操作數(shù)operand2 ,并將結(jié)果存放到目的寄存器Rd 中。 指令示例:

SUBS R1,R1,R2 ;R1=R1-R2,并并根據(jù)運(yùn)算的結(jié)果更新標(biāo)志位
SUBGT R3,3,#1 ;大于則 R3=R3-
SUB R0,R2,R3,LSL#2; R0=R2-(R3<<2)

ARM分支指令
助記符
說明
操作
B{cond} lable
分支指令
PC← lable
BL{cond} lable
帶鏈接的分支指令
LR← PC-4 ,PC←lable
BX{cond} Rm
帶狀態(tài)切換的分支指令
PC← Rm,切換處理器狀態(tài)

指令的條件碼
條件碼助記符后綴標(biāo)志含義
0000EQZ置位(Z=1)相等
0001NEZ清零(Z=0)不相等
0010CSC置位無符號數(shù)大于等于
0011CCC清零無符號數(shù)小于
0100MIN置位負(fù)數(shù)
0101PLN清零整數(shù)或0
0110VSV置位溢出
0111VCV清零未溢出
1000HIC置位且Z清零無符號數(shù)大于
1001LSZ置位且C清零無符號數(shù)小于等于
1010GEN等于V(N=V=1或N=V=0)帶符號數(shù)大于或等于
1011LTN不等于V帶符號數(shù)小于
1100GTZ清零且N等于V帶符號數(shù)大于
1101LEZ置位或N不等于V帶符號數(shù)小于或等于
1110AL忽略無條件執(zhí)行




;GPIO寄存器宏定義
GPFCON EQU 0x56000050
GPFDAT EQU 0x56000054
GPFUP EQU 0x56000058   

EXPORT LEDTEST
AREA LEDTESTASM,CODE,READONLY ;該偽指令定義了一個代碼段,段名為LEDTESTASM,屬性只讀

LEDTEST
;設(shè)置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
;將數(shù)據(jù)端口F的數(shù)據(jù)寄存器的地址附給寄存器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 ;調(diào)用延遲子程序

ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0x70
str r3,[r2] ;GPF7 output 0
ldr r0,=0x2fffff         ;初始計數(shù)值
bl delay ;調(diào)用延遲子程序

ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0xd0
str r3,[r2] ;GPF5 output 0
ldr r0,=0x2fffff
bl delay ;調(diào)用延遲子程序

ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0xe0
str r3,[r2] ;GPF4 output 0
ldr r0,=0x2fffff
bl delay      ;調(diào)用延遲子程序

b looptest
delay
sub r0,r0,#1 ;r0=r0-1
cmp r0,#0x0 ;將r0的值與0相比較
bne delay ;比較的結(jié)果不為0(r0不為0),繼續(xù)調(diào)用delay,否則執(zhí)行下一條語句
mov pc,lr ;返回

END ;程序結(jié)束符

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表