第3章指令系统.docx

上传人:b****4 文档编号:3909620 上传时间:2022-11-26 格式:DOCX 页数:29 大小:229.91KB
下载 相关 举报
第3章指令系统.docx_第1页
第1页 / 共29页
第3章指令系统.docx_第2页
第2页 / 共29页
第3章指令系统.docx_第3页
第3页 / 共29页
第3章指令系统.docx_第4页
第4页 / 共29页
第3章指令系统.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

第3章指令系统.docx

《第3章指令系统.docx》由会员分享,可在线阅读,更多相关《第3章指令系统.docx(29页珍藏版)》请在冰豆网上搜索。

第3章指令系统.docx

第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¬

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1