A. 单片机汇编查表指令
mov xp0,#0
mov dptr,#tp0
LOOP: mov a,xp0
movc a,@a+dptr
mov p2,a
inc xp0
mov a,xp0
cjne a,#80,LOOP %循环查表中每一个直接的值,一共80次%
ret
tp0: DB 030H,048H,048H,048H,048H,048H,030H,000H
DB 010H,030H,010H,010H,010H,010H,07CH,000H
DB 000H,038H,044H,004H,018H,020H,07CH,000H
DB 030H,048H,008H,010H,008H,048H,030H,000H
DB 008H,018H,028H,048H,07CH,008H,008H,000H
DB 03CH,020H,020H,038H,004H,024H,018H,000H
DB 078H,040H,040H,078H,048H,048H,078H,000H
DB 078H,008H,008H,008H,008H,008H,008H,000H
DB 030H,048H,048H,030H,048H,048H,030H,000H
DB 030H,048H,048H,038H,008H,048H,030H,000H
B. 汇编语言在51单片机中的所有指令有那些
单片机指令功能一览表
助记符 代码 说明
MOV A,Rn E8~EF 寄存器A
MOV A,direct E5 dircet 直接字节送A
MOV A,@Ri ER~E7 间接RAM送A
MOV A,#data 74 data 立即数送A
MOV Rn,A F8~FF A送寄存器
MOV Rn,dircet A8~AF dircet 直接字节送寄存器
MOV Rn,#data 78~7F data 立即数送寄存器
MOV dircet,A F5 dircet A送直接字节
MOV dircet,Rn 88~8F dircet 寄存器送直接字节
MOV dircet1,dircet2 85 dircet1 dircet2 直接字节送直接字节
MOV dircet,@Ro 86~87 间接RAM送直接字节
MOV dircet,#data 75 dircet data 立即数送直接字节
MOV @Ri,A F6~F7 A送间接RAM
MOV @Ri,#data 76~77 data 直接字节送间接RAM
MOV @Ri,#data 76~77 data 立即数送间接RAM
MOV DPTR,#data16 90 data 15~8 16位常数送数据指针
data7~0
MOVC A,@A+DPTR 93 由((A)+(DPTR))寻址的程序存贮
器字节选A
MOVC A,@A+PC 83 由((A)+(PC));寻址的程序存贮器字节送A
MOVX A,@Ri E2~E3 送外部数据(8位地址)送A
MOVX A,@DPTR E0 送外部数据(16位地址)送A
MOVX @Ri,A F2~F3 A送外部数据(8位地址)
MOVX @DPTR,A F0 A送外部数据(16位地址)
PUSH dircet C0 dircet 直接字节进栈,SP加1
POP dircet D0 dircet 直接字节退栈,SP减1
XCH A,Rn C8~CF 交换A和寄存器
XCH A,dircet C5 dircet 交换A和直接字节
XCH A,@Ri C6~C7 交换A和间接RAM
XCH A,@Ri D6~D7 交换A和间接RAM的低位
SWAP A C4
算术操作 (A的二个半字节交换)
ADD A,Rn 28~2F 寄存器加到A
ADD A,dircet 25 dircet 直接字节加到A
ADD A,@Ri 26~27 间接RAM加到A
ADD A,#data 24data 立即数加到A
ADD A,Rn 38~3F 寄存器和进位位加到A
ADD A,dircet 35dircet 直接字节和进位位加到A
ADD A,@Ri 36~37 间接字节和进位位加到A
ADD A,data 34 data 立即数和进位位加到A
ADD A,Rn 98~9F A减去寄存器和进位位
ADD A,dircet 95 dircet A减去直接字节和进位位
ADD A,@Ri 36~37 间接RAM和进位位加到A
ADD A,data 34 data 立即数和进位位加到A
SUBB A,Rn 98~9F A减去寄存器和进位位
SUBB A,dircet 95 dircet A减去直接字节和进位位
SUBB A,@Ri 96~97 A减去间接RAM和进位位
SUBB A,#data 94 data A减去立即数和进位位
INC A 04 A加1
INC Rn 08~0F 寄存器加1
INC dircet 05 dircet 直接字节加1
INC @Ri 06~07 间接RAM加1
DEC A 14 A减1
DEC Rn 18~1F 寄存器减1
DEC dircet 15 dircet 直接字节减1
DEC @Ri 16~17 间接RAM减1
INC DPTR A3 数据指针加1
MUL AB A4 A乘以B
DIV AB 84 A除以B
DA A D4 A的十进制加法调整
逻辑操作
ANL A,Rn 58~5F 寄存器“与”到A
ANL A,dircet 55 dircet 直接字节“与”到A
ANL A,@Ri 56~57 间接RAm“与”到A
ANL A,#data 54 data 立即数“与”到A
ANL dircet A 52 dircet A“与”到直接字节
ANL dircet,#data 53 dircet data 立即数“与”到直接字节
ORL A,Rn 48~4F 寄存器“或”到A
ORL A,dircet 45 dircet 直接字节“或”到A
ORL A,@Ri 46~47 间接RAM“或”到A
ORL A,#data 44 data 立即数“或”到A
ORL dircet,A 42 dircet A“或”到直接字节
ORL dircet,#data 43 dircet data 立即数“或”到直接字节
XRL A,Rn 68~6F 寄存器“异或”到A
XRL A,dircet 65 dircet 直接字节“异或”到A
XRL A,@Ri 66~67 间接RAM“异或”到A
XRL A,#data 64 data 立即数“异或”到A
XRL dircet A 62 dircet A“异或”到直接字节
XRL dircet,#data 63 dircet data 立即数“异或”到直接字节
CLR A E4 清零
CPL A F4 A取反
RL A 23 A左环移
RLC A 33 A通过进位左环移
RR A 03 A右环移
RRC A 13 A通过进位右环移
控制程序转移
ACALL addr 11 *1 addr(a7~a0) 绝对子程序调用
LCALL addr 16 12 addr(15~8) 长子程序调用
addr(7~0)
RET 22 子程序调用返回
RETI addr 11 32 中断调用返回
AJMP addr 11 △1 addr(a7~a6) 绝对转移
LJMP addr 16 02addr(15~8) 长转移
addr(7~0)
SJMP rel 80 rel 短转移,相对转移
JMP @A+DPTR 73 相对于DPTR间接转移
JZ rel 60 rel A为零转移
JNZ rel 70 rel A为零转移
CJNE A,dircet,rel B5 dircet rel 直接字节与A比较,不等则转移
CJNE A,#data,rel B4 data rel 立即数与A比较,不等则转移
CJNE A,Rn,#data,rel B8~BF data rel 立即数与寄存器比较,不等则转移
CJNE @Ri,#data,rel B6~B7 data rel 立即数与间接RAM比较,不等则转移
DJNZ Rn,rel D8~DF rel 寄存器减1,不为零则转移
DJNZ dircet,rel B5 dircet rel 直接字节减1,不为零则转移
NOP 00 空操作
*=a10a9a8l
△=a10a9a80
布尔变量操作
CLR C C3 清零进位
CLR bit C2 清零直接位
SETB C D3 置位进位
SETB bit D2 置位直接位
CPL C B3 进位取反
CPL bit B2 直接位取反
ANL C,bit 82 dit 直接数“与”到进位
ANL C,/bit B0 直接位的反“与”到进位
ORL C,bit 72 bit 直接位“或”到进位
ORL C,/bit A0 bit 直接位的反“或”到进位
MOV C,bit A2 bit 直接位送进位
MOV bit,C 92 bit 进位送直接位
JC rel 40 rel 进位位为1转移
JNC rel 50 rel 进位位为0转移
JB bit,rel 20 bit rel 直接位为1相对转移
JNB bit,rel 30 bit rel 直接位为0相对转移
JBC bit,rel 10 bit rel 直接位为1相对转移,然后清零该位
[1]. 循环移位指令(4条)
RL A ;累加器A中的内容左移一位
RR A ;累加器A中的内容右移一位
RLC A ;累加器A中的内容连同进位位CY左移一位
RRC A ;累加器A中的内容连同进位位CY右移一位
[2]. 累加器半字节交换指令(1条)
SWAP A ; 累加器中的内容高低半字节互换
[3]. 求反指令(1条)
CPL A ; 累加器中的内容按位取反
[4]. 清零指令(1条)
CLR A ; 0→(A),累加器中的内容清0
[5]. 逻辑与操作指令(6条)
ANL A,data ;累加器A中的内容和直接地址单元中的内容执行与逻辑操作。结果存在寄存器A中。
ANL data,#data ;直接地址单元中的内容和立即数执行与逻辑操作。结果存在直接地址单元中。
ANL A,#data ;累加器A的内容和立即数执行与逻辑操作。结果存在累加器A中。
ANL A,Rn ;累加器A的内容和寄存器Rn中的内容执行与逻辑操作。结果存在累加器A中。
ANL data,A ;直接地址单元中的内容和累加器A的内容执行与逻辑操作。结果存在直接地址单元中。
ANL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行与逻辑操作。结果存在累加器A中。
[6]. 逻辑或操作指令(6条)
这组指令的作用是将两个单元中的内容执行逻辑或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。
ORL A,data ;累加器A中的内容和直接地址单元中的内容执行逻辑或操作。结果存在寄存器A中。
ORL data,#data ;直接地址单元中的内容和立即数执行逻辑或操作。结果存在直接地址单元中。
ORL A,#data ;累加器A的内容和立即数执行逻辑或操作。结果存在累加器A中。
ORL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑或操作。结果存在累加器A中。
ORL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑或操作。结果存在直接地址单元中。
ORL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑或操作。结果存在累加器A中。
[7]. 逻辑异或操作指令(6条)
XRL A,data ;累加器A中的内容和直接地址单元中的内容执行逻辑异或操作。结果存在寄存器A中。
XRL data,#data ;直接地址单元中的内容和立即数执行逻辑异或操作。结果存在直接地址单元中。
XRL A,#data ;累加器A的内容和立即数执行逻辑异或操作。结果存在累加器A中。
XRL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑异或操作。结果存在累加器A中。
XRL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑异或操作。结果存在直接地址单元中。
XRL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑异或操作。结果存在累加器A中
控制转移类指令分析
[1]. 无条件转移指令(4条)
LJMP addr16 ;addr16→(PC),给程序计数器赋予新值(16位地址)
AJMP addr11 ;(PC)+2→(PC),addr11→(PC10-0)程序计数器赋予新值(11位地址),(PC15-11)不改变
SJMP rel ;(PC)+ 2 + rel→(PC)当前程序计数器先加上2再加上偏移量给程序计数器赋予新值
JMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值
[2]. 条件转移指令(8条)
JZ rel ; A=0,(PC)+ 2 + rel→(PC),累加器中的内容为0,则转移到偏移量所指向的地址,否则程序往下执行
JNZ rel ; A≠0,(PC)+ 2 + rel→(PC),累加器中的内容不为0,则转移到偏移量所指向的地址,否则程序往下执行
CJNE A, data, rel ; A≠(data),(PC)+ 3 + rel→(PC),累加器中的内容不等于直接地址单元的内容,则转移到偏移量所指向的地址,否则程序往下执行
CJNE A, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),累加器中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行
CJNE Rn, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Rn中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行
CJNE @Ri, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Ri指向地址单元中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行
布尔变量操作指令分析
[1]. 位传送指令(2条)
MOV C,bit ;bit→CY,某位数据送CY
MOV bit,C ;CY→bit,CY数据送某位
[2]. 位置位复位指令(4条)
CLR C ; 0→CY,清CY
CLR bit ; 0→bit,清某一位
SETB C ; 1→CY,置位CY
SETB bit ; 1→bit,置位某一位
[3]. 位运算指令(6条)
ANL C,bit ;(CY)∧(bit)→CY
ANL C,/bit ;(CY)∧( )→CY
ORL C,bit ;(CY)∨(bit)→CY
ORL C,/bit ;(CY)∧()→CY
CPL C ;()→CY
CPL bit ;()→bir
[4]. 位控制转移指令(5)
JC rel ; (CY)=1转移,(PC)+2+rel→PC,否则程序往下执行,(PC)+2→PC。
JNC rel ; (CY)=0转移,(PC)+2+rel→PC,否则程序往下执行,(PC)+2→PC。
JB bit, rel ; 位状态为1转移。
JNB bit, rel ; 位状态为0转移。
JBC bit, rel ; 位状态为1转移,并使该位清“0”。
C. 单片机汇编语言关于subb指令的
如图所示。A的结果是EEh,因为SUBB是带进位位的减法,刚开始C被置1,所以12h减去23h再减1得到EEh,也就是-12h。
D. 汇编语言常用指令
单片机汇编语言汇编错误原因分析
汇编语言的指令格式,目前有两种不同的标准:Windows下的汇编语言基本上都遵循Intel风格的语法,比如:MASM、NASM;而Unix/Linux下的汇编语言基本上都遵循AT&T风格的语法;
一、汇编语言语句的通用格式
[名称[:]] 指令码 [第一操作数][,第二操作数] ;注释
汇编语言的指令码的操作数的个数可以是0、1、2个;当操作数的个数为2的时候,语句还有两种不同的格式:
Windows下Intel风格的汇编语言语句格式为:
[名称[:]] 指令码 目的操作数DST,源操作数SRC ;注释
Unix/Linux下AT&T风格的汇编语言语句格式为:
[名称[:]] 指令码 源操作数SRC,目的操作数DST ;注释
例如: CYCLE: ADD AX,02H ;(AX)汇编语言语句格式中的"名称"并不是所有语句都必需的,但是,如果语句中带有"名称",那么,大多数情况下,"名称"都表示的是内存中某一存储单元的地址,也就是"名称"后面各项在内存中存放的第一个存储单元的地址(包括该"名称"所在段的段地址和段内偏移地址);比如上面的指令中,CYCLE就是该语句的名称,CYCLE表示的就是其后面的机器指令码在内存中存放的第一个地址;"名称"与指令码之间的分隔符可以是冒号":",也可以是空格字符" ";当以冒号分割时,该名称代表的是一个标号;当以空格分割时,该名称代表的可能是标号,也可能是变量;当指令码有多个操作数的时候,相邻两个操作数之间要用逗号","分割;指令码与操作数之间必须以空格分割;汇编语言语句的注释必须以分号";"开头;
二、组成语句的元素
1、常数:
汇编语言中的常数有整数、字符串;二进制、八进制、十进制、十六进制;汇编语言采用不同的后缀区分:
B:二进制数; O:八进制数; D:十进制数; H:十六进制数;
当一个数值后面没有后缀的时候,默认为十进制数;
字符串常数是用一对单引号('')括起来的一串字符;
2、表达式:
由操作数和操作符组成;
算数运算操作符: +、-、*、/、MOD,等;取模运算MOD是取两数相除的余数;
逻辑运算操作符: AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)、XOR(逻辑异或);
注意:逻辑运算符同时又可以是逻辑运算指令的指令码,只有当它们出现在指令的操作数部分时,才是操作符;例如:
ADD AL,0CH ADD 0FH ;第一个ADD是指令码,第二个ADD是操作符;
关系运算操作符: EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于);
汇编语言中的表达式不能单独构成语句,只能是语句的组成部分;
注意:语句中表达式的求值不是在语句执行时完成的,而是在对源程序进行汇编链接时完成的.所以,语句中各表达式的值必须在汇编或链接时就是确定的,也就是说,表达式中各标识符的值在汇编或链接时就应该是确定的;
3、标号:
标号是由标识符表示的指令的名称,用于指示对应指令的位置(地址);
标号具有三个属性:段地址、偏移地址和类型;
标号的段地址和偏移地址属性是指该标号所对应的指令所在段的段地址和段内偏移地址;
标号的类型有两种:NEAR和FAR;标号定义成NEAR类型,表示该标号在段内使用,而定义成FAR类型则表示该标号可以在段间使用;
标号的定义:在指令码前面加上标识符和冒号":";
例如:START: PUSH DS
这条语句里面,START就是我们定义的标号,它代表指令PUSH的地址,所以,标号可以作为程序转移指令的操作数(即:要转向的地址);标号还可以采用伪指令来定义;例如:用LABEL伪指令和过程定义伪指令来定义;
4、变量:
与高级语言一样,并不是所有的操作数都是常数,汇编语言也有自己的变量,变量的值在程序运行期间是可以被改变的;
A.定义变量:汇编语言中,变量的定义是通过伪指令来完成的;定义变量的伪指令格式如下:
变量名 DB 表达式 ;定义字节变量,又称单字节变量(1个连续字节),DB-->BYTE
变量名 DW 表达式 ;定义字变量,又称双字节变量(2个连续字节),DW-->WORD
变量名 DD 表达式 ;定义双字变量,又称四字节变量(4个连续字节),DD-->DWORD
变量名 DF 表达式 ;定义六字节变量,又称六字节变量(6个连续字节),DF-->FWORD
变量名 DQ 表达式 ;定义长字变量,又称八字节变量(8个连续字节),DQ-->QWORD
变量名 DT 表达式 ;定义十字节变量(10个连续字节),DT-->TBYTE;
其中,变量名是一个合法的标识符,变量名后面不能加冒号":",只能用空格;变量名不是必要的,可有可无;变量的类型由关键字DB、DW、DD、DQ、DT来定义;
变量定义语句中的"表达式"是用于对变量进行初始化的,可有一下几种情况:
(1).一个或多个常数或表达式;当为多个常数或表达式时,期间要用逗号隔开;如DATA1--DATA4;
(2).带单引号的字符串;
对于字节型(DB)变量,每个变量的大小为1个字节,每个变量的值不能超过1个字符,每个字节内存入一个字符的ASCII码值,整个字符串可以在同一对单引号内给出,这相当于是定义了一个字符数组,如DATA5;
对于字类型(DW)变量,每个变量的大小为2个字节,每个变量的值不能超过2个字符,若为2个字符时,同样遵循高位存入高字节,低位存入低字节的规则;若为1个字符,则该字符的ASCII码值存入到低字节,高字节为00,如DATA6;
对于双字类型(DD)变量,每个变量的大小为4个字节,每个变量的值不能超过2个字符,若为2个字符,同样遵循高位存入高字节,低位存入低字节的规则;但是2个字符的值被存入到双字变量的最低2个字节中,1个字符的值被存入到双字变量的最低1个字节中;
对于长字类型(DQ)变量,每个变量的大小为8个字节,每个变量的值不能超过2个字符,若为2个字符,同样遵循高位存入高字节,低位存入低字节的规则;但是2个字符的值被存入到长字变量的最低2个字节中,1个字符的值被存入到长字变量的最低1个字节中;
(3).一个问号"?",表示该变量的值不确定,即:该变量所表示的内存单元中的内容是不确定的,或者说是,当表达式为问号时,变量所对应的内存区中并没有存入新的值,而只是预留出了相应的存储空间;如DATA7、DATA8
(4).重复方式;此时的格式为: 重复次数 DUP(表达式);重复方式指出表达式的值可以重复地存储到变量对应的内存区中,重复的次数由伪指令给出,相当于定义数组;如DATA9、DATA10
定义变量的例子:
DATA1 DB 20H ;1字节变量
DATA2 DW 0204H,1000H ;2字节变量
DATA3 DB (-1*3),(15/3) ;1字节变量
DATA4 DD 123456H ;4字节变量
DATA5 DB '0123' ;字符串变量,相当于一个字符数组
DATA6 DW 'AB','C','D' ;字符串变量,相当于一个字符串数组;
DATA7 DB ? ;1字节变量,未初始化
DATA8 DD ? ;4字节变量,未初始化
DATA9 DB 5 DUP(0) ;1字节变量,用5个0初始化,相当于是一个具有5个DB型元素的数组
DATA10 DW 3 DUP(?) ;2字节变量,未初始化,相当于是一个具有3个DW型元素的数组
变量定义语句中伪指令的功能是在变量名所对应的地址开始的内存区依次存入表达式中的各项值,表达式中的每项值所占用内存字节数与变量的类型对应;
总结:一个变量的变量名实际上就代表了该变量所对应的内存区在内存段中的有效地址(偏移地址);高地址是指地址值相对较大,低地址是指地址值相对较小,高地址与低地址是相对而言的;
5、变量的属性:
(1).属性介绍
一个变量具有一下属性:
A.段地址(SEG):变量所在段的段地址;
B.偏移地址(OFFSET):变量所在段内的偏移地址;
C.类型(TYPE):变量的类型定义了每个变量所占用的内存字节数,对于DB、DW、DD、DQ、DT类型定义的变量所占用的内存字节数分别是1、2、4、8、10;通常又将DB、DW、DD类型所定义的变量分别成为BYTE类型、WORD类型、DWORD类型变量;
常用标识符的类型值列表:
标识符种类 字节变量 字变量 双字变量 近标号NEAR 远标号FAR
TYPE的值 1 2 4 -1 -2
D.长度(LENGTH):变量定义时,一个变量名所定义的变量个数;在含有DUP操作符的变量定义中,变量名所定义的变量个数为定义格式中的重复次数;在其它各种变量定义中,每个变量名所定义的变量个数均为1个;
E.大小(SIZE):变量定义语句中,分配给同一个变量名的所有变量的总的字节数,其值为该变量的类型与长度的成绩;
其中,段地址、偏移地址和类型属性是变量的主属性,而长度和大小属性是变量的辅助属性;
(2).属性操作符:
操作符 表达式 含义
SEG SEG 变量名或标号 取出变量名或标号所在段的段地址
OFFSET OFFSET 变量名或标号 取出变量名或标号所在段内的偏移地址
TYPE TYPE 变量名或标号 取出变量名或标号的类型(变量所占用的字节数)
LENGTH LENGTH 变量名 取出变量的长度
SIZE SIZE 变量名 取出变量的大小
这些操作符不能单独构成语句,只能作为表达式的组成部分,并且表达式的求值也是在汇编过程中完成的;
6.强制类型转换操作符PTR
格式:数据类型 PTR 地址表达式
格式中的"数据类型"可以是BYTE、WORD、DWORD、NEAR、FAR;前三种类型是变量的类型,后两种类型是标号的类型;格式中的表达式可以是变量、标号、其它地址表达式;
PTR操作符的功能是用来重新定义已定义的变量或标号的类型,其作用域只在当前语句中; 例如:
DATA1 DW 02H
MOV BYTE PTR DATA1,AL
这条指令中,是把DATA1的类型转换为BYTE类型,然后把AL中的内容存放到DATA1的最低一个字节中;作用域只在这条MOV语句中,过了这条语句,DATA1仍然是DW类型,即:DATA1原来的类型并没有被修改;
E. 求89S52单片机汇编指令表
51单片机汇编指令表
8051
INSTRUCTION
SET
1.Arithmetic
operations:
指令用法
字节数
机器周期数
ADD
A,@Ri
1
1
ADD
A,Rn
1
1
ADD
A,direct
2
1
ADD
A,#data
2
1
ADDC
A,@Ri
1
1
ADDC
A,Rn
1
1
ADDC
A,direct
2
1
ADDC
A,#data
2
1
SUBB
A,@Ri
1
1
SUBB
A,Rn
1
1
SUBB
A,direct
2
1
SUBB
A,#data
2
1
INC
A
1
1
INC
@Ri
1
1
INC
Rn
1
1
INC
DPTR
1
1
INC
direct
2
1
INC
direct
2
1
DEC
A
1
1
DEC
@Ri
1
1
DEC
Rn
1
1
DEC
direct
2
1
MUL
AB
1
4
DIV
AB
1
4
DA
A
1
1
2.Logical
opreations:
ANL
A,@Ri
1
1
XRL
A,@Ri
1
1
ANL
A,Rn
1
1
XRL
A,Rn
1
1
ANL
A,direct
2
1
XRL
A,direct
2
1
ANL
A,#data
2
1
XRL
A,#data
2
1
ANL
direct,A
2
1
XRL
direct,A
2
1
ANL
direct,#data
3
2
XRL
direct,#data
3
2
ORL
A,@Ri
1
1
CLR
A
1
1
ORL
A,Rn
1
1
CPL
A
1
1
ORL
A,direct
2
1
RL
A
1
1
ORL
A,#data
2
1
RLC
A
1
1
ORL
direct,A
2
1
RR
A
1
1
ORL
direct,#data
3
2
RRC
A
1
1
SWAP
A
1
1
3.Data
transfer:
Mnemonic
Byte
Cyc
MOV
A,@Ri
1
1
MOV
DPTR,#data16
3
2
MOV
A,Rn
1
1
MOVC
A,@A+DPTR
1
2
MOV
A,direct
2
1
MOVC
A,@A+PC
1
2
MOV
A,#data
2
1
MOVX
A,@Ri
1
2
MOV
@Ri,A
1
1
MOVX
A,@DPTR
1
2
MOV
@Ri,direct
2
2
MOVX
@Ri,A
1
2
MOV
@Ri,#data
2
1
MOVX
@DPTR,A
1
2
MOV
Rn,A
1
1
PUSH
direct
2
2
MOV
Rn,direct
2
2
POP
direct
2
2
MOV
Rn,#data
2
1
XCH
A,@Ri
1
1
MOV
direct,A
2
1
XCH
A,Rn
1
1
MOV
direct,@Ri
2
2
XCH
A,direct
2
1
MOV
direct,Rn
2
2
XCHD
A,@Ri
1
1
MOV
direct,direct
3
2
MOV
direct,#data
3
2
4.Boolean
variable
manipulation:
Mnemonic
Byte
Cyc
CLR
C
1
1
ANL
C,bit
2
2
SETB
C
1
1
ANL
C,/bit
2
2
CPL
C
1
1
ORL
C,bit
2
2
CLR
bit
2
1
ORL
C,/bit
2
2
SETB
bit
2
1
MOV
C,bit
2
1
CPL
bit
2
1
MOV
bit,C
2
2
5.Program
and
machine
control:
Mnemonic
Byte
Cyc
NOP
1
1
JZ
rel
2
2
RET
1
2
JNZ
rel
2
2
RETI
1
2
JC
rel
2
2
ACALL
addr11
2
2
JNC
rel
2
2
AJMP
addr11
2
2
JB
bit,rel
3
2
LCALL
addr16
3
2
JNB
bit,rel
3
2
LJMP
addr16
3
2
JBC
bit,rel
3
2
SJMP
rel
2
2
CJNE
A,direct,rel
3
2
JMP
@A+DPTR
1
2
CJNE
A,#data,rel
3
2
DJNZ
Rn,rel
2
2
CJNE
@Ri,#data,rel
3
2
DJNZ
direct,rel
3
2
CJNE
Rn,#data,rel3
2
F. 单片机(汇编语言)指令
MOV PC,#2222H
根本就没有这条指令,这不是错不错的问题,是无中生有。汇编指令不是凭你自己的想象可随便写的。PC是程序计数器,是不可访问的,更没有MOV指令给它赋值。
G. 单片机汇编指令MOVC A,@A+DPTR
51单片机的指令系统中,是没有movc
a,@r0+dptr的,查表指令只有两条:
1、movc
a,@a+dptr
2、movc
a,@a+pc
H. 关于51单片机汇编送数的指令
可以这样写的没有问题,只要编译不报错都是行的。
大家这样写只不过是沿用习惯,实际你这样写的指令周期和他们的写法是相同的,都是两个。
另外有时主要是该数据可能会在接下来的A中操作,所以这样简化直观。
但有时又必须要传到A或其它寄存器中,比如比较端口状态:cjne p1,#5,dis1 ;像这样就会报错,要改为:mov a,p1 cjne a,#5,dis1 总的来讲keil还是很智能的,怎么简便怎么写,另外用周期少的方式写效率高。特别是在做乘除法。
I. 求单片机总汇编语言指令表、____
编号 指令名称 指令助记符 指令说明
数据传送类指令
1 一般传送 MOV A, #data 将立即数#data送累加器A
2 MOV direct, #data 将立即数#data送片内RAM direct地址单元内
3 Mov Rn, #data 将立即数#data送寄存器Rn
4 Mov @Ri, #data 寄存器Ri内为RAM地址,将立即数#data送该地址单元内
5 Mov direct2, direct1 将direct1地址单元的数据送 direct2地址单元内
6 Mov direct, rn 将Rn的数据送 direct地址单元内
7 Mov Rn, direct 将direct地址单元内的数据送Rn寄存器
8 Mov direct, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据送direct地址单元内
9 Mov @Ri, direct 寄存器Ri内为RAM地址,将direct地址单元内的数据送该地址单元内
10 Mov A, Rn 将寄存器Rn内的数据送累加器A
11 Mov Rn, A 将累加器A内的数据送寄存器Rn
12 Mov A, direct 将direct地址单元内的数据送累加器A
13 Mov direct, A 将累加器A内的数据送direct地址单元内
14 Mov A, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据送累加器A
15 Mov @Ri , A 寄存器Ri内为RAM地址,将累加器A的数据送该地址单元内
16 目的地址传送 Mov DPTR, #data16 将16位立即数送数据指针DPTR寄存器
17 字节交换 SWAP A 累加器A高低4位数据交换
18 XCH A, Rn 将累加器A数据和寄存器Rn内的数据交换
19 XCH A, direct 将累加器A数据和direct地址单元内的数据交换
20 XCH A, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据与累加器A的数据交换
21 XCHD A, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据低4位与的低4位交换
22 与外部RAM传送 MOVX @DPTR, A 将累加器A的数据送数据指针DPTR寄存器所指外部RAM地址单元内
23 MOVX A , @DPTR 将DPTR寄存器所指外部RAM地址单元内的数据送累加器A
24 MOVX A, @Ri 寄存器Ri内为片外RAM地址,将该地址单元内的数据送累加器A
25 MOVX @Ri, A 寄存器Ri内为片外RAM地址,将该地址单元内的数据送累加器A
26 与ROM传送 MOVC A, @A+DPTR A+DPTR构成ROM地址,将该地址内的数据送累加器A内
27 MOVC A, @A+PC A+PC构成ROM地址,将该地址内的数据送累加器A内
28 栈操作 PUSH direct 堆栈指针SP自加1后,将direct地址单元的数据压进堆栈,
29 POP direct 堆栈的数据送direct地址单元中,后堆栈指针减1,
算术运算指令
30 加法指令 ADD A, Rn 将寄存器Rn与累加器A的数据相加后,结果保存到累加器A
31 ADD A, direct 将direct地址单元内的数据与累加器A的数据相加后结果保存到累加器A
32 ADD A, @Ri 寄存器Ri内位地址,将该地址单元内的数据与累加器A的数据相加后结果保存到累加器A
33 ADD A, #data 将立即数与累加器A的数据相加后结果保存到累加器A
34 带进位加法 ADDC A, Rn 将寄存器Rn与累加器A的数据相加,再加上进位标志内的值后,结果保存到累加器A
35 ADDC A, direct 将direct地址单元内的数据与累加器A的数据相加,再加上进位标志内的值后,结果保存到累加器A
36 ADDC A, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据与累加器A的数据相加,再加上进位标志内的值后,结果保存到累加器A
37 ADDC A, #data 将立即数与累加器A的数据相加,再加上进位标志内的值后结果保存到累加器A
38 带借位减法 SUBB A, Rn 将与累加器A的数据减去寄存器Rn的数据,再减去进位标志内的值,结果保存到累加器A
39 SUBB A, direct 将与累加器A的数据减去direct地址单元内的数据,再减去进位标志内的值,结果保存到累加器A
40 SUBB A, @Ri 寄存器Ri内为RAM地址,将累加器A的数据减去该地址单元内的数据,再减去进位标志内的值后,结果保存到累加器A
41 SUBB A, #data 将累加器A的数据减去立即数,再减去进位标志内的值后,结果保存到累加器A
42 加1指令 INC A 累加器A的值自加1
43 INC Rn 寄存器Rn的值自加1
44 INC direct direct地址单元内值自加1
45 INC @Ri 寄存器Ri内为RAM地址,该地址单元内的值自加1
46 INC DPTR 数据指针寄存器DPTR内的值自加1
47 减1指令 DEC A 累加器A的值自减1
48 DEC Rn 寄存器Rn的值自减1
49 DEC direct direct地址单元内的值自减1
50 DEC @Ri 寄存器Ri内为RAM地址,该地址单元内的值自减1
51 乘法 MUL AB 累加器A与寄存器B内的值相乘,乘积的高8位保存在B寄存器,低8位保存在累加器A中
52 除法 DIV AB 累加器A的值除以寄存器B的值,商保存在累加器A中,余数保存在B寄存器
53 二-十进制调整 DA A 对累加器A的结果进行十进制调整
逻辑运算指令
54 逻辑与 ANL A, Rn 将累加器A的值和寄存器Rn的值进行与操作,结果保存到累加器A中
55 ANL A, direct 将累加器A的值和direct地址单元内的值进行与操作,结果保存到累加器A中
56 ANL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行与操作,结果保存到累加器A中
57 ANL A, #data 将累加器A的值和立即数进行与操作,结果保存到累加器A中
58 ANL direct, A 将累加器A的值和direct地址单元内的值进行与操作,结果保存到direct地址单元内
59 ANL direct, #data 将立即数和direct地址单元内的值进行与操作,结果保存到direct地址单元内
60 逻辑或 ORL A, Rn 将累加器A的值和寄存器Rn的值进行或操作,结果保存到累加器A中
61 ORL A, direct 将累加器A的值和direct地址单元内的值进行或操作,结果保存到累加器A中
62 ORL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行或操作,结果保存到累加器A中
63 ORL A, #data 将累加器A的值和立即数进行或操作,结果保存到累加器A中
64 ORL direct, A 将累加器A的值和direct地址单元内的值进行或操作,结果保存到direct地址单元内
65 ORL direct, #data 将立即数和direct地址单元内的值进行或操作,结果保存到direct地址单元内
66 逻辑异或 XRL A, Rn 将累加器A的值和寄存器Rn的值进行异或操作,结果保存到累加器A中
67 XRL A, direct 将累加器A的值和direct地址单元内的值进行异或操作,结果保存到累加器A中
68 XRL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行异或操作,结果保存到累加器A中
69 XRL A, #data 将累加器A的值和立即数进行异或操作,结果保存到累加器A中
70 XRL direct, A 将累加器A的值和direct地址单元内的值进行异或操作,结果保存到direct地址单元内
71 XRL direct, #data 将立即数和direct地址单元内的值进行异或操作,结果保存到direct地址单元内
72 按位取反 CPL A 累加器A的值按位取反
73 累加器清零 CLR A 累加器A清0
74 逻辑右移 RR A 累加器A的值循环右移1位
75 逻辑左移 RL A 累加器A的值循环左移1位
76 带进位右移 RRC A 累加器A的值带进位循环右移1位
77 带进位左移 RLC A 累加器A的值带进位循环左移1位
控制转移指令
78 无条件转移 SJMP rel rel为地址偏移量,PC加2后的地址加上rel作为目标地址,程序跳到目标地址继续运行
79 AJMP addr11(a10- a0) addr11为11位地址,PC加2后的地址高5位与指令中的低11位地址构成目标地址,程序跳到目标地址继续运行
80 LJMP addr16 将addr16的16位地址送程序计数器PC,使机器执行下一条指令时无条件转移到addr16处执行程序
81 JMP @A+DPTR 目标地址的基地址放在DPTR中,目标地址对基地址的偏移量放在累加器A中,它们相加构成目标地址
82 条件转移 JZ rel If(累加器A=0)则PC加2再加上rel作为目标地址
83 JNZ rel If(累加器A!=0)则PC加2再加上rel作为目标地址
84 CJNE A, direct, rel If(累加器A!= direct地址单元的值)则PC加2再加上rel作为目标地址
85 CJNE A, #data, rel If(累加器A!= 立即数)则PC加2再加上rel作为目标地址
86 CJNE Rn, #data, rel If(寄存器Rn的值!= 立即数)则PC加2再加上rel作为目标地址
87 CJNE @Ri, #data, rel 寄存器Ri内为RAM地址,If(该地址单元的值!= 立即数)则PC加2再加上rel作为目标地址
88 循环转移 DJNZ Rn, rel 寄存器Rn的值减1后,If(寄存器Rn的值!=0)则PC加2再加上rel作为目标地址
89 DJNZ direct, rel Direct地址单元的值减1后,If(该值!=0)则PC加3再加上rel作为目标地址
90 布尔条件转移 JC rel If(CY=1)则PC加2再加上rel作为目标地址
91 JNC rel If(CY=0)则PC加2再加上rel作为目标地址
92 JB bit, rel If(bit位=1)则PC加3再加上rel作为目标地址
93 JNB bit, rel If(bit位=0)则PC加3再加上rel作为目标地址
94 JBC bit, rel If(bit位=1)则PC加3再加上rel作为目标地址,且bit位清0
95 调用指令 ACALL addr11 addr11为11位地址,PC加2后的地址PUSH进堆栈,再将PC的地址高5位与指令中的低11位地址构成目标地址,程序跳到目标地址继续运行
96 LCALL addr16 PC加3后的地址PUSH进堆栈,再将16位地址送PC作为目标地址,程序跳到目标地址继续运行
97 返回指令 RET 子程序返回指令,把堆栈中的地址恢复到PC中使程序回到调用处
98 RETI 中断程序返回指令,把堆栈中的地址恢复到PC中使程序回到调用处
99 空操作 NOP 空操作
位操作指令
100 布尔传送 MOV C, bit 将bit位地址中的值送PSW中的进位标志位CY
101 MOV bit, C 将PSW中的进位标志位CY的值送bit位地址中
102 位清0 CLR C 将进位标志位CY清0
103 位清0 CLR bit 将bit位地址内清0
104 位置1 SETB C 将进位标志位CY置1
105 SETB bit 将bit位地址内置1
106 位与 ANL C, bit 将Cy和bit位地址中的值进行与操作后,结果送Cy
107 ANL C, /bit bit位地址中的值取反后再与Cy进行与操作,结构送Cy
108 位或 ORL C, bit 将Cy和bit位地址中的值进行或操作后,结果送Cy
109 ORL C, /bit bit位地址中的值取反后再与Cy进行或操作,结构送Cy
110 位取反 CPL C 将Cy取反
111 CPL bit 将bit位地址的值取反
说明:
1)Ri, Rn指当前工作寄存器,i,n = 0 – 7,当前工作寄存器由程序状态字寄存器PSW的2个位RS1, RS0决定