主要的汇编指令有哪些啊
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分支指令
助记符
说明
操作
B{cond} lable
分支指令
PC← lable
BL{cond} lable
带链接的分支指令
LR← PC-4 ,PC←lable
BX{cond} Rm
带状态切换的分支指令
PC← Rm,切换处理器状态
指令的条件码
条件码 助记符后缀 标志 含义
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 ;程序结束符
主要的汇编指令有哪些?
LDR 和STR——用于字和无符号字节\x0d\x0a指令格式:\x0d\x0aLDR/STR{cond}{T} Rd,\x0d\x0aLDR/STR{cond}B{T} Rd, \x0d\x0a\x0d\x0aLDR{cond}{T} Rd, 加载指定地址的字数据到Rd中;\x0d\x0aSTR{cond}{T} Rd, 存储Rd中的字数据到指定的地址单元中;\x0d\x0aLDR{cond}B{T} Rd, 指令加载指定地址的字节数据到Rd的的最低字节中(Rd的高24位清零);\x0d\x0aSTR{cond}B{T} Rd, 指令存储Rd中的最低字节数据到指定的地址单元中。\x0d\x0a T为可选后缀,若有T,那么即使处理器是在特权模式下,存储系统也将访问看成处理器是在用户模式下,T 在用户模式下无效,不能与前索引偏移一起使用T。\x0d\x0a\x0d\x0a地址部分可用的形式有4种: \x0d\x0a\x0d\x0a零偏移(zero offset) [Rn] ,Rn的值作为传送数据的地址。如: \x0d\x0aLDR R0,[R1]; \x0d\x0a前索引偏移(pre-indexed offset) [Rn,Flexoffset]{!} 在数据传送之前,将偏移量Flexoffset加到Rn 中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn 中,且Rn 不允许是R15,如: \x0d\x0aLDRB R0,[R1,#8]\x0d\x0aLDR R0,[R1,#8]! \x0d\x0a程序相对偏移(program relative) label(label 必须是在当前指令的土4KB 范围内) 。 \x0d\x0a程序相对偏移是前索引形式的另一种版本。从PC 计算偏移量,并将PC 作为Rn 生成前索引指令,不能使用后缀“!”,如: \x0d\x0aLDR R0,place ;\x0d\x0aplace地址装入R0 \x0d\x0a后索引偏移(post-indexed offset) [Rn],Flexoffset。在数据传送后,将偏移量Flexoffset 加到Rn 中,结果写回到Rn,Rn 不允许是R15,如: \x0d\x0aLDR R0,[R1],R2,LSL#2 ;\x0d\x0a将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。\x0d\x0a偏移量Flexoffset可以是下两种形式之:\x0d\x0a1) 取值范围是-4095 到+4095 的整数的表达式,经常是数字常量,如:\x0d\x0aSTR R5,[R7],#--8 \x0d\x0a2) 一个寄存器再加上移位(移位由立即数指定),如:\x0d\x0a{-}Rm{,shift} \x0d\x0a其中: \x0d\x0a- :可选负号。若带符号“一”,则从Rn 中减去偏移量。否则,将偏移量加到Rn 中。\x0d\x0aRm :内含偏移量的寄存器。Rm 不允许是R15。 \x0d\x0aShift:Rm 的可选移位方法。可以是下列形式的任何一种: \x0d\x0aASR n :算术右移n 位(1<=n<=32) \x0d\x0aLSL n :逻辑左移n 位(1<=n<=31) \x0d\x0aLSR n :逻辑右移n 位(1<=n<=32) \x0d\x0aROR n :循环右移n 位(1<=n<=31) \x0d\x0aRRX :循环右移1 位,带扩展。\x0d\x0aAND—————逻辑”与”操作指令\x0d\x0a指令格式:\x0d\x0a\x0d\x0aAND{cond}{S} Rd,Rn,operand2 \x0d\x0aAND指令将操作数operand2 与Rn 的值按位逻辑”与”,结果存放到目的寄存器Rd 中。若设置S,则根据运算结果影响N、Z位,在计算第二操作数时,更新C位,不影响V位(指令ORR、EOR、BIC 对标志位的影响同AND 指令)。\x0d\x0a指令示例:\x0d\x0aANDS R1,R1,R2 ;R1=R1&R2,并根据运算的结果更新标志位\x0d\x0aAND R0,R0,#0x0F ;R0=R0&0x0F,取出R0最低4位数据。\x0d\x0a\x0d\x0aORR—————逻辑”或”操作指令\x0d\x0a指令格式:ORR{cond}{S} Rd,Rn,operand2 ORR指令将操作数operand2 与Rn 的值按位逻辑”或”,结果存放到目的寄存器Rd 中。指令示例: \x0d\x0aORRS R1,R1,R2 ;R1=R1|R2,并根据运算的结果更新标志位\x0d\x0aORR R0,R0,#0x0F ;R0=R0|0x0F,将R0最低4位置1,其余位不变。 \x0d\x0a\x0d\x0aBIC—————位清除指令\x0d\x0a指令格式:\x0d\x0aBIC{cond}{S} Rd,Rn,operand2 \x0d\x0aBIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。\x0d\x0a\x0d\x0aCMP—————比较指令 \x0d\x0a指令格式:\x0d\x0aCMP{cond} Rn,operand2 \x0d\x0aCMP指令用Rn的值减去操作数operand2 ,并将结果的状态(Rn 与operand2比较是大、小、相等)反映在CPSR中,以便后面的指令根据条件标志决定程序的走向。CMP指令与SUBS指令完成的操作一样,只是CMP指令只减,不存结果。 \x0d\x0a指令示例: \x0d\x0acmp R0,R1 ;比较R0,R1 \x0d\x0abeq stop ;R0=R1跳到stop\x0d\x0ablt less ;R0<R1跳到Less \x0d\x0a\x0d\x0a. \x0d\x0a. \x0d\x0a. \x0d\x0a\x0d\x0aLess:\x0d\x0a. \x0d\x0a. \x0d\x0a. \x0d\x0aStop: \x0d\x0a.\x0d\x0a.\x0d\x0a.\x0d\x0aSUB—————减法运算指令\x0d\x0a指令格式:\x0d\x0aSUB{cond}{S} Rd,Rn,operand2 SUB指令用Rn 的值减去操作数operand2 ,并将结果存放到目的寄存器Rd 中。 指令示例: \x0d\x0aSUBS R1,R1,R2 ;R1=R1-R2,并并根据运算的结果更新标志位\x0d\x0aSUBGT R3,3,#1 ;大于则 R3=R3-1 \x0d\x0aSUB R0,R2,R3,LSL#2; R0=R2-(R3<<2)\x0d\x0a\x0d\x0aARM分支指令\x0d\x0a助记符\x0d\x0a\x0d\x0a 说明\x0d\x0a\x0d\x0a 操作\x0d\x0a\x0d\x0aB{cond} lable \x0d\x0a 分支指令\x0d\x0a\x0d\x0a PC← lable \x0d\x0a \x0d\x0aBL{cond} lable \x0d\x0a 带链接的分支指令\x0d\x0a\x0d\x0a LR← PC-4 ,PC←lable \x0d\x0a \x0d\x0aBX{cond} Rm \x0d\x0a 带状态切换的分支指令\x0d\x0a\x0d\x0a PC← Rm,切换处理器状态\x0d\x0a\x0d\x0a指令的条件码\x0d\x0a条件码 助记符后缀 标志 含义 \x0d\x0a0000 EQ Z置位(Z=1) 相等 \x0d\x0a0001 NE Z清零(Z=0) 不相等 \x0d\x0a0010 CS C置位 无符号数大于等于 \x0d\x0a0011 CC C清零 无符号数小于 \x0d\x0a0100 MI N置位 负数 \x0d\x0a0101 PL N清零 整数或0 \x0d\x0a0110 VS V置位 溢出 \x0d\x0a0111 VC V清零 未溢出 \x0d\x0a1000 HI C置位且Z清零 无符号数大于 \x0d\x0a1001 LS Z置位且C清零 无符号数小于等于 \x0d\x0a1010 GE N等于V(N=V=1或N=V=0) 带符号数大于或等于 \x0d\x0a1011 LT N不等于V 带符号数小于 \x0d\x0a1100 GT Z清零且N等于V 带符号数大于 \x0d\x0a1101 LE Z置位或N不等于V 带符号数小于或等于 \x0d\x0a1110 AL 忽略 无条件执行 \x0d\x0a\x0d\x0a;GPIO寄存器宏定义\x0d\x0aGPFCON EQU 0x56000050 \x0d\x0aGPFDAT EQU 0x56000054\x0d\x0aGPFUP EQU 0x56000058 \x0d\x0a\x0d\x0aEXPORT LEDTEST\x0d\x0aAREA LEDTESTASM,CODE,READONLY ;该伪指令定义了一个代码段,段名为LEDTESTASM,属性只读\x0d\x0a\x0d\x0aLEDTEST\x0d\x0a;设置GPF4-GPF7为output\x0d\x0aldr r0,=GPFCON \x0d\x0aldr r1,[r0]\x0d\x0abic r1,r1,#0xff00\x0d\x0aorr r1,r1,#0x5500\x0d\x0astr r1,[r0]\x0d\x0a\x0d\x0a;禁止GPF4-GPF7端口的上拉电阻\x0d\x0aldr r0,=GPFUP\x0d\x0aldr r1,[r0]\x0d\x0aorr r1,r1,#0xf0\x0d\x0astr r1,[r0]\x0d\x0a\x0d\x0alooptest\x0d\x0a;将数据端口F的数据寄存器的地址附给寄存器r2\x0d\x0aldr r2,=GPFDAT\x0d\x0a\x0d\x0aldr r3,[r2]\x0d\x0abic r3,r3,#0xf0\x0d\x0aorr r3,r3,#0xb0\x0d\x0astr r3,[r2] ;GPF6 output 0\x0d\x0aldr r0,=0x2fffff\x0d\x0abl delay ;调用延迟子程序\x0d\x0a\x0d\x0aldr r3,[r2]\x0d\x0abic r3,r3,#0xf0\x0d\x0aorr r3,r3,#0x70\x0d\x0astr r3,[r2] ;GPF7 output 0\x0d\x0aldr r0,=0x2fffff ;初始计数值\x0d\x0abl delay ;调用延迟子程序 \x0d\x0a\x0d\x0aldr r3,[r2]\x0d\x0abic r3,r3,#0xf0\x0d\x0aorr r3,r3,#0xd0\x0d\x0astr r3,[r2] ;GPF5 output 0\x0d\x0aldr r0,=0x2fffff\x0d\x0abl delay ;调用延迟子程序\x0d\x0a\x0d\x0aldr r3,[r2]\x0d\x0abic r3,r3,#0xf0\x0d\x0aorr r3,r3,#0xe0\x0d\x0astr r3,[r2] ;GPF4 output 0\x0d\x0aldr r0,=0x2fffff\x0d\x0abl delay ;调用延迟子程序\x0d\x0a\x0d\x0ab looptest\x0d\x0adelay\x0d\x0asub r0,r0,#1 ;r0=r0-1 \x0d\x0acmp r0,#0x0 ;将r0的值与0相比较\x0d\x0abne delay ;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句\x0d\x0amov pc,lr ;返回\x0d\x0a\x0d\x0aEND ;程序结束符
汇编语言MOV指令是什么?
在汇编语言中,MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的)。其特点是不破坏源地址单元的内容。
例如:
MOV
AX,2000H;将16位数据2000H传送到AX寄存器
MOV
AL,20H;将8位数据20H传送到AL寄存器
MOV
AX,BX;将BX寄存器的16位数据传送到AX寄存器
MOV
AL,[2000H];将2000H单元的内容传送到AL寄存器
需要注意的是:
(1)两个存储单元之间不能直接传送数据,即:MOV指令只允许一个操作数在存储器中。MOV
[SI],[2000H];这是错误的
(2)MOV指令中立即数不能直接传送给段寄存器(CS、DS、SS、ES)和IP;段寄存器之间不能直接传送。MOV
IP,2000
H
;这是错误的
(3)CS和IP不能作为目的操作数。MOV
CS,AX
;这是错误的
(4)MOV指令中立即数不能作目标操作数。MOV
2000H,[SI]
;这是错误的