第3章 80C51单片机指令系统_第1页
第3章 80C51单片机指令系统_第2页
第3章 80C51单片机指令系统_第3页
第3章 80C51单片机指令系统_第4页
第3章 80C51单片机指令系统_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

教学基本要求:

(1)、了解单片机的指令系统、编程语言等基本概念;(2)、熟悉单片机汇编语言指令格式中符号的意义;(3)、熟悉单片机汇编语言指令系统每条指令的功能;(4)、掌握单片机指令系统的7种寻址方式;(5)、掌握单片机指令系统每类指令的用法。教学重点:(1)、单片机指令系统的寻址方式;(2)、片内、外RAM单元之间的数据传送;(3)、加法运算指令组的用法;(4)、逻辑运算指令组的用法;(5)、控制转移指令组的用法。第3章80C51单片机指令系统教学难点:(1)、寄存器间接寻址、变址寻址、相对寻址等概念;(2)、堆栈操作指令的应用。(3)、十进制调整指令DAA的应用;(4)、控制转移指令转移目的地址、偏移量rel的计算;(5)、子程序调用、返回指令的用法。3.1单片机指令系统概述1、指令系统概述指令:是供用户使用的单片机的软件资源,是单片机所能接受的软件工作者的命令的最小工作单位。指令系统:单片机所能执行的指令集合。机器语言:指令以二进制码来表示。汇编语言:指令以助记符形式来表示。机器语言程序:使用机器语言编写的程序。汇编语言程序:使用汇编语言编写的程序。注意:MCS-51单片机指令系统不具有通用性,因此,用其编写的汇编语言程序也不具有通用性,不能移植。

MCS-51系列单片机的汇编语言指令系统共有111条指令,其中49条为单字节指令,45条为双字节指令,17条为三字节指令。从指令执行的时间来看,单机器周期指令64条,双机器周期指令45条,四机器周期指令2条。

MCS-51单片机的指令系统共有33个功能,用汇编语言编程时,只需44个助记符。(1)、数据传送类指令(29条)(2)、算术运算类指令(24条)(3)、逻辑运算及移位类指令(24条)(4)、控制转移类指令(17条)(5)、位操作类指令(17条)2、MCS-51单片机指令格式指令格式:即指令的表示方法,其内容包括指令的长度和指令内部信息的安排。采用助记符表示的汇编语言指令格式如下:[标号:]操作码助记符[目的操作数],[源操作数][;注释]

(1)一条指令中标号、操作数、注释部分可有可无,但操作码部分必不可少。(2)标号是程序员根据编程需要给指令设定的符号地址,标号由1~8个字符组成,不能用系统规定的寄存器名,也不能用指令系统中的助记符名称,它的第一个字符必须是英文字,不能是数字或其它符号,标号后必须用冒号“:”。(3)操作码表示指令的操作种类,用来规定指令进行什么操作,常用操作码的英文名称或缩写形式来表示,操作码后必须有一个或多哥空格“”作间隔符。

例如:MOV表示数据传送操作,ADD表示加法操作。(4)操作数表示指令操作的对象,它可能是一个具体的数据,也可能是指出到哪里取得数据的地址或符号。一条指令中,可能没有(RET指令),也可能有一个(CPLA指令)、两个(MOVA,#00H指令,MOV30H,#50H指令)或三个(CJNEA,#00H,NEXT)操作数。根据操作数的位置的不同,可分为目的(左)操作数和源(右)操作数,操作数之间也以逗号“,”相隔(乘法指令MULAB和除法指令DIVAB除外)。(5)注释是对指令的解释说明,用以提高程序的可读性。注释前必须加分号“;”。

(6)书写汇编语言指令必须注意以上规则。

3、指令格式中符号意义说明

Rn:当前寄存器组的8个通用寄存器R0~R7(n=0~7)。

Ri:当前寄存器组中的2个寄存器RO,R1,可作地址指针,即间接寻址的寄存器(i=0,1)。

direct:内部RAM的8位地址,既可以是内部RAM的低128个单元地址(0~127),也可以是专用寄存器的单元地址或符号,如I/O端口,控制寄存器,状态寄存器等(128~255)。

#data:包含在指令中的8位立即数。

#data16:包含在指令中的16位立即数。

addr16:表示16位目的地址,只限于在LCALL和LJMP指令中使用,目的地址范围是64KB的程序存储器地址空间。

addr11:表示11位目的地址,只限于在ACALL和AJMP指令中使用,目的的地址必须存放在与下一条指令第一个字节同一个2KB程序存储器地址空间之内。

Rel:相对转移指令中的偏移量,为8位带符号补码数。

DPTR:数据指针,可用作16位的地址寄存器。

Bit:内部RAM或专用寄存器中的直接寻址位。

A:累加器(直接寻址方式的累加器表示为Acc)

B:B寄存器,用于MUL和DIV指令中。

C:进位标志位或布尔处理机中的累加位。

@:为间址寄存器或基址寄存器的前缀标志。

/:位操作数的前缀,表示对该位状态取反。(X):某寄存器或某单元中的内容。

((X)):由X间接寻址的单元中的内容。←:表示将箭头右边的内容传送至箭头的左边。3.280C51单片机指令寻址方式

MCS-51单片机指令系统中的大多数指令执行时都需要使用操作数,而在单片机中只有指定了操作数的存储单元才能得到操作数,因此,要得到操作数,就只需找到操作数存放的单元即可。所谓寻址方式:即如何确定参与操作的数的真正单元。根据操作数单元指定方法的不同,就有了不同的寻址方式。

MCS-51单片机共有7种寻址方式。由于指令中的操作数有目的(左)操作数和源(右)操作数之分,因此,在讲解寻址方式时,均以源(右)操作数为例。(1)寄存器寻址方式

a)、寄存器寻址就是指操作数在寄存器中,因此,指定了寄存器就得到了操作数。

b)寄存器寻址的指令中,以符号名称来表示寄存器。例:假设原来(A)=30H,(R1)=40H,现执行指令MOVA,R1;指令功能:将R1中的内容(操作数)送A中;

指令执行过程:A←(R1);

指令执行结果:(A)=(R1)=40H。

c)寻址范围:1)当前工作寄存器组R0~R7;

2)部分专用寄存器A,AB,DPIR等。例:MOVP1,A;将累加器A的内容送到P1口

MOVP1,R4;将寄存器R4的内容送到P1口

CLRA;将累加器A清0CPLA;将累加器A中的内容取反

MULAB;将累加器A的内容与寄存器B的内容相乘(2)直接寻址方式

a)直接寻址即指令所需的操作数直接以操作数存放的单元地址的形式给出。例:假设内部RAM3AH单元的内容是88H,累加器A的内容是10H,现执行指令MOVA,3AH。指令功能:将3AH中的内容(操作数)送A中;

指令执行过程:A←(3AH);指令执行结果:(A)=(3AH)=88H。

b)采用直接寻址的指令一般是双字节或三字节指令。

c)直接寻址是访问专用寄存器的唯一方法。

d)寻址范围:

1)内部RAM低128个单元,低128单元地址在指令中须以直接单元地址形式给出;

2)专用寄存器,专用寄存器除以单元地址形式给出外,还可以以寄存器符号的形式给出。例:MOVP1,20H;将内部RAM20H单元的内容传送到P1口

MOVA,P0;将P0口的内容传送到AMOVA,80H;将P0口的内容传送到A(3)寄存器间接寻址方式

a)寄存器间接寻址是指指令所需的操作数是通过寄存器间接得到的,寄存器中存放的则是操作数存放的单元地址。例:假设内部RAM3AH单元的内容是65H,寄存器R0的内容是3AH,现执行指令MOVA,@R0。指令功能:先将R0的内容3AH作为内部RAM的单元地址,再将内部RAM单元地址为3AH中的内容65H(操作数)送A中。

指令执行过程:A←((R0))或A←(3AH)指令执行结果:(A)=((R0))=(3AH)=65H。

b)间址寄存器:R0、R1、DPTR、SP。

指令中应在间址寄存器名之前加前缀@,SP除外。

c)寻址范围:

1)内部RAM低128单元,可使用R0,R1作间址寄存器,其通用形式为@Ri(I=0或1)。例:MOVA,@R1;将R1指示的地址单元中内容传送至A中。假设(R1)=40H,(40H)=90H,即把内部RAM中40H单元中的内容90H送到A。

2)外部(片外)RAM64KB单元,可使用DPTR作间址寄存器,其形式为@DPTR。例:MOVXA,@DPTR;将DPTR指示的外部RAM地址单元中的内容传送至A。假设(DPTR)=1000H,(1000H)=80H,即把外部RAM1000H单元中的内容80H送到A。

3)外部(片外)RAM的低256单元(0000H~00FFH),它是一个特殊的寻址区,既可以使用DPTR作间址寄存器寻址,也可以使用R0或R1作间址寄存器寻址。例:假设外部RAM0020H单元中的内容是45H,现需将其送A中。

MOVDPTR,#0020H;MOVXA,@DPTR

或MOVR0,#20H;MOVXA,@R0;

4)在执行堆栈操作指令(PUSH,POP)时,也算为寄存器间接寻址,即以堆栈指针(SP)作间址寄存器的间接寻址方式。

例:PUSHACC;将A中的内容压入堆栈

POPACC;将堆栈中的内容弹出,送到A(4)立即寻址方式

a)立即寻址即指令所需的操作数已在指令中直接给出。通常,把直接出现在指令中的操作数称之为立即数。为了与直接寻址指令中的直接单元地址相区别,一般应在立即数前面加“#”标志。

b)采用立即寻址的指令,一般为双字节。第一个字节为指令的操作码,第二个字节为立即数。

c)寻址范围:程序存储器空间。

例:MOVA,#40H;指令功能:将程序存储器中某单元的内容3AH(立即数)送A中

指令执行过程:A←3AH

指令执行结果:(A)=3AHd)除8位立即数外,MCS-51指令系统中还有一条16位立即寻址指令,即:MOVDPTR,#data16,其功能是把16位立即数送数据指针DPTR。

例:MOVDPTR,#1000H;指令功能:将程序存储器中某单元的内容1000H(立即数)送DPTR中

MOVP1,#55H ;将立即数55H送P1口

MOV 20H,#55H ;将立即数55H送20H单元

MOV R0,#20H;将立即数20H送寄存器R0(5)变址寻址方式

a)变址寻址用于访问程序存储器中的常数或数据表格。变址寻址即是以DPTR或PC作为基址寄存器,以累加器A为变址寄存器,并以两者的内容相加形成16位地址作为目的操作数地址,以达到访问程序存储器中的常数或数据表格的目的。

b)寻址范围:程序存储器空间。

c)指令数目:三条,均为一字节指令

MOVCA,@A+DPTR;指令执行过程:A←((A)+(DPTR))

指令执行结果:(A)=((A)+(DPTR))

MOVCA,@A+PC;指令执行过程:A←((A)+(PC))指令执行结果:(A)=((A)+(PC))

JMP@A+DPTR

指令执行过程:PC←((A)+(DPTR))指令执行结果:(PC)=((A)+(DPTR))

d)注意:三条指令中A的内容均为8位二进制无符号数。

(6)位寻址方式

a)位寻址即对二进制数据位进行寻址。

b)寻址范围:

1)、内部RAM中的位寻址区(单元地址20H~2FH),128个位,位地址是00H~7FH。位地址区中的位有两种表示方法:

直接使用位地址表示;单元地址加位数表示例:MOVC,20H;将位地址为20H的位状态传送给累加位C。

例:MOVC,24H.0;将位地址为20H的位状态传累加位C。例:SETB3DH;将内部RAM位寻址区中的3DH位置1。假设内部RAM27H单元的内容是00H,执行SETB3DH后,由于3DH对应内部RAM27H的第5位,因此该位变为1,也就是27H单元的内容变为20H。该指令的执行过程如图所示。

2)、专用寄存器的可寻址位可供位寻址的专用寄存器有11个,PSW,IPIE,PO,P1,P2,P3,SCON,A,TCON,B,实有可寻址位83位。专用寄存器的可寻址位有四种表示方法:

直接使用位地址表示例:MOVC,D5H;将PSW中位地址为D5H的位状态传给累加位C

单元地址加位数表示例:MOVC,D0H.5;将PSW中位地址为D5H的位状态传给累加位C

位名称表示例:MOVC,F0;将PSW中位地址为D5H的位状态传给累加位C

专用寄存器符号加位数表示例:MOVC,PSW.5;将PSW中位地址为D5H的位状态传给累加位C(7)相对寻址方式

a)相对寻址是为解决程序转移而设置的,为转移指令所用。

相对寻址是将程序计数器PC的当前值与指令中给出的地址偏移量(rel)相加,其和为转移指令的目的地址。注意:PC当前值是指执行完该转移指令后的PC值,即转移指令的PC值加上转移指令的字节数。转移指令转移到的目的地址=转移指令PC当前值+偏移量rel=转移指令首地址+转移指令字节数+rel。偏移量rel是一个带符号的8位二进制补码数,所能表示数的范围为-128~+127。

b)寻址范围:程序存储器空间具体地说,相对转移是以转移指令所在地址为基点,向前(地址增加方向)最大可转移(127+转移指令字节数)个单元地址,向后(地址减少方向)最大可转移(128-转移指令字节数)个单元地址。3.380C51单片机指令分类介绍

MCS-51单片机指令系统包括111条指令,按功能可以划分为以下5类:数据传送类指令(29条);

算术运算类指令(24条);逻辑运算类指令(24条);控制转移类指令(17条);位操作类指令(17条);3.3.1数据传送类指令

a)指令数目:29条;

b)指令通用格式:助记符操作码目的操作数,源操作数;

c)指令功能:数据传送,属于数据复制性质;

d)助记符类型(8种):

MOV,MOVC,MOVX

XCH,XCHD,SWAP,PUSH,POPe)寻址方式源操作数:寄存器,寄存器间接、直接、立即、变址寻址;目的操作数:寄存器,寄存器间接、直接寻址1、内部RAM数据传送指令组

a)立即数传送指令指令格式相应操作操作结果说明MOVA,#dataA←data(A)=dataMOVdirect,#datadirect←data(direct)=dataMOVRn,#dataRn←data

(Rn

)=datan=0~7MOV@Ri,#data(Ri)←data((Ri))=datai=0,1MOVDPTR,#data16DPTR←data16(DPTR)=data16例:MOVA,#20H;指令执行后(A)=20H例:MOV20H,#20H;指令执行后(20H)=20H例:MOVSP,#60H;指令执行后(SP)=60H例:MOVB,#30H;指令执行后(B)=30H例:MOVR1,#20H;指令执行后(R1)=20H例:MOVR0,#20H;指令执行后(R0)=20HMOV@R0,#30H;指令执行后((R0))=30H或(20H)=30H例:MOVDPTR,#1020H;指令执行后(DPTR)=1020H;(DPH)=10H,(DPL)=20H

本指令是三字节指令,第一个字节是操作码信息,第二、第三字节分别是操作数(立即数)的高、低8位信息,其二进制目标代码存放格式如下:操作码10010000程序存储器立即数高8位(DPH)00010000立即数低8位(DPL)00100000

b)内部RAM单元之间的数据传送指令指令格式相应操作操作结果MOVdirect2,direct1direct2←(direct1)(direct2)=(direct1)MOVdirect,Rndirect←(Rn)(direct)=(Rn)MOVRn,directRn←(direct)(Rn)=(direct)MOVdirect,@Ridirect←((Ri))(direct)=((

Ri))MOV@Ri,direct(Ri)←(direct)((Ri))=(direct)例:MOV30H,20H;指令执行后(30H)=(20H)例:MOVP1,20H;指令执行后(P1)=(20H)例:MOVP2,P0;指令执行后(P2)=(P0)例:MOV40H,P3;指令执行后(40H)=(P3)例:MOV0A0H,R7;指令执行后(P2)=(R7)例:MOVPSW,R1;指令执行后(PSW)=(R1)例:MOVR2,20H;指令执行后(R2)=(20H)例:MOVR3,B;指令执行后(R3)=(B)例:MOV40H,@R0;指令执行后(40H)=((R0))例:MOVP0,@R1;指令执行后(P0)=((R1))例:MOV@R0,0A0H;指令执行后((R0))=(P2)例:MOV@R1,30H;指令执行后((R1))=(30H)

c)通过累加器的数据传送指令指令格式相应操作操作结果MOVA,RnA←(Rn)(A)=(Rn)MOVRn,ARn←(A)(Rn)=(A)MOVA,directA←(direct)(A)=(direct)MOVdirect,Adirect←(A)(direct)=(A)MOVA,@Ri

A←((Ri))(A)=((Ri))MOV@Ri,A(Ri)←(A)((Ri))=(A)例:MOVA,R0;

指令执行后(A)=(R0)例:MOVR3,A;指令执行后(R3)=(A)例:MOVA,B;

指令执行后(A)=(B)例:MOVA,40H;指令执行后(A)=(40H)例:MOVPSW,A;指令执行后(PSW)=(A)例:MOV60H,A;指令执行后(60H)=(A)例:MOVA,@R0;指令执行后(A)=((R0))例:MOV@R1,A;指令执行后((R1))=(A)(3)外部RAM数据传送指令组指令格式相应操作操作结果MOVXA,@DPTRA←((DPTR))(A)=((DPTR))MOVX@DPTR,A(DPTR)←(A)((DPTR))=(A)MOVXA,@RiA←((Ri))(A)=((Ri))MOVX@Ri,A(Ri)←(A)((Ri))=(A)例:将外部RAM2000H单元的内容20H送至A中。

MOVDPTR,#2000H;外部RAM2000H单元地址作为16位立即数送数据指针DPTRMOVXA,@DPTR;外部RAM2000H单元的内容20H送A

(A)=((DPTR))=(2000H)=20H例:将累加器A中的内容40H送至外部RAM4000H单元中。

MOVDPTR,#4000H;外部RAM4000H单元地址作为16位立即数送数据指针DPTRMOVX@DPTR,A;A的内容40H送外部RAM4000H单元((DPTR))=(4000H)=(A)=40H例:将外部RAM0050H单元的内容20H送至A中。

a)MOVDPTR,#0050H;外部RAM0050H单元地址作为16位立即数送数据指针DPTRMOVXA,@DPTR;外部RAM0050H单元的内容20H送A

(A)=((DPTR))=(2000H)=20Hb)MOVR0,#50H;外部RAM0050H单元地址作为8位立即数送间址寄存器R0MOVXA,@R0;外部RAM0050H单元的内容20H送A

(A)=((R0))=(50H)=20H例:将累加器A中的内容40H送至外部RAM0050H单元中。

a)MOVDPTR,#0050H;外部RAM0050H单元地址作为16位立即数送数据指针DPTR

MOVX@DPTR,A;A的内容40H送外部RAM0050H单元((DPTR))=(0050H)=(A)=40Hb)MOVR1,#50H;外部RAM0050H单元地址作为8位立即数送间址寄存器R1MOVX@R1,A;A的内容40H送外部RAM0050H单元((R1))=(50H)=(A)=40H例:将内部RAM60H单元的内容40H送至外部RAM4000H单元中。

MOVA,60H;将60H单元的内容40H先送A中,(A)=40HMOVDPTR,#4000H;外部RAM4000H单元地址送DPTRMOVX@DPTR,A;A的内容40H送外部RAM4000H单元((DPTR))=(4000H)=(A)=40H例:将外部RAM4000H单元的内容40H送至内部RAM60H单元中。

MOVDPTR,#4000H;外部RAM4000H单元地址送DPTRMOVXA,@DPTR;外部RAM4000H单元的内容40H送A

(A)=((DPTR))=(4000H)==40HMOV60H,A;将A的内容40H送60H单元,(60H)=40H例:将外部RAM4000H单元内容40H送至外部RAM0050H单元中。

MOVDPTR,#4000H;外部RAM4000H单元地址送DPTRMOVXA,@DPTR;外部RAM4000H单元的内容40H送A

(A)=((DPTR))=(4000H)=40HMOVR0,#50H;外部RAM0050H单元地址送间址寄存器R0MOVX@R0,A;外部RAM(0050H)=(A)=40H例:将内部RAM60H单元内容40H送至内部RAM50H单元中。

a)MOV50H,60H;内部RAM60H单元内容40H送至内部RAM50H单元中,(50H)=(60H)=40Hb)MOVA,60H;先将内部RAM60H单元内容40H送A,(A)=40HMOV50H,A;再将A的内容送内部RAM50H单元,(50H)=40H注意:

1)外部RAM与外部RAM单元之间、外部RAM与内部RAM单元之间的数据传送必须采用寄存器间接寻址的方式,而且必须通过累加器A进行;

2)MCS-51指令系统中没有专用的存储器读写指令,实际上外部数据存储器数据传送指令就是外部RAM的读写指令;

3)内部RAM单元之间的数据传送可有多种寻址方式。(4)程序存储器数据传送指令组程序存储器数据传送指令组既可用于内部程序存储器,也可用于外部程序存储器。程序存储器数据传送指令组的指令只有两条,均为单字节指令,采用变址寻址方式。数据只能从程序存储器单向读出,而且也必须通过累加器A进行传送。

MOVCA,@A+DPTR;

MOVCA,@A+PC

这两条指令用于访问程序存储器中的数据表格,因此也称之为查表指令。其功能非常重要,将在第四章汇编语言程序设计中讲解。(5)数据交换指令组数据交换主要在内部RAM单元与A之间、A的高、低4位之间进行,有整字节和半字节两种交换。指令类型指令格式相应操作整字节交换XCHA,

Rn(A)⇌(Rn)XCHA,direct(A)⇌(direct)XCHA,@Ri(A)⇌((Ri))半字节交换XCHDA,@Ri(A)3~0⇌((Ri))3~0A高低半字节交换SWAPA(A)3~0⇌(A)7~4例:假设(A)=38H,(R0)=54H,执行指令XCHA,R0;结果为(A)=54H,(R0)=38H。例:假设(A)=88H,(30H)=45HH,执行指令XCHA,30H;

结果为(A)=45H,(30H)=88H。例:假设(A)=34H,(R1)=50H,(50H)=56H,执行指令XCHA,@R1;

结果为(A)=56H,((R1))=(50H)=34H。例:假设(A)=34H,(R1)=50H,(50H)=56H,执行指令XCHDA,@R1;

结果为(A)=36H,((R1))=(50H)=54H。例:假设(A)=34H,执行指令SWAPA;结果为(A)=43H。思考题:分析下列程序段执行的过程及结果:假设内部RAM2AH、2BH单元中连续存放有4个BCD码(1个BCD码占4个二进制位)2AH单元2BH单元a3a2a1a0

MOVR0,#2AH;

MOVA,@R0;

SWAPA;

MOV@R0,A;

MOVR1,#2BH;

MOVA,@R1;

SWAPA;

XCHA,@R0;

MOV@R1,A;程序段执行后的最终结果:(2AH)=;(2BH)=;(A)=;思考题:解

MOVR0,#2AH;(R0)=2AHMOVA,@R0;(A)=a3a2SWAPA;(A)=a2a3MOV@R0,A;((R0))=(2AH)=a2a3MOVR1,#2BH;(R1)=2BHMOVA,@R1;(A)=a1a0SWAPA;(A)=a0a1XCHA,@R0;(A)=a2a3,((R0))=(2AH)=a0a1MOV@R1,A;((R1))=(2BH)=(A)=a2a3程序段执行后的最终结果:(2AH)=a0a1

;(2BH)=a2a3

;(A)=a2a3

;(6)堆栈操作指令组堆栈操作指令组只有两条指令:进栈指令和出栈指令。

a)进栈指令:PUSHdirect;功能:为内部RAM低128单元或专用寄存器内容送至栈顶单元。

指令操作过程:SP←(SP)+1;(SP)←(direct)

b)出栈指令:POPdirect;

功能:栈顶单元内容送内部RAM低128单元或专用寄存器。

指令操作过程:direct←((SP));(SP)←(SP)-1

注意:进栈指令和出栈指令均采用寄存器间接寻址方式,间址寄存器是SP,例:将片外RAM2500H单元的内容88H送到片内RAM40H单元,MOVDPTR,#2500H;(DPTR)=2500HMOVXA,@DPTR;(A)=((DPTR))=88HMOVSP,#60H;(SP)=60HPUSHACC;(SP)=61H,(61H)=88HPOP40H;(40H)=88H,(SP)=60H例:分析以下程序段的执行结果

MOVSP,#60H;(SP)=60HMOVA,#30H;(A)=30HMOVB,#40H;(B)=40HPUSHACC;

PUSHBPOPDPH;

POPDPL;执行结果:(DPH)=

(DPL)=例:单片机应用系统程序设计时,经常需要用到中断服务程序和各类子程序,在执行中断服务程序和子程序前,常常需要把程序状态寄存器PSW、累加器A、数据指针DPTR的内容保护起来(现场进栈保护),在中断服务程序和子程序执行结束之前,再恢复它们的内容(现场出栈恢复)。以下程序段可实现上述功能。

MOVSP,#60H;

PUSHPSW;

PUSHACC;

PUSHDPL;

PUSHDPH;

…………………………

POPDPH;

POPDPL;

POPACC;

POPPSW;注意:堆栈深度、堆栈平衡,数据进栈、出栈的先后次序。3.3.2算术运算类指令

a)指令数目:24条;

b)指令通用格式:助记符操作码目的操作数,源操作数;

c)指令功能:数据算术运算(加减乘除),此类指令对程序状态字PSW的进位位(CY),辅助进位位(AC),溢出位(OV)三种标志位有影响,即对它们自动置位或复位,但是,加1和减1指令不影响这些标志;

d)助记符类型(8种):

ADD、ADDC、SUBB、INC、DEC、DA、MUL、DIVe)注意:算术运算类指令都是针对8位二进制无符号数的。(1)加法指令组指令格式相应操作操作结果ADDA,

RnA←(A)+(Rn)(A)=(A)+(Rn)ADDA,directA←(A)+(direct)(A)=(A)+(direct)ADDA,@RiA←(A)+((Ri))(A)=(A)+((Ri))ADDA,#dataA←(A)+data(A)=(A)+data

a)将A中的数与源操作数所指出的内容相加,其相加结果仍存在A中。

b)8位二进制数加法运算指令的一个加数总是累加器A。

c)运算影响PSW的位状态相加过程中,若位3有进位,则AC置1,否则,AC清0,若位7有进位,则CY置1,否则,CY清0。

d)、对于无符号数相加,若CY置位,说明和产生溢出,即大于255。

e)、对于有符号数相加,当位6或位7之中只有一位进位时,溢出标志位OV置位,说明和产生了溢出,结果出错。

OV位只对有符号数加法有意义,对于无符号数加法无意义。

溢出表达式:OV=D6cy⊕D7cyD6cy:位6向位7的进位

D7cy:位7向cy的进位例:假设(A)=C2H,(R0)=A9H,执行ADDA,R011000010

+10101001

1←01101011

OV=D6cy⊕D7cy=0⊕1=1

若C2H,A9H为无符号数,则(A)=6BH,(AC)=0,(CY)=1,则表示溢出,结果大于255。若C2H,A9H为有符号数,则OV=1,表示有溢出,结果出错,因为两个负数相加不可能得到正数的和。例:假设(A)=78H,(10H)=64H,执行指令ADDA,10H,求两无符号数之和,并说明PSW的有关标志位状态。

01111000

+)0110010011011100PSW:OV=D6cy⊕D7cy=1⊕0=1,CY=0,AC=0。练习题:(A)=53H,(R0)=FCH,执行指令:ADDA,R0

(2)带进位加法指令组指令格式相应操作操作结果ADDCA,RnA←(A)+(Rn)+(CY)(A)=(A)+(Rn)+(CY)ADDCA,directA←(A)+(direct)+(CY)(A)=(A)+(direct)+(CY)ADDCA,@RiA←(A)+((Ri))+(CY)(A)=(A)+((Ri))+(CY)ADDCA,#dataA←(A)+data+(CY)(A)=(A)+data+(CY)

a)把源操作数所指示的内容和A中的内容及进位标志CY相加,结果存入A中。运算前一个加数必定在A中,运算后和存于A中。

b)此类指令运算结果同样对PSW中相关位有影响,影响规则与加法指令组相同。

c)它一般用于多字节数的加法运算,低字节相加的和可能产生进位,可通过带进位加法指令将低字节的进位加到高字节上去,高字节求和时,必须使用带进位的加法指令。例:假设(A)=AEH,(20H)=81H,(CY)=1,求两数之和,及PSW相关位内容,执行指令ADDCA,20H。

1010111010000001

+)11←00110000OV=D6cy⊕D7cy=0⊕1=1;CY=1AC=1(A)=30H练习题:假设(A)=85H,(20H)=FFH,CY=1求两数之和,及PSW相关位内容,执行指令ADDCA,20H。(3)带减位加法指令组指令格式相应操作操作结果SUBBA,RnA←(A)-(Rn)-(CY)(A)=(A)-(Rn)-(CY)SUBBA,directA←(A)-(direct)-(CY)(A)=(A)-(direct)-(CY)SUBBA,@RiA←(A)-((Ri))-(CY)(A)=(A)-((Ri))-(CY)SUBBA,#dataA←(A)-data-(CY)(A)=(A)-data-(CY)

a)把A中的内容和源操作数所指示的内容及进位标志CY相减,结果存入A中。运算前被减数必定在A中,运算后差存于A中。

b)此类指令运算结果同样对PSW中相关位有影响,影响规则与加法指令组相同。其中,OV位只对有符号数减法有意义。

c)减法运算只有带借位减法指令,而没有不带借位减法指令。如需进行不带借位的减法运算,只需在用SUBB指令前先用CLRC指令把CY清0即可。例:假设(A)=C9H,(R2)=54H,(CY)=1,求两数之差,及PSW相关位内容,执行指令SUBBA,R2。

11001001

01010100

-)101110100

OV=D6cy⊕D7cy=1⊕0=1

若C9H,54H为无符号数,则由于CY=0,无溢出,结果正确。若C9H,54H为有符号数,则由于OV=1,有溢出,结果出错。

练习题:假设(A)=DBH,(R4)=73H,(CY)=1,求两数之差,及PSW相关位内容,执行指令SUBBA,R4。(4)加1指令组指令格式相应操作操作结果INCAA←(A)+1(A)=(A)+1INCRnRn←(Rn)+1(Rn)=(Rn)+1INCdirectdirect←(direct)+1(direct)=(direct)+1INC@Ri(Ri)←((Ri))+1((Ri))=((Ri))+1INCDPTRDPTR←(DPTR)+1(DPTR)=(DPTR)+1

a)将操作数所指定单元或寄存器中的内容加1,其结果送回原操作数单元。

b)此组指令的操作不影响PSW的状态。

例:假设(A)=FFH,(DPTR)=10FFH,(CY)=0,执行指令:

INCA;(A)=00H,(CY)=0INCDPTR;(DPTR)=1100H;(CY)=0(5)减1指令组指令格式相应操作操作结果DECAA←(A)-1(A)=(A)-1DECRnRn←(Rn)-1(Rn)=(Rn)-1DECdirectdirect←(direct)-1(direct)=(direct)-1DEC@Ri(Ri)←((Ri))-1((Ri))=((Ri))-1

a)将操作数所指定单元或寄存器中的内容减1,其结果送回原操作数单元。

b)此组指令的操作不影响PSW的状态。

c)没有DPTR减1指令。例:假设(40H)=00H,(R1)=50H,(50H)=60H,(CY)=1执行指令:DEC40H;(40H)=0FFH,(CY)=1DEC@R1;((R1))=(50H)=5FH,(CY)=1例:内部RAM40H和41H单元分别存放两个8位二进制无符号加数,求两数相加之和,和存放在内部RAM42H单元中。假设两数之和仍是8位二进制数。解:例:内部RAM40H和41H单元分别存放两个8位二进制无符号加数,求两数相加之和,和存放在内部RAM42H单元中。假设两数之和仍是8位二进制数。(注意比较两种编程方法的优劣性)解(1)MOVA,40H;(A)=(40H)

ADDA,41H;(A)=(40H)+(41H)

MOV42H,A;(42H)=(40H)+(41H)(2)MOVR0,#40H;设置数据指针,(R0)=40HMOVA,@R0;取第一个加数,(A)=(40H)

INCR0;修改数据指针,(R0)=41HADDA,@R0;两数相加(A)=(40H)+(41H)

INCR0;修改数据指针,(R0)=42HMOV@R0,A;存两数和(42H)=(40H)+(41H)例:两个三字节二进制无符号数相加,被加数放在内部RAM20H~22H单元(低字节存放在低地址单元,高字节存放在高地址单元,即低位在前,高位在后),加数放在2AH~2CH单元,和放在20H~22H单元,最高位如有进位,则放在23H单元中。解:数据类型(二、十进制数,有、无符号数);数据结构(升、降序排列)被加数(N1)加数(N2)和(N3)20H单元低字节(8位)2AH单元低字节(8位)20H单元低字节(8位)21H单元中字节(8位)2BH单元中字节(8位)21H单元中字节(8位)22H单元高字节(8位)2CH单元高字节(8位)22H单元高字节(8位)23H单元进位位被加数(N1)高字节(8位)中字节(8位)低字节(8位)加数(N2)高字节(8位)中字节(8位)低字节(8位)被加数N1高字节(8位)中字节(8位)低字节(8位)加数N2高字节(8位)中字节(8位)低字节(8位)

+)进位位(CY)进位位(CY)进位位(CY)

和N3进位高字节(8位)中字节(8位)低字节(8位)

MOVA,20H;(A)=被加数N1低字节

ADDA,2AH;(A)=被加数N1低字节+加数N2低字节

低字节和的进位在CY中

MOV20H,A;(20H)=和N3低字节

MOVA,21H;(A)=被加数N1中字节

ADDCA,2BH;(A)=被加数N1中字节+加数N2中字节+

低字节和的进位,中字节和的进位在CY中

MOV21H,A;(21H)=和N3中字节

MOVA,22H;(A)=被加数N1高字节

ADDCA,2CH;

MOV22H,A;(22H)=和N3高字节

MOVA,#00H;

ADDCA,#00H;高字节和的进位位处理

MOV23H,A;保存处理后的高字节和的进位思考题:

1)如果N1、N2、N3的数据结构为高字节存放在低地址单元,低字节存放在高地址单元,应如何修改程序?

2)上述程序,如果利用数据指针,采用寄存器间接寻址的方式,应如何修改程序?思考题:1)被加数(N1)高字节(8位)中字节(8位)低字节(8位)加数(N2)高字节(8位)中字节(8位)低字节(8位)解:MOVA,22H;(A)=被加数N1低字节

ADDA,2CH;(A)=被加数N1低字节+加数N2低字节低字节和的进位在CY中

MOV22H,A;(22H)=和N3低字节

MOVA,21H;(A)=被加数N1中字节被加数(N1)加数(N2)和(N3)20H单元高字节(8位)2AH单元高字节(8位)20H单元高字节(8位)21H单元中字节(8位)2BH单元中字节(8位)21H单元中字节(8位)22H单元低字节(8位)2CH单元低字节(8位)22H单元低字节(8位)1FH单元进位位

ADDCA,2BH;(A)=被加数N1中字节+加数N2中字节+

低字节和的进位,中字节和的进位在CY中

MOV21H,A;(21H)=和N3中字节

MOVA,20H;(A)=被加数N1高字节

ADDCA,2AH;(A)=被加数N1高字节+加数N2高字节+

中字节和的进位,高字节和的进位在CY中

MOV20H,A;(20H)=和N3高字节

ADDCA,#00H;高字节和的进位位处理

MOV1FH,A;保存处理后的高字节和的进位思考题:2)解:MOVR0,#20H;设置被加数N1数据指针,(R0)=20HMOVR1,#2AH;设置加数N2数据指针,(R1)=2AHMOVA,@R0;取被加数N1低字节,(A)=(20H)

ADDA,@R1;N1低字节和N2低字节相加

MOV@R0,A;和的低字节存于20HINCR0;修改N1数据指针,(R0)=21HINCR1;修改N2数据指针,(R1)=2BHMOVA,@R0;取被加数N1中字节,(A)=(21H)

ADDCA,@R1;N1、N2中字节、低字节进位相加

MOV@R0,A;和的中字节存于21HINCR0;修改N1数据指针,(R0)=22H

INCR1;修改N2数据指针,(R1)=2CHMOVA,@R0;取被加数N1高字节,(A)=(22H)

ADDCA,@R1;N1、N2高字节、中字节进位相加

MOV@R0,A;和的高字节存于22HADDCA,#00H;高字节和的进位位处理

INCR0;

MOV@R0,A;保存处理后的高字节和的进位

思考题:

3)上述程序,如果改变N1、N2、N3的数据结构(高字节存放在低地址单元,低字节存放在高地址单元),应如何修改程序?被加数(N1)加数(N2)和(N3)20H单元高字节(8位)2AH单元高字节(8位)20H单元高字节(8位)21H单元中字节(8位)2BH单元中字节(8位)21H单元中字节(8位)22H单元低字节(8位)2CH单元低字节(8位)22H单元低字节(8位)1FH单元进位位思考题:3)解:MOVR0,#22H;设置被加数N1数据指针,(R0)=22HMOVR1,#2CH;设置加数N2数据指针,(R1)=2CHMOVA,@R0;取被加数N1低字节,(A)=(22H)

ADDA,@R1;N1低字节和N2低字节相加

MOV@R0,A;和的低字节存于22HDECR0;修改N1数据指针,(R0)=21HDECR1;修改N2数据指针,(R1)=2BH

MOVA,@R0;取被加数N1中字节,(A)=(21H)

ADDCA,@R1;N1、N2中字节、低字节进位相加

MOV@R0,A;和的中字节存于21HDECR0;修改N1数据指针,(R0)=20HDECR1;修改N2数据指针,(R1)=2AHMOVA,@R0;取被加数N1高字节,(A)=(20H)

ADDCA,@R1;N1、N2高字节、中字节进位相加

MOV@R0,A;和的高字节存于20HADDCA,#00H;高字节和的进位位处理

DECR0;

MOV@R0,A;保存处理后的高字节和的进位(6)乘除指令组

a)乘法指令

MULAB1)实现两个8位无符号二进制数的乘法操作,被乘数在A中,乘数在B中,乘积为16位,高8位送B,低8位送A。

2)此指令影响PSW的状态,CY位总被清0,当乘积大于255,则OV=1,否则清0。

例:(A)=4EH,(B)=5DH,执行指令MULAB

01001110

×)010111011110001010110

∴(B)=1CH(A)=56H,OV=1,CY=0

b)乘法指令DIVAB1)实现两个8位无符号二进制数除法,被除数在A,除数在B,A←商,B←余数。

2)此指令影响PSW位状态,CY位总被清0。当除数为0(B=0)OV=1,表示除法没有意义。例:(A)=11H,(B)=04H,执行指令DIVAB

其结果(A)=01H,B=1,CY=OV=0(7)十进制调整指令DAA

指令功能:用于对BCD码十进制数加法运算的结果进行修正。

a)十进制调整问题指令系统中,只有针对二进制数的加法指令(ADD、ADDC),而没有专门用于十进制数(BCD码)的加法指令,因此,十进制数(BCD码)的加法运算只能借助于二进制数的加法指令,但二进制数加法指令不能完全适用于十进制数(BCD码)加法运算。

6+3=98+7=158+9=17011010001000

+)0011

+)0111

+)1001100111111←0001

(9)(11)

12+34=4618+26=4471+64=13595+87=18200010010000110000111000110010101+)00110100

+)00100110

+)01100100

+)100001110100011000111110110101011←00011100

(46)

b)出错原因

BCD码是4位二进制编码,4位二进制数共有16个编码,但BCD码只用了其中10个(0000~1001),剩下6个(1010~1111)没用,为无效码。

在BCD码加法运算中,凡结果进入或者跳过无效编码区时,其结果就是错误的。

c)调整方法:

1)1位BCD码加法运算出错调整

1位BCD码加法运算出错情况有两种:相加结果大于9,进入无效编码区;相加结果有进位(AC),跳过无效编码区。以上两种情况均使相加结果比正确值小6,调整方法就是加6。

6+3=98+7=158+9=17011010001000

+)0011

+)0111

+)1001100111111←0001

+)0110(6)

+)0110(6)

1←0101(15)1←0111(17)

2)2位(字节)BCD码加法运算出错调整

2位(字节)BCD码加法运算出错情况有三种:相加结果高4位或低4位大于9,进入无效编码区;相加结果高4位或低4位产生进位,跳过无效编码区;相加结果高4位为9,低4位大于9,这样低位加6修正时产生的进位会使高位大于9,进入无效编码区。A的低4位大于9或(AC)=1,则进行低4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论