汇编中的指令是一种助记符,以助记符代替指令的机器码,因为指令使用起来也比较繁琐,所以才出现了后期的高级语言。
今天总结一下51汇编中的助记符
AT89C51单片机的汇编指令共有111条,可按功能分为5大类:
数据传送类指令28条; 算数操作类指令24条; 逻辑运算类指令25条; 控制转移类17条; 位操作类17条。
在此约定下列指令中各符号的意义:
Rn:当前寄存器区的8个工作寄存器(n=0~7) Ri:当前寄存器区中可作间接寻址寄存器的2个寄存器(i=0 1) direct:直接地址 #data:包含在指令中的8位立即数 rel:相对转移指令中的偏移量,为8位带符号补码数 DPTR:数据指针,16位数据地址寄存器 bit:直接寻址位 C:进位标志位 addr11:11位目的地址 addr16:16位目的地址 @:间接寻址寄存器前缀
算术运算指令
指令 说明 ADD A, Rn 将累加器与寄存器的内容相加,结果存回累加器A ADD A, direct 将累加器与直接地址中的内容相加,结果存回累加器A ADD A, @Ri 将累加器与间接地址的内容相加,结果存回累加器A ADD A, #data 将累加器与直接数相加,结果存回累加器A
这里一种指令有四种使用方法,对应着四种寻址方式,具体的寻址方式可以看这里51汇编的七种寻址方式
ADDC A, Rn 将累加器与寄存器的内容及进位C相加,结果存回累加器 ADDC A, direct 将累加器与直接地址的内容及进位C相加,结果存回累加器 ADDC A, @Ri 将累加器与间接地址的内容及进位C相加,结果存回累加器 ADDC A, #data 将累加器与常数及进位C相加,结果存回累加器
ADDC是单片机的加法指令,与ADD不同的是ADDC可以将进位C(Cy)中的内容一起相加,Cy是标志寄存器PSW(Program Status Word)中的一位标志位,当运算过程最高位有进位的时候,Cy会被置位成1,这时使用ADDC即可与Cy里面的1一起相加。
举个栗子:00FFH与0001H相加
;先将低八位相加
MOV A,#FFH
ADD A,#01H;此时A = 01H,最高位产生进位1,标志位Cy变为1
;再将高八位相加
MOV 30H,A;将A中的数据存放到30H中
MOV A,#00H
ADDC A,#00H;两个00H相加是0,但是标志位为1,所以此时A = 01H
MOV A,31H
;最终的结果为0100H
SUBB A, Rn 将累加器的值减去寄存器的值减借位C,结果存回累加器 SUBB A, direct 将累加器的值减直接地址的值减借位C,结果存回累加器 SUBB A, @Ri 将累加器的值减间接地址的值减借位C,结果存回累加器 SUBB A, #data 将累加器的值减常数值减借位C,结果存回累加器
INC A 将累加器A的值加1 INC Rn 将寄存器的值加1 INC direct 将直接地址加11 INC @Ri 将间接地址的内容加一 INC DPTR 数据指针寄存器值+11,当DPL溢出时,会使DPH+1,不影响标志位
DEC A 将累加器的值-1 DEC Rn 将寄存器的值-1 DEC direct 将直接地址的内容-1 DEC @Ri 将间接地址的内容-1
MUL AB 将AB的值相乘,积的低字节存回A,高字节存B,溢出则标志位OV为1 DIV AB 将A的值除以B的值,商存回累加器,余数存回B寄存器 DA A 将累加器A做十进制调整,若低4位>9或(AC)=1,则低4位+6 若高4位>9或©=1,则高4位值加6
逻辑运算指令
ANL A,Rn 将累加器的值与寄存器的值做“与”的逻辑判断,结果存回累加器 ANL A, direct 将累加器的值与直接地址的内容做“与”的逻辑判断,结果存回累加器 ANL A, @Ri 将累加器的值与间接地址的内容做“与”的逻辑判断,结果存回累加器 ANL A, #data 将累加器的值与常数做“与”的逻辑判断,结果存回累加器 ANL direct, A 将直接地址的内容与累加器的值做“与”的逻辑判断,结果存回该直接地址 ANL direct, #data 将直接地址的内容与常数值做“与”的逻辑判断,结果存回该直接地址
ORL A, Rn 将累加器的值与寄存器的值做“或”的逻辑判断,结果存回累加器 ORL A, direct 将累加器的值与直接地址的内容做“或”的逻辑判断,结果存回累加器 ORL A, @Ri 将累加器的值与间接地址的内容做“或”的逻辑判断,结果存回累加器 ORL A, #data 将累加器的值与常数做“或”的逻辑判断,结果存回累加器 ORL direct, A 将直接地址的内容与累加器的值做“或”的逻辑判断,结果存回该直接地址 ORL direct, #data 将直接地址的内容与常数值做“或”的逻辑判断,结果存回该直接地址
XRL A, Rn 将累加器的值与寄存器的值做“异或”的逻辑判断,结果存回累加器 XRL A, direct 将累加器的值与直接地址的内容做“异或”的逻辑判断,结果存回累加器 XRL A, @Ri 将累加器的值与间接地扯的内容做“异或”的逻辑判断,结果存回累加器 XRL A, #data 将累加器的值与常数作“异或”的逻辑判断,结果存回累加器 XRL direct, A 将直接地址的内容与累加器的值做“异或”的逻辑判断,结果存回该直接地址 XRL direct, #data 将直接地址的内容与常数的值做“异或”的逻辑判断,结果存回该直接地址
CLR A 累加器置0 CPL A 累加器的值反相 RL A 累加器的之左移一位 RLC 累加器的值含进位C左移一位 RR A 累加器右移一位 RRC A 累加器的值含C右移一位 SWAP A 将累加器高四位与低四位的内容交换
数据转移指令
MOV A,Rn 将寄存器的内容载入累加器 MOV A,direct MOV A,direct MOV A,@Ri 将间接地址的内容载入累加器 MOV A,#data 将常数载入累加器 MOV Rn,A 将累加器的内容载入寄存器 MOV Rn,direct 将直接地址的内容载入寄存器 MOV Rn,#data 将常数载入寄存器 MOV direct,A 将累加器的内容存入直接地址 MOV direct,Rn 将寄存器的内容存入直接地址 MOV direct1, direct2 将直接地址2的内容存入直接地址1 MOV direct,@Ri 将间接地址的内容存入直接地址 MOV direct,#data 将常数存入直接地址 MOV @Ri,A 将累加器的内容存入某间接地址 MOV @Ri,direct 将直接地址的内容存入某间接地址 MOV @Ri,#data 将常数存入某间接地址 MOV DPTR,#data16 将16位的常数存入数据指针寄存器
MOVC A,@A+DPTR A的值加数据指针寄存器的值为其所指定地址,将该地址的内容读入累加器 MOVC A,@A+PC 累加器的值加程序计数器的值作为其所指定地址,将该地址的内容读入累加器
MOVX A,@Ri 将间接地址所指定外部存储器的内容读入累加器(8位地址) MOVX A,@DPTR 将累加器的内容写入间接地址所指定的外部存储器(8位地址) MOVX @Ri,A 将累加器的内容写入间接地址所指定的外部存储器(8位地址) MOVX @DPTR,A 将累加器的内容写入数据指针所指定的外部存储器(16位地址)
PUSH direct 将直接地址的内容压入堆栈区 POP direct 从堆栈弹出该直接地址的内容
XCH A,Rn 将累加器的内容与寄存器的内容互换 XCH A,direct 将累加器的值与直接地址的内容互换 XCH A,@Ri 将累加器的值与间接地址的内容互换 XCHD A,@Ri 将累加器的低4位于间接地址的低4位互换
布尔运算
CLR C 进位C置零 CLR bit 直接地址的某位置零 SETB C 进位C置1 SETB bit 直接地址的某位置1 CPL C 将C反相 CPL bit 直接地址的某位反相 ANL C,bit 将进位C与直接地址的某位做与运算结果存C中 ANL C,/bit 将进位C与直接地址的某位的反相做与运算,结果存C中 ORL C,bit 将进位C与直接地址的某位做“或”的逻辑判断,结果存回进位C ORL C,/bit 将进位C与直接地址的某位的反相值做“或”的逻辑判断,结果存回进位C MOV C,bit 将直接地址的某位值存入进位C MOV bit,C 将进位C的值存入直接地址的某位 JC rel 若进位C=1则跳至rel的相关地址 JNC rel 若进位C=0则跳至rel的相关地址 JB bit,rel 若直接地址的某位为1,则跳至rel的相关地 JNB bit,rel 若直接地址的某位为,则跳至rel的相关地址 JBC bit,rel 若直接地址的某位为1,则跳至rel的相关地址,并将该位值清除为0
程序转移指令
ACALL addr11 调用2k程序存储器范围内的子程序 LCALL addr16 调用64K程序存储器范围内的子程序 RET 从子程序返回 RETI 从中断子程序返回 AJMP addr11 绝对跳转(2K内) LJMP addr16 长跳转(64K内) SJMP rel 短跳转(2K内)-128~+127字节 JMP @A+DPTR 跳至累加器的内容加数据指针所指的相关地址 JZ rel 累加器的内容为0,则跳至rel所指相关地址 JNZ rel 累加器的内容不为0,则跳至rel所指相关地址 CJNE A,direct,rel 将累加器的内容与直接地址的内容比较,不相等则跳至rel所指的相关地址 CJNE A,#data,rel 将累加器的内容与常数比较,若不相等则跳至rel所指的相关地址 CJNE @Rn,#data,rel 将寄存器的内容与常数比较,若不相等则跳至rel所指的相关地址 CJNE @Ri,#data,rel 将间接地址的内容与常数比较,若不相等则跳至rel所指的相关地址 DJNZ Rn,rel 将寄存器的内容减1,不等于0则跳至rel所指的相关地址 DJNZ direct,rel 将直接地址的内容减1,不等于0则跳至rel所指的相关地址 NOP 无动作