51汇编指令详解.docx
- 文档编号:4307370
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:13
- 大小:22.66KB
51汇编指令详解.docx
《51汇编指令详解.docx》由会员分享,可在线阅读,更多相关《51汇编指令详解.docx(13页珍藏版)》请在冰豆网上搜索。
51汇编指令详解
第4章51汇编指令详解
1.指令的定义
指令是规定计算机进行某种操作的指令。
一条指令只能完成有限的功能,为了使计算机完成一定的或者复杂的功能,就需要一系列指令。
计算机能够执行各种指令的集合称为“指令系统”。
计算机的主要功能也是由指令系统来体现的。
80C51使用了7种寻址方式,共有111条指令。
如果按照字节分:
49条单字节,46条双字节,16条3字节。
如果按照运算速度分:
单周期指令64条,双周期45条,4周期2条。
用助记符形式来表示的机器指令称为“汇编语言指令”。
计算机的指令一般用汇编语言指令来表示。
80C51系列单片机的指令共有111条指令,按照其功能特点分为5大类,即是:
数据传送指令类、算术运算类、逻辑运算类、控制转移类和位操作类。
符号定义表符号含义
RnR0~R7寄存器n=0~7
Direct 直接地址,内部数据区的地址 RAM(00H~7FH)
SFR(80H~FFH)B, ACC, PSW, IP, P3, IE, P2, SCON, P1, TCON, P0
@Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH)8052/32RAM地址(00H~FFH)
#data8位常数
#data1616位常数
Addr1616位的目标地址
Addr1111位的目标地址
Rel 相关地址
bit 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位指令介绍指令字节周期动作说明一、算数运算指令
2.指令的详解
(字节 周期)
1. ADDA,Rn11 将累加8器与寄存器的内容相加,结果存回累加器
2. ADDA,direct21 将累加器与直接地址的内容相加,结果存回累加器
3. ADDA,@Ri11 将累加器与间接地址的内容相加,结果存回累加器
4. ADDA,#data21 将累加器与常数相加,结果存回累加器
5. ADDCA,Rn11 将累加器与寄存器的内容及进位 C相加,结果存回累加器
6. ADDCA,direct21 将累加器与直接地址的内容及进位 C相加,结果存回累加器
7. ADDCA,@Ri11 将累加器与间接地址的内容及进位 C相加,结果存回累加器
8. ADDCA,#data21 将累加器与常数及进位 C相加,结果存回累加器
//减法指令,如下,都是带借位减法,其中A为被减数,即A-Rn-CY=A
9. SUBBA,Rn11 将累加器的值减去寄存器的值减借位 C,结果存回累加器
10. SUBBA,direct21 将累加器的值减直接地址的值减借位 C,结果存回累加器
11. SUBBA,@Ri11 将累加器的值减间接地址的值减借位 C,结果存回累加器
12. SUBBA,#data21 将累加器的值减常数值减借位 C,结果存回累加器
//INC将操作数所在指定单元内容加一,其中操作除了第一条13指令影响就标志为外,其余指令操作均不影响PSW
13. INCA11 将累加器的值加 1;
14. INCRn11 将寄存器的值加 l
15. INCdirect21 将直接地址的内容加 1
16. INC@Ri11 将间接地址的内容加 1
17. INCDPTR11 数据指针寄存器值加 1说明:
将 16位的 DPTR加 1,当 DPTR的低字节(DPL)从 FFH溢出至 00H时,会使高字节(DPH)加1,不影响任何标志位,此是唯一一条16位加一指令,如果低8位有进位,可以直接向高位进位。
//假发指令与假发指令类似,是将其操作数所指定的调用内容减一。
18. DECA11 将累加器的值减 1
19. DECRn11 将寄存器的值减 1
20. DECdirect21 将直接地址的内容减 1
21. DEC@Ri11 将间接地址的内容减 1
//乘除法指令都是1个字节,4个周期
22. MULAB14 将累加器的值与 B寄存器的值相乘,乘积的低位字节存回累加器,高位字节存回,注意AB中间没有空格。
B寄存器说明:
将累加器 A和寄存器 B内的无符号整数相乘,产生 16位的积,低位字节存入 A,高位字节存入 B寄存器。
如果积大于 FFH,则溢出标志位(OV)被设定为 1,而进位标志位为 0
23. DIVAB14 将累加器的值除以 B寄存器的值,结果的商存回累加器,余数存回 B寄存器说明:
无符号的除法运算,将累加器 A除以 B寄存器的值,商存入 A,余数存入 B。
执行本指令后,进位位(C)及溢出位(OV)被清除为 0
24. DAA11 将累加器 A作十进制调整,若(A)3-0>9或(AC)=1,则(A)3-0←(A)3-0+6若(A)7-4>9或 (C)=1,则(A)7-4←(A)7-4+6二、逻辑运算指令
//汇编指令中的十进制调整指令:
//这条指令在进行BCD码加减法运算时,跟在ADD和ADDC指令之后,用来对压缩BCD码就行结果自动修正,使其仍然为压缩BCD码。
在80C51单片机中,DAA不能对减法指令结果进行修正。
//该指令是针对十进制的运算结果进行调整的,其实现的功能如下
*当低4位A0~A3>9或者半进位位AC==1时,自动执行(A)+6->A
*当结果的高四位A4-A7>9或者进位位CY==1时,自动执行(A)+60H->A
*当结果的高四位A4-A7>9,低4位A0~A3>9时,自动执行(A)+66H->A
//这种操作主要用于两个数安位进行逻辑操作,操作结果送至累加器A或者直接寻址单元。
主要逻辑操作有“与”,“或”,“非”,以及位移、取反、清除等。
25. ANLA,Rn11 将累加器的值与寄存器的值做 AND的逻辑判断,结果存回累加器
26. ANLA,direct21 将累加器的值与直接地址的内容做 AND的逻辑判断,结果存回累加器
27. ANLA,@Ri11 将累加器的值与间接地址的内容做 AND的逻辑判断,结果存回累加器
28. ANLA,#data21 将累加器的值与常数做 AND的逻辑判断,结果存回累加器
29. ANLdirect,A21 将直接地址的内容与累加器的值做 AND的逻辑判断,结果存回该直接地址
30. ANLdirect,#data32 将直接地址的内容与常数值做 AND的逻辑判断,结果存回该直接地址
//29,30两条指令,如果direct为I/O口,则进行“读-改-写”操作。
//逻辑或操作,
31. ORLA,Rn11 将累加器的值与寄存器的值做 OR的逻辑判断,结果存回累加器
32. ORLA,direct21 将累加器的值与直接地址的内容做 OR的逻辑判断,结果存回累加器
33. ORLA,@Ri11 将累加器的值与间接地址的内容做 OR的逻辑判断,结果存回累加器
34. ORLA,#data21 将累加器的值与常数做 OR的逻辑判断,结果存回累加器
35. ORLdirect,A21 将直接地址的内容与累加器的值做 OR的逻辑判断,结果存回该直接地址
36. ORLdirect,#data32 将直接地址的内容与常数值做 OR的逻辑判断,结果存回该直接地址
//逻辑异或操作
37. XRLA,Rn11 将累加器的值与寄存器的值做 XOR的逻辑判断,结果存回累加器
38. XRLA,direct21 将累加器的值与直接地址的内容做 XOR 的逻辑判断,结果存回累加器
39. XRLA,@Ri11 将累加器的值与间接地扯的内容做 XOR 的逻辑判断,结果存回累加器
40. XRLA,#data21 将累加器的值与常数作 XOR 的逻辑判断,结果存回累加器
41. XRLdirect,A21 将直接地址的内容与累加器的值做 XOR 的逻辑判断,结果存回该直接地址
42. XRLdirect,#data32 将直接地址的内容与常数的值做 XOR 的逻辑判断,结果存回该直接地址
43. CLRA11 清除累加器的值为 0
44. CPLA11 将累加器的值反相
//RL,RR循环移位指令,RRC,RLC带进位循环以移位指令
45. RLA11 将累加器的值左移一位
46. RLCA11 将累加器含进位 C 左移一位
47. RRA11 将累加器的值右移一位
48. RRCA11 将累加器含进位 C 右移一位
49. SWAPA11 将累加器的高 4 位与低 4 位的内容交换。
(A)3-0←(A)7-4数据转移指令
//内部数据传送指令
50. MOVA,Rn11 将寄存器的内容载入累加器
51. MOVA,direct21 将直接地址的内容载入累加器
52. MOVA,@Ri11 将间接地址的内容载入累加器
53. MOVA,#data21 将常数载入累加器
54. MOVRn, A11 将累加器的内容载入寄存器
55. MOVRn,direct22 将直接地址的内容载入寄存器
56. MOVRn,gdata21 将常数载入寄存器
57. MOVdirect,A21 将累加器的内容存入直接地址
58. MOVdirect,Rn22 将寄存器的内容存入直接地址
59. MOVdirect1,direct232 将直接地址 2 的内容存入直接地址 1
60. MOVdirect,@Ri22 将间接地址的内容存入直接地址
61. MOVdirect,#data32 将常数存入直接地址
62. MOV@Ri,A11 将累加器的内容存入某间接地址
63. MOV@Ri,direct22 将直接地址的内容存入某间接地址
64. MOV@Ri,#data21 将常数存入某间接地址
65. MOVDPTR,#data1632 将 16 位的常数存入数据指针寄存器
//查表指令,注意是在程序存储区查表。
66. MOVCA,@A+DPTR12(A)←((A)+(DPTR))累加器的值再加数据指针寄存器的值为其所指定地址,将该地址的内容读入累加器
67. MOVCA,@A+PC12(PC)←(PC)+1; (A)←((A)+(PC))累加器的值加程序计数器的值作为其所指定地址,将该地址的内容读入累加器。
修正值是从下一条语句开始算起。
//CPU对片外RAM访问(既是外部数据传送指令)
68. MOVXA,@Ri12 将间接地址所指定外部存储器的内容读入累加器(8 位地址)
69. MOVXA,@DPTR12 将数据指针所指定外部存储器的内容读入累加器(16 位地址)
70.MOVX@Ri,A12将累加器的内容写入间接地址所指定的外部存储器(8位地址)
71.MOVX@DPTR,A12将累加器的内容写入数据指针所指定的外部存储器(16位地址)
72.PUSHdirect22将直接地址的内容压入堆栈区
73.POPdirect22从堆栈弹出该直接地址的内容
//调用时有自动入栈出栈操作,而且是PC低位先入栈,高位后入栈。
出栈时PC高位先出栈,低位后出栈。
//PC入栈时,低位先入栈,高位后入栈。
74.XCHA,Rn11将累加器的内容与寄存器的内容互换
75.XCHA,direct21将累加器的值与直接地址的内容互换
76.XCHA,@Ri11将累加器的值与间接地址的内容互换
77.XCHDA,@Ri11将累加器的低4位与间接地址的低4位互换布尔代数运算
78.CLRC11清除进位C为0
79.CLRbit21清除直接地址的某位为0
80.SETBC11设定进位C为1
81.SETBbit21设定直接地址的某位为1
82.CPLC11将进位C的值反相
83.CPL bit21将直接地址的某位值反相
//注意:
在位与与位或运算中,目标操作数只能是C
84.ANLC,bit22将进位C与直接地址的某位做AND的逻辑判断,结果存回进位C
85.ANLC,/bit22将进位C与直接地址的某位的反相值做AND的逻辑判断,结果存回进位C
86.ORLC,bit22将进位C与直接地址的某位做OR的逻辑判断,结果存回进位C
87.ORLC,/bit22将进位C与直接地址的某位的反相值做OR的逻辑判断,结果存回进位C
88.MOVC,bit21将直接地址的某位值存入进位C
89.MOVbit,C22将进位C的值存入直接地址的某位
90.JCrel22若进位C=1则跳至rel的相关地址
91.JNCrel22若进位C=0则跳至rel的相关地址
92.JBbit,rel32若直接地址的某位为1,则跳至rel的相关地址
93.JNBbit,rel32若直接地址的某位为0,则跳至rel的相关地址
94.JBCbit,rel32若直接地址的某位为1,则跳至rel的相关地址,并将该位值清除为0程序跳跃
95.ACALLaddr11 22调用2K程序存储器范围内的子程序(2字节)
96.LCALLaddr16 3 2调用64K程序存储器范围内的子程序(3字节)
97.RET 12从子程序返回
98.RETI 12从中断子程序返回
99.AJMPaddr1122绝对跳跃(2K内)
100.LJMPaddr1632长跳跃(64K内)
101.SJMPrel 22短跳跃(2K内)-128~+127字节
102.JMP@A+DPTR 12跳至累加器的内容加数据指针所指的相关地址
103.JZ rel22累加器的内容为0,则跳至rel所指相关地址
104.JNZ rel22累加器的内容不为0,则跳至rel所指相关地址
105.CJNEA,direct,rel32将累加器的内容与直接地址的内容比较,不相等则跳至rel所指的相关地址(此操作影响进位标志为C,A-direct)
106.CJNEA,#data,rel32将累加器的内容与常数比较,若不相等则跳至rel所指的相关地址
107. CJNE@Rn,#data,rel32 将寄存器的内容与常数比较,若不相等则跳至 rel 所指的相关地址
108. CJNERn,#data,rel32将累加器的内容与常数比较,若不相等则跳至rel所指的相关地址
109.DJNZRn,rel
110.DJNZdirect,rel
取反指令:
CPLA ;A=A非
清零指令:
CLRA ;A=0
例:
把累加器A中的第四位送入300H单元
MOVDPTR #300H
ANLA,#0FH
MOVX@DPTR,A
例:
将累加器A中的低四位的状态通过P1口的高四位输出
ANLA,#0FH
SWAPA
ANLP1,#0FH
ORLP1,A
控制条件转移指令:
这类指令的功能主要是控制程序从原顺序执行地址转移到其他指令地址上。
计算机在运行过程中,有时因为任务要求,程序不能顺序逐条执行指令,需要改变程序运行的方向,或需要调用子程序,或需要从子程序中返回。
此时都需要改变计算器PC中的内容,控制转移类指令可用来实现这一要求。
控制条件转移指令多数不影响程序状态寄存器。
LJMPaddr16 ;addr16->PC
AJMPaddr11 ;(PC)+2->PC,addr11->PC.10~PC0,
SJMPrel ;(PC)+2+rel->PC
第一条指令:
称“ 长转转移指令”。
指令执行结果是将16位地址addr16送程序计数器PC。
第二条指令:
称“绝对转移指令”,也称“短转移指令”。
它吧PC原来的高5位、操作码的第7~5位以及操作数的低8位合并在一起,构成16位转移地址。
因为地址的高5位不变,仅低11位发生变化,因此,寻址范围必须在该指令地址加2后的2KB区域内。
第三条指令:
称“无条件转移指令”。
该指令是双字节,指令的操作数是相对地址,rel是一个带符号的偏移字节数(2的补码),其范围是-128~+127。
负数表示向后转移。
正数表示向前转移。
该指令执行后的目的地址值的计算公式如下:
,如果rel为大于7fH的数,则认为是负数的补码(高位认为是符号位),因为计算机是以补码的形式存储数据的。
目的地址值=本指令地址值+2+rel
例:
1000H LJMP3000H
执行后,PC由1003变为3000H
2030HAJMP60H
执行后,PC由2030H变为2060H
2000HSJMP7
执行后,PC值有2002变为2009
乘法指令:
MUL
除法指令:
CLRA
CPLA
x的补码,加y的补码,等于x+y的补码
DPTR
如果是用c语言编程,可以不必注意这些问题,因为编程软件会自动帮你分配,也不容易出错!
!
数据指针DPTR是80C51中一个功能比较特殊的寄存器。
从结构DPTR是一个16位的特殊功能寄存器, 其高位字节寄存器用DPH表示,低位字节寄存器用DPL表示,DPTR既可以作为一个16位的寄存器来处理,也可以作为两个独立的8位寄存器来使用。
主要功能是存放16位地址,作为片外RAM寻址用的地址寄存器(间接寻址),故称数据指针。
访问片外数据存储器的指令为:
MOVX A,@DPTR 读
MOVX @DPTR,A 写
DPTR的另一个作用是变址寻址,访问程序存储器,做查表指令:
如:
以dptr为基址寄存器,将dptr的内容与累加器a的内容相加得到变址地址
movc a, @a+dptr ; (a)<-----((a)+(dptr))
DB、DW
DB:
定义字节变量,其后的每一个表达式占一个字节。
DW:
定义字变量,其后的每一个表达式的值占二个字节,低字节在低地址,高字节在高地
址。
它们的作用是将所需要的数据放入指定的存储单元中,或者是为程序分配指定数目的存储单元,并根据情况对它们进行初始化
一般的格式为
【单元名称】:
DB表达式(及存储单元内容);【注释】
例如dui240128写入一个中文字,定义中文字变量为
HZ2000:
DB000H,000H,000H,001H,003H,006H,00FH,007H,007H,01FH,003H,01FH,037H,00DH,000H,000H
DB000H,000H,0C7H,080H,03FH,0FBH,0BEH,078H,0EFH,0FDH,0FFH,0FBH,0FBH,08EH,00CH,000H;"编",0
【对$NOMOD51的理解】
很多朋友在看asm代码的时候,对下面的语句不是很了解,下面解说一下。
$NOMOD51
$INCLUDE(REG932.INC)
解释:
$NOMOD51,这一指令功能是使A51不识别8051的所有预定义符号。
$INCLUDE(REG932.INC),这一指令功能使用用户自定义的符号文件。
这两条语句必须配合使用,使用了$INCLUDE(REG932.INC),就必须使用$NOMOD51,否则回因多重定义而产生错误。
//查表指令
66. MOVCA,@A+DPTR12(A)←((A)+(DPTR))累加器的值再加数据指针寄存器的值为其所指定地址,将该地址的内容读入累加器
67. MOVCA,@A+PC12(PC)←(PC)+1; (A)←((A)+(PC))累加器的值加程序计数器的值作为其所指定地址,将该地址的内容读入累加器
//对于66,CPU读取单字节指令后,PC内容自动加1。
其功能能为将新的PC内容与累加器A内无符号数据相加形成地址,并取出该地址内容送至累加器A。
这种指令表很方便,但是只能查询指令做子啊地址以后256字节范围的代码或者常数。
//对于67,以DPTR为基址进行查表,使用前,先给DPTR赋予某些特定查表地址,其范围可以打整个程序存储器64KB空间。
但在此前,如果DPTR已经赋值另作它用,则装入新查表之前必须保存原值,可以用堆栈操作指令PUSH保存。
//对于66,67指令,不改变PC或者DPTR的内容。
例如:
1010H;02H 1011H;04H 1012H;06H 1013H;08H
执行程序如下:
1000H:
MOVA,#0DH
1001H:
MOVC A,@A+PC
1002H:
MOVR0,A
结果:
A=02H,R0=02H,PC=1004H
例如:
7010H:
02H
7011H:
04H
7012H:
06H
7013H:
08H
执行如下程序:
1004H:
MOV A,#10H
1006H:
MOVDPTR,#7000H
1009H:
MOVC A,@A+DPTR
结果:
A=02H,PC=100AH
72.PUSHdirect22将直接地址的内容压入堆栈区
73.POPdirect22从堆栈弹出该直接地址的内容
堆栈操作入栈时,先将堆栈指针SP的内容加一,然后将直接寻址单元中的数据送到(也称“压入”)到SP所指向的单元中。
如果数据已经推入堆栈,则SP指向最后兑入数据所在的存储单元(既是指向栈顶)。
出栈时,(也称“弹出”),其功能是先将SP指针所指向单元的内容送到直接寻址单元中,然后将SP的内容减一,此时SP指向新的栈顶。
由于入栈操作,SP先加一,故实际的栈底为初始SP+1,
累加器A是一个特殊的寄存器,无论A是作为目的寄存器还是作为源寄存器,CPU对它有专门的操作指令,如果使用A的地址E0H直接寻址,虽然也可以完成上述功能,但是机器码要多一个,执行周期要加长。
工作寄存器也有类似的特点
直接寻址是,direct指出的存储单元为片内RAM的00H~7FH单元以及80H~FFH中的特殊功能寄存器SFR。
在间接寻址@Ri中,用当前R0或者R1作为地址指针,利用指令MOV或者MOVX可以访问片内RAM的00~7FH(或00-FFH)和片外RAM的256个单元。
例如把3040H单元存入0DH,
MOVA,#0DH
MOVDPTR,#3040H
MOV@DPTR,A
例如把52片内93H单元的内容送到外部数据存储器3000H单元中:
MOVDPTR,#3000H
MOVR0,#93H
MOV A,@R0
MOV@DPTR,A
例如:
把陈序存储器ROM中起始地址为2000H,长度为30H的数据块送到以3A00H为起始地址的外部RAM中,要求使用两个DPTR数据指针来简化程序,注意使用辅助寄存器AUXR1,其地址为A2H
程序如下:
MOVDPTR,#3A00H
ORLA2H,#1
MOVDPTR,#2000H
MOVR0,30H
LOOP:
MOVC A,@A+DPTR
INCDPTR
ANLA2H,#0
MOVX@DPTR,A
INCDPTR
ORLA2H,#1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 汇编 指令 详解