第3章指令系统Word文档下载推荐.docx
- 文档编号:16815821
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:29
- 大小:229.91KB
第3章指令系统Word文档下载推荐.docx
《第3章指令系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第3章指令系统Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。
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,存储器单元内容如图所示。
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
已知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
编程求双字节减法。
设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后,
求:
B=?
96×
192=18432(4800H)
A=156(F6H),B=13(0DH),执行指令DIVAB后
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求:
RLA求:
RLCA求:
用9位循环指令实现多字节移位:
编程将寄存器R6R5中的双字节数X左移一位。
CLRC
MOVA,R5
RLCA
MOVR5,A
MOVA,R6
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;
设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¬
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第3章 指令系统