第3章指令系统.docx
《第3章指令系统.docx》由会员分享,可在线阅读,更多相关《第3章指令系统.docx(29页珍藏版)》请在冰豆网上搜索。
第3章指令系统
第3章指令系统
一、教学要求:
了解:
单片机的寻址方式和指令系统功能,特别是其位寻址功能。
掌握:
各种寻址方式,常用指令的功能和使用方法及汇编语言程序设计方法。
注意几个中断入口地址在程序存储器中的位置,注意16位数据指针DPTR和两个8位数据R0、R1指针的使用方法。
二、教学内容:
3.1单片机指令格式和寻址方式
3.2单片机指令分类介绍
3.3单片机指令汇总
三、教学重点:
各种寻址方式,常用指令的功能和使用方法及汇编语言程序设计方法。
四、教学难点:
注意几个中断入口地址在程序存储器中的位置,注意16位数据指针DPTR和两个8位数据指针R0、R1的使用方法。
五、建议学时:
3学时。
六、教学内容:
3.1指令格式和寻址方式
一、汇编语言指令格式:
[标号:
]操作码操作数1,操作数2[;注释]
换行表示一条指令结束。
例:
LOOP:
MOVA,#40H;取参数
1、标号:
指令的符号地址。
2、操作码:
指明指令功能。
3、操作数:
指令操作对象。
4、注释行:
说明指令在程序中的作用。
操作码和操作数是指令主体。
MOV—move传送
XCH—exchange交换
ANL—andlogic与逻辑运算
XRL—exclusiveor异或运算
MUL—multiply乘法
RR—rotateright右循环
SJMP—shortjump短跳转
RET—return子程序返回
二、机器语言指令格式:
操作码[操作数1][操作数2]
有单字节、双字节和三字节指令。
汇编语言指令中操作码和操作数是指令主体,称为指令可执行部分,指令表中可查出对应指令代码。
举例:
汇编语言:
机器语言:
MOVA,R0E8H
MOVR6,#32H7E32H
MOV40H,#64H754064H
三、指令寻址方式:
(一)操作数类型:
位(bit)─位寻址区中的一位二进制数据
字节(Byte)─8位二进制数据
字(Word)─16位双字节数据
(二)寻址方式:
1、立即寻址方式:
指令中给出实际操作数据(立即数),一般用于为寄存器或存储器赋常数初值。
举例:
8位立即数:
MOVA,#40H;A←40H
16位立即数:
MOVDPTR,#2100H;DPTR←2100H
2、直接寻址方式:
指令操作数是存储器单元地址,数据放在存储器单元中。
MOVA,40H;A←(40H)
例:
设存储器两个单元的内容如图所示,执行指令MOVA,40H后A=?
直接寻址方式对数据操作时,地址是固定值,而地址所指定的单元内容为变量形式。
思考题:
直接寻址方式指令和立即寻址方式指令的形式有什么不同?
3、寄存器寻址方式:
指令操作数为寄存器名,数据在寄存器中。
例:
MOVA,R0;A←(R0)
设指令执行前A=20H,R0=40H,执行指令后,A=?
,R0=?
4、寄存器间接寻址方式:
指令的操作数为寄存器名,寄存器中为数据地址。
存放地址的寄存器称为间址寄存器或数据指针。
例:
MOVA,@R0;A←((R0))
设指令执行前A=20H,R0=40H,地址为40H存储器单元内容如图所示。
执行指令后,A=?
R0=?
(40H)=?
5、变址间接寻址方式:
数据在存储器中,指令给出的寄存器中为数据的基地址和偏移量。
数据地址=基地址+偏移量。
说明:
1、只对程序存储器;
2、指令形式:
MOVCA,@A+DPTR
MOVCA,@A+PC
JMP@A+DPTR
例:
MOVCA,@A+DPTR;A←((A+DPTR))
设指令执行前A=09H,DPTR=2000H,存储器单元内容如图所示。
执行指令后,A=?
DPTR=?
6、位寻址方式:
指令给出位地址。
一位数据在存储器位寻址区。
(1)内部RAM中的位寻址区:
字节地址为20H~2FH;
(2)专用寄存器的可寻址位:
11个(83位)
表示方法:
1)直接使用位地址;如:
PSW的位6可表示为0D6H
2)位名称表示;或AC
3)字节地址加位数表示;或0D0H.6
4)专用寄存器符号加位数表示。
或PSW.6
例:
MOVC,40H;Cy←(位地址40H)
设指令执行前Cy=1,位地址40H存储器单元如图,执行指令后,Cy=?
7、相对寻址方式:
目的地址=转移指令地址+转移指令字节数+rel(rel为偏移量)
当前PC值加上指令中规定的偏移量rel,构成实际的操作数地址。
例:
SJMPrel
操作:
跳转到的目的地址=当前16位PC值+rel
注意:
1)“当前PC值”指程序中下一条指令所在的首地址,是一个16位数;
2)符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:
-128~+127(80H~7FH)。
在实际编程中,“rel”通常用标号代替。
3.2指令分类介绍
指令功能分类:
数据传送、数据操作、布尔处理、程序控制。
3.2.1数据传送指令
实现寄存器、存储器之间的数据传送。
一、内部传送指令:
片内数据存储器数据传送。
二、外部传送指令:
片外数据存储器数据传送。
三、交换指令:
片内数据存储器数据传送。
四、堆栈操作指令:
片内数据存储器数据传送。
五、查表指令:
程序存储器数据传送。
(一)内部传送指令:
实现片内数据存储器中数据传送。
指令格式:
MOV目的操作数,源操作数
寻址方式:
立即寻址、直接寻址、寄存器寻址、寄存器间址。
MOVA,Rn;A←(Rn),Rn=R0~R7
MOVA,direct;A←(direct)
MOVA,@Ri;A←((Ri)),Ri=R0、R1
MOVA,#data;A←data
MOVRn,direct;Rn←(direct)
MOV@Ri,direct;(Ri)←(direct)
MOVdirect1,direct2;(direct1)←(direct2)
MOVDPTR,#d1d2;DPTR←d1d2
指令机器码:
11101rrrE8~EF
11100101nE5n
1110011iE6、E7
01110100d74d
10101rrrn
1010011in
85n1n2
90d1d2
习题:
找出配对指令,实现反向传送。
例:
顺序执行下列指令序列,求每一步执行结果。
MOVA,#30H
MOV4FH,A
MOVR0,#20H
MOV@R0,4FH
MOV21H,20H
习题:
用两种寻址方式实现,将片内RAM60H单元的数据传送给累加器A。
解:
MOVA,#60H(×)
或MOVA,60H(√)
结果A=32H
或MOVR0,60H
MOVA,@R0(×)
或MOVR0,#60H(√)
MOVA,@R0
说明:
1.一条指令中不能同时出现两个工作寄存器:
非法指令:
MOVR1,R2
MOVR2,@R0
2.间址寄存器只能使用R0、R1。
非法指令:
MOVA,@R2
3.SFR区只能直接寻址,不能用寄存器间接寻址。
非法指令:
MOVR0,#80H
MOVA,@R0
4.指令表(P70):
B:
指令字节数,M:
机器周期数
只有指令表中的指令才有对应指令代码,计算机才能执行。
编程时,不能随意创造发明指令。
(二)外部RAM传送指令:
(MOVX)
实现片外数据存储器和A累加器之间的数据传送。
指令格式:
MOVX目的操作数,源操作数
寻址方式:
片外数据存储器用寄存器间址方式。
1、DPTR作16位数据指针,寻址64KB片外RAM空间:
MOVXA,@DPTR;A←((DPTR))(读)
MOVX@DPTR,A;(DPTR)←A(写)
2、Ri作8位数据指针,寻址256B片外RAM空间(页内寻址):
MOVXA,@Ri;A←((P2Ri))(读)
MOVX@Ri,A;(P2Ri)←A(写)
例:
实现片外数据存储器数据传送(2000H)®(2100H)。
MOVDPTR,#2000H
MOVXA,@DPTR
MOVDPTR,#2100H
MOVX@DPTR,A
片外数据存储器不能直接寻址。
下列为非法指令:
MOVXA,2000H
MOVX2100H,2000H
思考题:
为什么对DPTR的数据传送使用内部传送指令?
习题:
将片外RAM0000H单元的数据传送到片内RAM的60H单元。
(三)外部ROM传送指令(查表指令):
(MOVC)
实现从程序存储器读取数据到A累加器,只能使用变址间接寻址方式。
多用于查常数表程序,可直接求取常数表中的函数值。
1.DPTR为基址寄存器:
MOVCA,@A+DPTR;A←((A+DPTR))(读)
查表范围为64KB程序存储器任意空间,称为远程查表指令。
2.PC为基址寄存器:
MOVCA,@A+PC;A←((A+PC))(读)
常数表只能在查表指令后256B范围内,称为近程查表指令。
P49:
例1:
以查表方法把累加器中的十六进制数转换为ASCII码,并送回累加器中。
程序如下:
指令地址源程序
ORG2000H
2000HBA:
INCA
2001MOVCA,@A+PC
2002RET
2003DB30H
2004DB31H
2005DB32H
……
2011DB45H
2012DB46H
例2:
查表法求Y=X2。
设X(0≤X≤15)在片内RAM的20H单元中,要求查表求Y,存入片内RAM21H单元。
方法1:
程序:
ORG1000H
SQU:
MOVDPTR,#3000H;确定表首地址(基地址)
MOVA,20H;取X(变量:
偏移量)
MOVCA,@A+DPTR;查表求Y=X2
MOV21H,A;保存Y(结果)
RET;子程序结束
……;其它程序段
ORG3000H;常数表格首地址
TAB:
DB00,01,04,09,…,225;平方表
END
方法2:
指令地址源程序
ORG1000H;程序起始地址
1000HSQU:
MOVA,20H;取X
1002HADDA,#3;修正偏移量
1004HMOVCA,@A+PC;查表求Y=X2(PC=1005H)
1005HMOV21H,A;存结果
1007HRET;子程序结束
1008HTAB:
DB00,01,04…;平方表
100BHDB09,…,225
思考题:
当0≤X≤255时,如何用查表法编程求Y=X2。
(四)交换指令:
实现片内RAM区的数据双向传送。
1.字节交换指令
XCHA,Rn;A←→(Rn)
XCHA,@Ri;A←→((Ri))
XCHA,direct;A←→(direct)
例:
设A=29H,执行指令XCHA,2AH后,A=?
,(2AH)=?
习题:
将片内RAM60H单元与61H单元的数据交换。
XCH60H,61H;←对吗?
不对!
!
2.半字节交换指令:
XCHDA,@Ri;A0~3«((Ri))0~3
SWAPA;A4~7«A0~3
例:
将片内RAM2AH和2BH单元中的ASCII码转换成压缩式BCD码存入20H单元。
习题:
交换片内RAM40H单元和41H单元的低半字节。
(五)堆栈操作指令:
入栈指令:
PUSHdirect;SP←SP+1,(SP)←(direct)
出栈指令:
POPdirect;(direct)←(SP),SP←SP-1
“先加后压”“先弹后减”
例:
设A=02H,B=56H,执行下列指令后,SP=?
,A=?
,B=?
SBR:
MOVSP,#30H;设栈底
PUSHA
PUSHB
MOVA,#00H
MOVB,#01H
…
POPB
POPA
练习:
说明程序执行过程中,SP的内容及堆栈中内容的改变过程。
程序如下:
MOVSP,#30H
MOVA,#20H
MOVB,#30H
PUSHA
PUSHB
…….
POPA
POPB
习题:
找出指令错误并改正:
1.MOVA,#1000H;A←1000H(A装1个字节数)
2.MOVXA,1000H;A←(1000H)片外RAM(DPTR、Ri)
3.MOVCA,1000H;A←(1000H)片外ROM(DPTR、PC)
4.MOVX60H,A;片外RAM(60H)←A(应为MOV)
5.MOVR0,60H;片内RAM:
(61H)←(60H)
MOV61H,@R0(片内RAM可直接寻址)
6.XCHR1,R2;R1←R2(必须有A参加)
7.MOVXDPTR,#2000H;DPTR←2000H(应为MOV)
8.MOVX60H,@DPTR;片内RAM←片外RAM(必须有A参加)
3.2.2算术运算指令
与数据传送指令不同,多数算术运算指令会影响标志位的状态,即CPU执行算术运算指令后,根据数据操作情况自动设置标志位的状态。
MCS-51的程序状态字寄存器PSW为标志寄存器。
其格式如下:
字节地址为D0H
1.标志位(自动设置状态):
1)Cy:
进位标志位
保存运算后最高位的进位/借位状态,当有进位/借位,Cy=1,否则Cy=0。
2)AC:
辅助进位标志位
保存低半字节的进位/借位状态,当D3产生进位/借位,AC=1,否则AC=0。
用于十进制调整。
3)OV:
溢出标志位
OV=Cy7⊕Cy6,补码运算产生溢出OV=1,否则OV=0。
4)P:
奇偶标志位
反映累加器A中数据的奇偶性。
当1的个数为奇数,P=1,否则P=0。
2.用户选择位(编程设置状态)
1)F0、F1:
用户自定义标志位。
2)RS1、RS0:
工作寄存器区选择位。
复位时,PSW=00H
例:
复位后,设置使用工作寄存器3区,其余标志位不变。
解:
MOVPSW,#18
算术运算指令:
完成片内RAM和A中数据的加减乘除运算。
一.加减指令(读-修改-写):
1.加法指令:
1)不带进位加法:
ADDA,源操作数
如:
ADDA,R2;A←A+R2,影响Cy、OV、AC、P
例1:
已知A=3BH,PSW=0,执行指令ADDA,#3BH后
求:
A=76H?
Cy=0?
OV=0?
AC=1?
P=1?
PSW=?
(01000001=41H)
2)带进位加法:
ADDCA,源操作数
如:
ADDCA,R2;A←A+R2+Cy,影响Cy、OV、AC、P
例:
A=9AH,R2=E3H,PSW=0,执行指令ADDCA,R2后
求:
A=?
Cy=?
OV=?
AC=?
P=?
PSW=?
(10000100=84H)
带进位加法指令ADDC用于多字节运算:
例:
设双字节数X存在片内RAM41H、40H单元,Y存在42H、43H单元,编程求Z=X+Y,并存入片内RAM单元44H、45H、46H。
(比较P52例3.3)
MOVA,40H
ADDA,42H
MOV44H,A
MOVA,41H
ADDCA,43H
MOV45H,A
MOVA,#00H
ADDCA,#00H
MOV46H,A
RET
BCD调整指令:
BCD:
Binary-Coded-Decimal(二进制编码的十进制)
DAA;把A中按二进制相加后的结果调整成按BCD数相加的结果
调整原因:
1、相加结果大于9,进入无效编码区;
2、相加结果有进位,跳过无效编码区。
调整方法:
进行加“6”修正。
十进制加法指令:
仅对加法结果进行调整ADDA,源操作数
DAA
进位十进制加1法指令:
ADDCA,源操作数
DAA
作业:
BCD码加法编程。
设X、Y为4位压缩BCD码,求Z=X+Y。
2.减法指令:
SUBBA,源操作数;带借位减法指令
如:
SUBBA,R2;A←A-R2-Cy,
;影响Cy、OV、AC、P
例:
A=5AH,R2=5AH,Cy=0,执行下列指令
SUBBA,R2
求:
A=?
Cy=?
OV=?
P=?
AC=?
习题:
编程求双字节减法。
设X、Y存在片内RAM60H起始单元,计算Z=X-Y。
思考:
有不带借位的减法指令吗?
3.增量、减量指令:
INC单操作数
如:
INCR2;R2←R2+1
DEC单操作数
如:
DECR2;R2←R2-1
INCDPTR;DPTR←DPTR+1
不影响标志位状态。
注意:
没有指令DECDPTR
可用指令DECDPL代替
4.乘除指令:
MULAB;BA←A×B,Cy←0,
;当积高字节B=0,OV←0;B≠0,则OV←1
DIVAB;A÷B,A←商,B←余数,Cy←0,
;当除数B=0,OV←1;B≠0,则OV←0
例:
A=96(60H),B=192(C0H),执行指令MULAB后,
求:
A=?
B=?
Cy=?
OV=?
P=?
解:
96×192=18432(4800H)
例:
A=156(F6H),B=13(0DH),执行指令DIVAB后
求:
A=?
B=?
Cy=?
OV=?
P=?
解:
156÷13=18(12H),余数=12(0CH)。
思考题:
如何实现多字节数据的乘除运算。
3.2.3逻辑运算指令
一、单操作数指令(A累加器为操作数):
1、A清0指令:
CLRA;A←0
2、A取反指令:
CPLA;A←A
3、循环移位指令:
1)8位循环指令:
RLA;A循环左移一位
RRA;A循环右移一位
2)9位循环指令:
RLCA;带Cy循环左移一位
RRCA;带Cy循环右移一位
例:
设A=11000101B,Cy=0,分别执行下列单条指令:
CPLA求:
A=?
Cy=?
RLA求:
A=?
Cy=?
RLCA求:
A=?
Cy=?
用9位循环指令实现多字节移位:
例:
编程将寄存器R6R5中的双字节数X左移一位。
CLRC
MOVA,R5
RLCA
MOVR5,A
MOVA,R6
RLCA
MOVR6,A
思考题:
如何将寄存器R6R5中的双字节数X右移一位。
二、双操作数逻辑运算指令(对位逻辑运算):
ANL、ORL、XRL
例:
A=01××××××B,×表示随机状态,为1或0,下述一组指令执行后,A的值如何?
XRLA,#0C0H;将累加器A的内容D7、D6取反
ORLA,#03H;将累加器A的内容D1、D0置1
ANLA,#0E7H;将累加器A的内容D4、D3清0
解:
执行上述指令后,A=10×00×11B。
习题1:
如何将累加器A中的数据高4位清0,低位不变?
习题2:
如何将寄存器R2中的数据奇数位取反,偶数位不变?
3.2.4布尔变量操作指令
对片内RAM中位寻址区操作。
位累加器Cy和位地址bit。
一.位传送:
MOVC,bit;Cy←(bit)
MOVbit,C;(bit)←Cy
例:
将位地址20H的一位数传送到位地址30H中:
MOVC,20H
MOV30H,C
二.位清0、置1、取反(CLR、SETB、CPL):
CLRC;Cy←0
CLR40H;(位地址40H)←0
三.逻辑运算(ANL、ORL):
ANLC,40H;C←C∧(40H)
ANLC,~40H;C←C∧(40H)
例:
设Cy=1,(位地址40H)=1,执行指令
ANLC,~40H后,Cy=?
,(位地址40H)=?
位地址表示法:
位地址40H,位寄存器F0,字节加位ACC.0
习题:
设累加器A中数据为29H=00101001B,Cy=0,
执行指令ORLC,0E3H后,Cy=?
3.2.5转移指令
转移指令通过改写PC的当前值,从而改变CPU执行程序的顺序,使程序发生跳转。
按转移条件分类:
1)无条件转移:
执行无条件转移指令,程序无条件转移到指定处。
2)条件转移:
指令中给出转移条件,执行指令时,先测试条件:
若满足条件,则程序发生转移;否则,仍顺序执行程序。
按转移方式分类:
1)绝对转移:
指令给出转移目的的绝对地址d2d1,执行指令后,PC←d2d1。
例:
地址源程序
1000HLJMP2000H(长转移)
1003H…
…
2000H…;转移目的指令
2)相对转移:
指令给出转移目的与转移指令的相对
偏移量rel,执行指令后,PC←PC+rel。
目的地址=PC+字节数+rel
例:
地址源程序
1000HSJMP02(短转移)(2字节)
…
1004H…;转移目的指令
一、无条件转移指令:
1.长转移指令:
LJMPaddr16(d2d1);PC←d2d1
指令机器码:
02d2d1
指令转移范围:
64KB
2.绝对转移指令:
AJMPaddr11;PC←PC+2
(2个字节);PC10~0¬addr11
PC15~11不变
指令机器码:
addr11~900001addr8~1
指令转移范围:
2KB(32个)
转移时要求转移前后保持PC15~11不变。
例:
1030HAJMP100H
指令机器码:
2100H
目的地址为:
1100H
3.短转移指令:
SJMPrel;PC¬