【汇编语言】指令汇总
汇编语言指令总结如下: 1、算术逻辑运算指令:movdd、sub、and、not、xor、shr、shl、cmp、test、neg、inc、dec 2、数据处理指令:mov、mosb、 movsw、cld、std、inc、dec、add、sub、and、or、not、xor.3。寄存器和内存操作指令:pop、pop、pushf、popf、ret、retf、call、fcall、mul、div、db、dw、dd、dups、offset 4 控制传输指令:jmp、jnz、jz、jle、jge。
,ja,jb,jae,jbe,jcxz,jl,jg,je,jne,jno,jns,j nz,jz,ret,int, 输出.5。
条件传送指令:daa、das、adc、sbb、cmp、movsb、movsw很重要。
它们涵盖了读写数据、算术运算、逻辑运算、程序控制和传输、中断处理等各种需求。
在编写程序时,选择合适的指令可以大大提高代码的执行效率。
理解这些准则并有效地使用它们是成为一名优秀的汇编程序员的关键。
简要解释汇编指令DAA?
组合(压缩)BCD 代码的附加调整指令。
格式:DAA
功能:将AL的调整为两位复合二进制数。
调整方法与AAA指令相同,只是DAA指令必须分别考虑AL的高4位和低4位。
如果AL的低4位大于9或者AF=1,则AL的递增06H,AF置1,如果AL的高4位大于此; 9或CF=1,则AL的材质含量加上60H,CF=1。
如果都不满足,则清除 AF 和 CF。
主要的汇编指令有哪些?
LDR 和 STR - 用于字和无符号字节指令格式:
LDR/STR{cond}{T}Rd,
LDR/STR{cond}B{T}Rd,\ x0d\ x0a
LDR{cond}{T}Rd,指定地址处的字数据 Load into Rd;
STR{cond}{T}将Rd和Rd的字数据存储到指定的地址单元中。
LDR{cond}B{T}Rd,指令将指定地址的字节数据加载到Rd的最低有效字节中。
medium(Rd的高24位清零);
STR{cond}B{T}Rd,该指令将Rd的最低有效字节数据保存到指定的地址单元。
T 是可选后缀。
如果为 T,则即使处理器处于特权模式,存储系统也会将访问视为处理器处于用户模式。
T 在用户模式下无效,并且不能从用户模式偏移。
使用 T 将先前的索引一起移动。
地址部分有四种格式:
Zerooffset [Rn],Rn 中的值作为发送数据的地址。
示例:
LDRR0,[R1];
Pre-indexedoffset(预索引偏移)[Rn, Flexoffset]{!} 在发送数据之前将偏移量 Flexoffset 添加到 Rn。
结果用作传输数据的内存地址。
如果使用后缀'!',则结果写回Rn。
Rn 不能是 R15(例如:
LDRBR0,[R1,#8]
LDRR0,[R1,#8)]!
\ x0a 程序相关标签(标签当前为(必须在指令的 ±4KB 范围内) )。
过程相对偏移是预索引形式的另一个版本。
计算 PC 的偏移量并使用 PC 作为 Rn 生成预索引指令。
LDRR0,place;
place 地址被加载到 R0
中。
后索引偏移(post-indexedoffset)[Rn],Flexoffset。
发送数据后,无法将偏移量Flexoffset添加到Rn中并使Rn中的结果为R15(例如:
LDRR0,[R1],R2,LSL#2;
内存)。
地址R1处的字数据被读入寄存器R0,并且新地址R1+R2×4被写入R1。
偏移量 Flexoffset 可以采用以下两种形式之一:
1) 其值为 -4095 到 +4095 范围内的整数的表达式(通常是诸如
STRR5 数值常量的表达式)[R7] ,#--8
2) 寄存器和移位(移位用立即数指定)。
示例:
{-}Rm{,shift}
其中:\ x0d
-:可选负号。
如果符号为“1”,则从 Rn 中减去偏移量。
否则,将偏移量添加到 Rn。
Rm:包含偏移量的寄存器。
Rm 不能是 R15。
Shift:Rm 的可选移位方法。
它可以是以下格式之一:
ASRn:算术右移 n 位 (1<=n<=32)
LSLn:逻辑左移 n 位 (1<=n<=31)
\ x0aLSRn: 逻辑右移 n 位 (1<=n<=32)
RORn: 右移 n 位 (1<=n<=31)
RRX:带扩展的 1 位右旋转。
AND————逻辑“与”运算指令
指令格式:
AND{cond}{S}Rd,Rn,operand2
AND 指令将操作数 2 设置为位 执行单元上的逻辑运算 当您对 Rn 中的值执行 AND 操作时,结果将存储在目标寄存器 Rd 中。
S设置后,N 和 Z 位会受到影响,具体取决于操作结果。
当计算第二个操作数时,C 位被更新,但 V 位不受影响(指令 ORR、EOR 和 BIC 无效)。
标志位与 AND 指令相同)。
指令示例:
ANDSR1,R1,R2; R1=R1&R2,根据运算结果更新标志位
ANDR0,R0,R0=R0&0x0F; 。
ORR————逻辑“或”运算指令
指令格式:ORR{cond}{S}Rd,Rn,operand2 ORR指令将操作数operand2和Rn的值进行转换。
对于按位逻辑“OR”,结果存储在目标寄存器 Rd 中。
示例指令:
ORRRR1,R1,R2; R1=R1|R2,根据运算结果更新标志位
ORRR0,R0,#0x0F;其余位不变; 。
BIC————位清指令
指令格式:
BIC{cond}{S}Rd,Rn,operand2
BIC指令将Rn的值和操作数清零。
比较。
操作数2的补码是按位逻辑与,结果存储在目标寄存器Rd中。
指令示例:BICR0,R0,#0x0F;清除R0 的低4 位,其余位保持不变。
CMP ————比较命令
命令格式:
CMP{cond}Rn,operand2
CMP 命令将 Rn 的值减去操作数 operand2,并将结果相加。
条件(与操作数 2 相比,Rn 大于、小于或等于)在 CPSR 中反映如下: 后续指令根据条件标志确定程序的方向。
CMP 指令执行与 SUBS 指令相同的操作,只不过它只做减法而不存储结果。
指令示例:
cmpR0,R1; 比较R0,R1
beqstop
bltless; 跳转到更少
.
.
.
Less:
.
\ x0a.
.
停止:
.
.
.
SUB————减法指令
\x 0a 指令格式:
SUB{ cond}{S}Rd,Rn,operand2 SUB 指令为 Rn 从 的值中减去操作数 operand2,并将结果存储到目标寄存器 Rd 中。
示例指令:
SUBSR1,R1,R2; R1=R1-R2,根据运算结果更新标志位
SUBGTR3,3,#1; R3=R3-1
SUBR0,R2,R3, LSL #2; R0=R2-(R3<<2)
\x0 大于 aARM 分支指令
助记符
描述
操作
B{cond}lable
分支指令
PC←lable
\x0 aBL{cond}lable
带链接的分支指令
LR←PC-4, PC←lable
BX{cond}Rm
带状态切换的分支指令
PC←Rm,切换处理器状态 条件
指令 条件代码
条件代码 助记符后缀 标志含义
0000EQZ 设置(Z=1) 等于
0001NEZ 清除(Z=0) 不等于
\ x0a0010CSC 设置无符号数大于或等于
0011CCC 清除 无 符号数小于
0100MIN 设置负数
0101PLN 清除整数或0
0110VSV 设置溢出\x0 d
0111VCV 被清零,不溢出
1000HIC被置位,Z被清零,无符号数更大
1001LSZ被置位,C被清零,无符号数量小于
1010GEN。
GEN 等于 V(N=V=1 或 N=V=0)。
有符号数大于或等于
1011LTN。
有符号数不等于 V。
1100GTZ 被清零且 N 等于 V 有符号数大于
1101LEZ 或 N 不等于 V 有符号数小于等于
1110AL 忽略无条件执行 GPIO 寄存器 宏定义
GPFCONEQU0x56000050
GPFDATEQU0x56000054
GPFUPEQU0x56000058
\x 0d
EXPORTLEDTEST
AREALEDTESTASM,CODE,READONLY; 该指令定义了一个代码段。
段名称为 LEDTESTASM,属性为只读
LEDTEST
。
输出 ut
ldrr0,=GPFCON
ldrr1,[r0]
bicr1,r1,#0xff00
orrr1,r1,#0x5500
strr1,[r0]
\ x0a ; 屏蔽端口 7
ldrr0,=GPFUP
ldrr1,[r0]
orrr1,r1,#0xf0
strr1,[r0]
looptest\ x0d
;加上数据口F的数据寄存器的地址。
寄存器 r2
ldrr2,=GPFDAT
ldrr3,[r2]
bicr3,r3,#0xf0
orrr3,r3,#0xb0
strr3,[r2];GPF6output0 给出
\x0 aldrr0,=0x2fffff
bllay;调用延迟子程序
ldrr3,[r2]
bicr3,r3,#0xf0
orrr3,r3,#0x70
strr3,[r2 ] ;GPF7输出 put0
ldrr0,=0x2fffff;初始计数值
bllay;调用延时子程序
ldrr3,[r2]
bicr3,r3,#0xf0
orrr3,r3,# 0xd0
strr3,[r2];GPF5output0
ldrr0,=0x2fffff
bllay;调用延迟子程序
ldrr3,[r2]
bicr3,r3,#0xf0
orrr3,r3 , #0 xe0
strr3,[r2];GPF4output0
ldrr0,=0x2fffff
bllay;调用延迟子程序
blooptest
lay
subr0,r0, #1;r0=r0-1
cmpr0,#0x0;将r0的值与0
bnelay进行比较。
比较结果不为0(r0不为0)。
继续打电话延迟。
如果没有,请运行以下函数: 项语句
movpc,lr;返回值
END;
汇编指令解释
1、Rn代表R0~R7之一。#data代表8位值00H~FFH3。
直接代表8位地址00H~FFH4。
@Ri表示间接寄存器寻址只能是R0或R15。
@DPTR 表示数据指针 6 的间接寻址。
bit 表示 bit 7 的地址。
$ 表示当前地址寄存器 MOVA 地址,R1 将值 R1 赋给 A MOVA 的直接地址,3AH 将值赋给地址 3AH MOVA- A的立即寻址的s,#3AH将值3AH设置为A的寄存器MOVA的间接地址,@R0设置的值 R0中的地址到A。
MOVCA索引寻址,@A+DPTR以A中的值作为地址偏移量来进行AJMP查表的相对寻址。
MATN 跳转到位地址线号 MATNC MOVC,7FH 将位地址值 7FH 分配给 CMOVA,#3AH 数据传输和分配命令 PUSHdirect 将直接值压入堆栈地址 POPdirect 将直接值弹出到地址堆栈 XCHA,直接与 A AD 交换直接值DA,direct 将直接价值与 INC 结合起来。
direct 将SUBBA直接值加1,直接从A中的值和Cy中减去该值,并将它们存储在A中。
如果要使用减法。
没有Cy,可以在手术前清除Cy。
CLRCDCECdirect 从 BC 的直接值中减去 1DAA。
D代码加减后,进行小数调整,MULAB将A和B相乘,并将高八位设置在B中,将低八位设置在A中。
DIVAB将A和B相除,将商设置在A中。
,剩下的部分。
ANLA,直接对A和数值进行AND运算,结果存入A中(AND运算规则:0出来为0,全1出来为1) ORLA,直接组合并直接对A中的值进行或运算,结果存入A中(或者运算规则:1出来为1,全0出来为0)XRLA,直接对A中进行异或运算一个和 直接取值,结果存入A(异或规则:全0输出为0,全1输出为0,01和10输出为1)CRLA清A,CPLA反转A,RLA将数字切换为A右移,RRA 将 A 中的数字左移,RLCA 将 C 添加到 A 中的数字。
y 通过将 Cy 左移,将 RRCA 右移到 A 中的数字 SWAPA 交换 LJMP 长跳转指令中编号的高 4 位和低 4 位,64K 地址范围 AJMP 短跳转指令,2K 地址范围 JZrel 如果 A 为 0 则跳转到 rel 行号。
如果A不为0,则跳转到行号rel。
DJNZR1 到编号 l,rel 如果 R1 减 1 后不为 0,跳转到行号 rel 返回 RETI 指令 中断程序返回 NOP 指令,不进行 MOVC 操作,位设置值到位地址位。
位地址清为 0。
SETBbit 将位地址设置为 1。
位位返回地址位与 C 之间的 AND 运算,结果存储在 C 中。
ORLC 对地址位中的值进行 OR 运算JCrel 如果 Cy 为 1,则跳转到 rel 行号 JNCrel 如果 Cy 为 0,则跳转到 rel 行号。