指令系统及汇编

上传人:鲁** 文档编号:568559017 上传时间:2024-07-25 格式:PPT 页数:256 大小:1.50MB
返回 下载 相关 举报
指令系统及汇编_第1页
第1页 / 共256页
指令系统及汇编_第2页
第2页 / 共256页
指令系统及汇编_第3页
第3页 / 共256页
指令系统及汇编_第4页
第4页 / 共256页
指令系统及汇编_第5页
第5页 / 共256页
点击查看更多>>
资源描述

《指令系统及汇编》由会员分享,可在线阅读,更多相关《指令系统及汇编(256页珍藏版)》请在金锄头文库上搜索。

1、第第3章章 指令系统及汇编指令系统及汇编指令系统及汇编Stillwatersrundeep.流静水深流静水深,人静心深人静心深Wherethereislife,thereishope。有生命必有希望。有生命必有希望第第3章章 指令系统及汇编指令系统及汇编3.1 MCS51单片机汇编语言与指令格式单片机汇编语言与指令格式 3.1.1单片机的汇编语言由于构成计算机的电子器件特性所决定,计算机只能识别二进制代码。这种以二进制代码来描述指令功能的语言,称之为机器语言,用机器语言组成的程序,称为目标程序。计算机就是按照机器语言的指令来完成各种功能操作的,它具有程序简捷、占用存储空间小、执行速度快、控制功

2、能强等特点。第第3章章 指令系统及汇编指令系统及汇编3.1.2指令格式MCS51单片机汇编语言指令的标准格式如下:标号:操作码目的操作数,源操作数;注释例如:LOOP:ADD#A,10H;(A)(A)+10H(1)方括号表示该项是可选项,可有可无。(2)标号是用户设定的符号,它实际代表该指令所在的地址。标号必须以字母开头,其后跟18个字母或数字,并以“:”结尾。第第3章章 指令系统及汇编指令系统及汇编(3)操作码是用英文缩写的指令功能助记符。它确定了本条指令完成什么样的操作功能。如:ADD表示加法操作。任何一条指令都必须有该助记符项,不得省略。(4)目的操作数提供操作的对象,并指出一个目标地址

3、,表示操作结果存放单元的地址,它与操作码之间必须以一个或几个空格分隔。如上例中A表示操作对象是累加器A的内容,并指出操作结果又回送A存放。第第3章章 指令系统及汇编指令系统及汇编(5)源操作数指出的是一个源地址(或立即数),表示操作的对象或操作数来自何处。它与目的操作数之间要用“,”号隔开。(6)注释部分是在编写程序时,为了增加程序的可读性,由用户拟写对该条指令或该段程序功能的说明。它以分号“;”开头,可以用中文、英文或某些符号来表示,显然它不存入计算机,只出现在源程序中。第第3章章 指令系统及汇编指令系统及汇编3.1.3指令中常用符号在分类介绍各类指令之前,先对描述指令的一些符号意义进行一些

4、简单约定:(1)Ri和Rn:R表示当前工作寄存器区中的工作寄存器,i表示0或1,即R0和R1。n表示07,即R0R7,当前工作寄存器的选定是由PSW的RS1和RS0位决定的。(2)data:表示立即数,data为8位常数。data是指包含在指令中的8位立即数。第第3章章 指令系统及汇编指令系统及汇编(3)data16:包含在指令中的16位立即数。(4)rel:相对地址,以补码形式表示的地址偏移量,范围为-128+127,主要用于无条件相对短转移指令SJMP和所有的条件转移指令中。(5)addr16:16位目的地址。目的地址可在全部程序存储器的64KB空间范围内,主要用于无条件长转移指令LJMP

5、和子程序长调用指令LCALL中。(6)addr11:11位目的地址。目的地址应与下条指令处于相同的2KB程序存储器地址空间范围内,主要用于绝对转移指令AJMP和子程序绝对调用指令ACALL指令中。第第3章章 指令系统及汇编指令系统及汇编(7)direct:表示直接寻址的地址,即8位内部数据存储器RAM的单元地址(0127/255),或特殊功能寄存器SFR的地址。对于SFR可直接用其名称来代替其直接地址。(8)bit:内部数据存储器RAM和特殊功能寄存器SFR中的可直接寻址位地址。(9):间接寻址寄存器或基地址寄存器的前缀,如Ri,DPTR,表示寄存器间接寻址。第第3章章 指令系统及汇编指令系统

6、及汇编(10)(X):表示X中的内容。(11)(X):表示由X寻址的单元中的内容,即(X)作地址,该地址的内容用(X)表示。(12)/和符号:/表示对该位操作数取反,但不影响该位的原值。表示指令操作流程,将箭头一方的内容,送入箭头另一方的单元中去。第第3章章 指令系统及汇编指令系统及汇编3.2 寻址方式寻址方式3.2.1寄存器寻址选定某寄存器,自该寄存器中读取或存放操作数,以完成指令规定的操作,称为寄存器寻址。例如:MOVA,R0;(A)(R0)该指令的功能是把工作寄存器R0中的内容传送到累加器A中,如:R0内容为FFH,则执该指令后A的内容也为FFH。在该条指令中,源操作数和目的操作数是由寻

7、址R0和A寄存器得到的,故属于寄存器寻址。该指令为单字节指令,机器代码为E8H。第第3章章 指令系统及汇编指令系统及汇编3.2.2立即寻址操作数直接出现在指令中,它紧跟在操作码的后面,作为指令的一部分与操作码一起存放在程序存储器内,可以立即得到并执行,不需要另去寄存器或存储器等处寻找和取数,故称为立即寻址。该操作数称为立即数,并在其前冠以“”号作前缀,以表示并非地址。立即数可以是8位或16位,用十六进制数表示。第第3章章 指令系统及汇编指令系统及汇编例如:MOVA,0FH;(A)0FH该指令的功能是将立即数0FH传送到累加器A中,对应的机器码为74H。它隐含了寄存器寻址累加器A方式,长一个字节

8、,占用一个存储单元;立即数0FH紧跟在操作码之后,成为指令代码的一部分,长也是一个字节,占用紧跟在后面的另一个存储单元。故该指令为双字节指令,其机器码为74H0FH。第第3章章 指令系统及汇编指令系统及汇编3.2.3寄存器间接寻址由指令指出某一个寄存器的内容作为操作数地址的寻址方法,称为寄存器间接寻址方法,简称寄存器间址。这里要强调的是:寄存器的内容不是操作数本身,而是操作数地址。寄存器间接寻址使用所选定寄存器区中的R0和R1作为地址指针(对堆栈操作时,使用堆栈指针SP),来寻址片内数据存储器RAM(00FFH)的256个单元,但它不能访问特殊功能寄存器SFR。寄存器间接寻址也适用于访问外部数

9、据存储器,此时,用R0、R1或DPTR作为地址指针。寄存器间接寻址用符号“”指明。第第3章章 指令系统及汇编指令系统及汇编图31寄存器间接寻址示意图第第3章章 指令系统及汇编指令系统及汇编3.2.4直接寻址指令中直接给出操作数所在的存储器地址,以供寻址取数或存数的寻址方式称为直接寻址。例如:MOVA,40H;(A)(40H)该指令的功能是把内部数据存储器RAM40H单元内的内容送到累加器A。指令直接给出了源操作数的地址40H。该指令的机器码为E5H40H。第第3章章 指令系统及汇编指令系统及汇编3.2.5变址寻址基址寄存器加变址寄存器间接寻址,简称变址寻址。它以数据指针DPTR或程序计数器PC

10、作为基址寄存器,累加器A作为变址寄存器,两者的内容相加形成16位程序存储器地址,该地址就是操作数所在地址。例如:MOVCA,A+DPTR;(A)(A)+(DPTR)该指令寻址及操作功能如图32所示,该指令为单字节指令,机器代码为93H。这种寻址方式常用于访问程序存储器中的常数表。第第3章章 指令系统及汇编指令系统及汇编图32变址寻址示意图第第3章章 指令系统及汇编指令系统及汇编3.2.6相对寻址相对寻址是以当前程序计数器PC值加上指令规定的偏移量rel,而构成实际操作数地址的寻址方法。它用于访问程序存储器,常出现在相对转移指令中。在使用相对寻址时要注意以下两点:第一,当前PC值是指相对转移指令

11、所在地址(一般称为源地址)加上转移指令字节数。即:当前PC值=源地址+转移指令字节数。例如:JZrel是一条累加器A为零就转移的双字节指令。若该指令地址(源地址)为2050H,则执行该指令时的当前PC值即为2052H。第第3章章 指令系统及汇编指令系统及汇编第二,偏移量rel是有符号的单字节数,以补码表示,其相对值的范围是-128+127(即00HFFH),负数表示从当前地址向上转移,正数表示从当前地址向下转移。所以,相对转移指令满足条件后,转移的地址(一般称为目的地址)应为:目的地址=当前PC值+rel=源地址+转移指令字节数+rel例如:指令JZ08H和JZ0F4H 表示累加器A为零条件满

12、足后, 从源地址(2050H)分别向下、向上转移10个单元。其相对寻址示意如图33(a)、(b)所示。这两条指令均为双字节指令,机器代码分别为:60H08H和60HF4H。第第3章章 指令系统及汇编指令系统及汇编图33相对寻址示意图(a)指令JZ08H寻址示意图;(b)指令JZF4H寻址示意图第第3章章 指令系统及汇编指令系统及汇编3.2.7位寻址MCS51系列单片机具有位寻址的功能,即指令中直接给出位地址,可以对内部数据存储器RAM中的128位和特殊寄存器SFR中的93位进行寻址,并且位操作指令可对地址空间的每一位进行传送及逻辑操作。例如:SETBPSW.3;(PSW.3)1该指令的功能是给

13、程序状态字PSW中的RS0置1。该指令为双字节指令,机器代码为D2HD3H,指令的第二字节直接给出位地址D3H(PSW.3的位地址)。第第3章章 指令系统及汇编指令系统及汇编综上所述,在MCS51系列单片机的存储空间中,指令究竟对哪个存储器空间进行操作是由指令操作码和寻址方式确定的。7种寻址方式如表31所示。第第3章章 指令系统及汇编指令系统及汇编表317种寻址方式及使用空间第第3章章 指令系统及汇编指令系统及汇编3.3 MCS51单片机指令系统单片机指令系统 MCS51单片机指令系统分为:数据传送类指令、算术运算类指令、逻辑运算及移位类指令、控制转移类指令和位操作(布尔操作)指令5大类,共计

14、111条指令。现按其分类分别介绍各条指令的格式、功能、对状态标志的影响以及应用。第第3章章 指令系统及汇编指令系统及汇编3.3.1数据传送类指令数据传送类指令共29条,它是指令系统中最活跃、使用最多的一类指令。一般的操作是把源操作数传送到目的操作数,即指令执行后目的操作数改为源操作数,而源操作数保持不变。若要求在进行数据传送时,不丢失目的操作数,则可以用交换型传送指令。第第3章章 指令系统及汇编指令系统及汇编数据传送类指令不影响进位标志CY、半进位标志AC和溢出标志OV,但当传送或交换数据后影响累加器A的值时,奇偶标志P的值则按A的值重新设定。按数据传送类指令的操作方式,又可把传送类指令分为3

15、种类型:数据传送、数据交换和堆栈操作,并使用8种助记符: MOV、 MOVX、 MOVC、 XCH、XCHD、SWAP、PUSH及POP。表32给出了各种数据传送指令的操作码助记符和对应的操作数。第第3章章 指令系统及汇编指令系统及汇编表32数据传送类指令助记符与操作第第3章章 指令系统及汇编指令系统及汇编1.内部数据存储器间数据传送指令内部数据存储器RAM区是数据传送最活跃的区域,可用的指令数也最多,共有16条指令,指令操作码助记符为MOV。 内部RAM之间源操作数传递关系如图34所示。为了便于理解指令功能,我们按源操作数的寻址方式逐一介绍各条指令。(1)立即寻址。在该寻址方式下,内部RAM

16、区数据传送指令有如下5条指令。第第3章章 指令系统及汇编指令系统及汇编图34内部RAM间数据传递关系第第3章章 指令系统及汇编指令系统及汇编操作码助记符目的操作数源操作数功能注释机器代码(H)MOVA,data;(A)data,74dataMOVdirect,data;(direct)data,75directdataMOVRi,data;(Ri)data,7677dataMOVRn,data;(Rn)data,787FdataMOVDPTR,data16;(DPTR)data16,90data158data70第第3章章 指令系统及汇编指令系统及汇编这组指令表明,8位立即数可以直接传送到内部

17、数据区RAM的各个位置,并且可把16位立即数直接装入数据指针DPTR。把立即数送入累加器A的传送指令在3.2.2节中已作了介绍,其它指令的功能及应用举例如下:MOVdirect,data;(direct)data#,75directdata该指令的功能是把立即数传送到内部数据存储器RAM的00H7FH,以及特殊功能寄存器SFR的各单元中去,它为三字节指令。例如把立即数40H传送到RAM的30H单元和P1口(口地址为90H),可采用如下指令:第第3章章 指令系统及汇编指令系统及汇编MOV30H,40H;(30H)40H,753040MOVP1,40H;(90H)40H,759040MOVRi,d

18、ata;(Ri)data,7677data该指令的功能是把立即数传送到由R0和R1寄存器的内容指出的片内数据存储器RAM的单元中去(MCS51系列为00H7FH,MCS52系列为00HFFH)。MOVR0,30H;(R0)30H,7830MOVR0,40H;(R0)40H,7640第第3章章 指令系统及汇编指令系统及汇编MOVRn,data;(Rn)data,787Fdata该指令的功能是把立即数传送到内部寄存器R0R7中去,该指令为双字节指令,机器代码为:01111rrrdata第第3章章 指令系统及汇编指令系统及汇编MOVDPTR,data16;(DPTR)data16,90data158

19、data70该指令的功能是把16位立即数装入数据指针DPTR中去。它是MCS51系列单片机指令系统中唯一的一条16位数据传送指令。该指令为三字节指令,第一字节为90H,第二字节为高8位立即数,第三字节为低8位立即数。例如:MOVDPTR,1234H指令执行后,DPTR寄存器的高8位寄存器DPH的内容为12H,低8位寄存器DPL内容为34H。该指令的机器代码为90H12H34H。第第3章章 指令系统及汇编指令系统及汇编(2)寄存器寻址。在该寻址方式下,内部RAM区数据传送指令有以下5条:MOVdirect,A#;(direct)(A),F5directMOVRi,A;(Ri)(A),F6F7MO

20、VRn,A;(Rn)(A),F8FFMOVA,Rn;(A)(Rn),E8EFMOVdirect,Rn;(direct)(Rn),888Fdirect第第3章章 指令系统及汇编指令系统及汇编这组指令的功能是把累加器A的内容传送到内部数据区RAM的各个单元,或者把指定工作寄存器R0R7中的内容传送到累加器A或direct所指定的片内RAM的00H7FH单元或特殊功能寄存器SFR中去。但不能用这类指令在内部工作寄存器之间直接传送。例如:不存在MOVR1,R2这样的指令。第第3章章 指令系统及汇编指令系统及汇编(3)直接寻址。在该寻址方式下,内部RAM区数据传送指令有如下4条指令:MOVA,direc

21、t;(A)(direct),E5directMOVRn,direct;(Rn)(direct),A8AFdirectMOVRi,direct;(Ri)(direct),A6A7directMOVdirect2,direct1;(direct2)(direct1),85direct1direct2第第3章章 指令系统及汇编指令系统及汇编这组指令将直接地址所规定的内部RAM单元(片内RAM的00H7FH,SFR的80HFFH单元)内容传送到累加器A,寄存器Rn,并能实现内部数据寄存器RAM之间、特殊功能寄存器SFR之间或SFR与内部RAM之间的直接数据传递。直接传递不需要通过累加器A或者工作寄存器

22、来间接传送,从而提高了数据传送的效率。第第3章章 指令系统及汇编指令系统及汇编例如:MOVP2,P1;(P2)(P1),8590A0该指令的功能是不通过其它寄存器,直接把P1口(口地址90H)的内容传送到P2口(口地址A0H)输出,提高了效率。该指令为三字节指令,机器代码为85H90HA0H。第第3章章 指令系统及汇编指令系统及汇编(4)寄存器间接寻址。在该寻址方式下,内部RAM区数据传送指令有以下两条:MOVA,Ri;(A)(Ri),E6E7MOVdirect,Ri;(direct)(Ri),8687direct这组指令把以Ri的内容作为地址进行寻址所得到单元的内容,传送到累加器A或dire

23、ct指定的片内RAM区单元。第第3章章 指令系统及汇编指令系统及汇编例 如 : 设 内 部 RAM (30H)=40H, (40H)=10H,(10H)=00H,端口(P1)=CAH,分析以下程序执行后各单元及寄存器、P2口的内容。MOVR0,30H;(R0)30H,7830MOVA,R0;(A)(R0),E6MOVR1,A;(R1)(A),F9MOVB,R1;(B)(R1),87F0MOVR1,P1;(R1)(P1),A790MOVP2,P1;(P2)(P1),8590A0MOV10H,20H;(10H)20H,751020第第3章章 指令系统及汇编指令系统及汇编2.外部数据存储器数据传送指

24、令MCS51单片机CPU对片外扩展的数据存储器RAM或I/O口进行数据传送,必须采用寄存器间接寻址的方法,通过累加器A来完成。一般数据的传送是通过P0口和P2口完成的,即片外RAM地址总线低8位由P0口送出,高8位由P2口送出,数据总线(8位)也由P0口传送(双向),但与低8位地址总线是分时传送的。这类数据传送指令共有以下4条单字节指令,指令操作码助记符标志为MOVX。第第3章章 指令系统及汇编指令系统及汇编MOVXA,DPTR;(A)(DPTR),E0MOVXA,Ri;(A)(Ri),E2E3MOVXDPTR,A;(DPTR)(A),F0MOVXRi,A;(Ri)(A),F2F3第第3章章

25、指令系统及汇编指令系统及汇编例如:设外部RAM(0203H)=FFH,分析以下指令执行后的结果。MOVDPTR,0203H;(DPTR)0203H,900203MOVXA,DPTR;(A)(DPTR),E0MOV30H,A;(30H)(A),F530MOVA,0FH;(A)0FH,740FMOVXDPTR,A;(DPTR)(A),F0执行结果为:(DPTR)=0203H,(30H)=FFH,(0203H)=(A)=0FH。第第3章章 指令系统及汇编指令系统及汇编3.程序存储器向累加器A传送数据指令程序存储器向累加器A传送数据指令,又称查表指令。它采用变址寻址方式,把程序存储器(ROM或EPRO

26、M)中存放的表格数据读出,传送到累加器A。它共有如下两条单字节指令,指令操作码助记符为MOVC。MOVCA,A+DPTR;(A)(A)+(DPTR),93MOVCA,A+PC;(PC)(PC)+1,(A)(A)+(PC),83第第3章章 指令系统及汇编指令系统及汇编例1:在外部ROM/EPROM中,从2000H单元开始依次存放09的平方值:0、1、4、9、81,要求依据累加器A中的值(09)来查找所对应的平方值,分析下述程序的结果。MOVDPTR,2000H;(DPTR)2000H,902000MOVA,09H;(A)09H,7409MOVCA,A+DPTR;(A)(A)+(DPTR),93执

27、行结果:(DPTR)=2000H,(A)=51H(81的十六进制数)。第第3章章 指令系统及汇编指令系统及汇编例2:仍以例1外部ROM/EPROM2000H单元开始存放09的平方值,以PC作为基址寄存器进行查表。解:设MOVC指令所在地址(PC)=1FF0H,则偏移量=2000H(1FF0H+1)=0FH相应的程序如下:MOVA,09H;(A)09H,7409ADDA,0FH;地址调整,240FMOVCA,A+PC;(A)(A)+(PC)+1),83执行结果为:(PC)=1FF1H,(A)=51H。第第3章章 指令系统及汇编指令系统及汇编4.数据交换指令数据传送类指令一般都用来将操作数自源地址

28、传送到目的地址,指令执行后,源地址的操作数不变,目的地址的操作数则修改为源地址的操作数。而数据交换指令其数据作双向传送,涉及传送的双方互为源地址、目的地址,指令执行后各方的操作数都修改为另一方的操作数。因此,两操作数均未冲掉、丢失。数据交换类指令共有如下5条指令:第第3章章 指令系统及汇编指令系统及汇编XCHA,direct;(A)(direct),C5directXCHA,Ri;(A)(Ri),C6C7XCHA,Rn;(A)(Rn),C8CFXCHDA,Ri;(A30)(Ri)30),D6D7SWAPA;(A74)(A30),C4第第3章章 指令系统及汇编指令系统及汇编例3:设(R0)=30

29、H,(30H)=4AH,(A)=28H,则:执行XCHA,R0;结果为:(A)=4AH,(30H)=28H执行XCHDA,R0;结果为:(A)=2AH,(30H)=48H执行SWAPA;结果为:(A)=82H第第3章章 指令系统及汇编指令系统及汇编5.堆栈操作类指令堆栈操作有进栈和出栈操作,即压入和弹出数据,常用于保存或恢复现场。该类指令共有如下两条指令:(SP)(SP)+1(SP)(direct)(direct)(SP)(SP)(SP)-1C0directPUSHdirectPOPdirectD0direct第第3章章 指令系统及汇编指令系统及汇编例4:若在外部ROM/EPROM中2000H

30、单元开始依次存放09的平方值,数据指针(DPTR)=3A00H,用查表指令取出2003H单元的数据后,要求保持DPTR中的内容不变。完成以上功能的程序如下:第第3章章 指令系统及汇编指令系统及汇编MOVA,03H;(A)03H,7403PUSHDPH;保护DPTR高8位入栈,C083PUSHDPL;保护DPTR低8位入栈,C082MOVDPTR,2000H;(DPTR)2000H,902000MOVCA,A+DPTR;(A)(2000H+03H),93POPDPL;弹出DPTR低8位,D082POPDPH;弹出DPTR高8位,(先进后出),83第第3章章 指令系统及汇编指令系统及汇编3.3.2

31、算术运算类指令算术运算类指令共有24条,可分为加法、带进位加法、带借位减法、加1减1,乘除及十进制调整指令共6组。它主要完成加、减、乘、除四则运算,以及增量、减量和二十进制调整操作,对8位无符号数可进行直接运算;借助溢出标志,可对带符号数进行2的补码运算;借助进位标志,可进行多字节加减运算,也可以对压缩BCD码(即单字节中存放两位BCD码)进行运算。第第3章章 指令系统及汇编指令系统及汇编1.加法指令加法指令共有如下4条指令,操作数助记符为ADD。ADDA,data;(A)(A)+data,24dataADDA,direct;(A)(A)+(direct),25directADDA,Ri;(A

32、)(A)+(Ri),2627ADDA,Rn;(A)(A)+(Rn),282F第第3章章 指令系统及汇编指令系统及汇编这4条指令使得累加器A可以和内部RAM的任何一个单元的内容进行相加,也可以和一个8位立即数相加,相加结果存放在A中。无论是哪一条加法指令,参加运算的都是两个8位二进制数。对用户来说,这些8位数可当作无符号数(0255),也可以当作带符号数(-128+127), 即补码数。 例如: 对于二进制数11010011,用户可认为它是无符号数,即为十进制数211,也可以认为它是带符号数,即为十进制负数-45。但计算机在作加法运算时,总按以下规定进行:第第3章章 指令系统及汇编指令系统及汇编

33、(1)在求和时,总是把操作数直接相加,而无须任何变换。例如,若A=11010011B,R1=11101000B,执行指令ADDA,R1时,其算式表达为:11010011+11101000110111011相加后(A)=10111011B。若认为是无符号相加,则A的值代表十进制数187;若认为是带符号补码数相加,则A的值为十进制负数-69。第第3章章 指令系统及汇编指令系统及汇编(2)在确定相加后进位标志CY的值时,总是把两个操作数作为无符号数直接相加而得出进位CY值。如上例中,相加后CY=1。若为无符号数相加CY代表十进制数256,但若是两个带符号数相加,CY没有意义。(3)在确定相加后溢出标

34、志OV的值时,计算机总是把操作数当作带符号数来对待。在作加法运算时,一个正数和一个负数相加是不可能产生溢出的,只有两个同符号数相加才有可能产生溢出,表示运算结果出错。第第3章章 指令系统及汇编指令系统及汇编(4)加法指令还会影响半进位标志和奇偶标志P。在上述例子中,由于D3相加对D4没有进位,所以AC=0,而由于运算结果A中1的数目为偶数,故P=0。例如:设(A)=49H,(R0)=6BH,执行指令:ADDA,R0;(A)(A)+(R0),28结果为:(A)=B4H,OV=1,CY=0,AC=1,P=0。第第3章章 指令系统及汇编指令系统及汇编2.带进位加法指令带进位加法指令有如下4条指令,其

35、助记符为ADDC。ADDCA,data;(A)(A)+(CY)+data,34dataADDCA,direct;(A)(A)+(CY)+(direct),35directADDCA,Ri;(A)(A)+(CY)+(Ri),3637ADDCA,Rn;(A)(A)+(CY)+(Rn),383F第第3章章 指令系统及汇编指令系统及汇编例如: 设(A)=C3H, 数据指针低位(DPL)=ABH,CY=1执行指令:ADDCA,DPL;(A)(A)+(CY)+(DPL),3582结果为:(A)=6FH,CY=1,OV=1,AC=0,P=0。第第3章章 指令系统及汇编指令系统及汇编例1:双字节无符号数加法(

36、R0R1)+(R2R3)(R4R5)R0、R2、R4存放16位数的高字节,R1、R3、R5存放低字节。由于不存在16位数加法指令,所以只能先加低8位,后加高8位,而在加高8位时要连低8位相加时产生的进位一起相加。假设其和不超过16位,其编程如下:第第3章章 指令系统及汇编指令系统及汇编MOVA,R1;取被加数低字节,E9ADDA,R3;低字节相加,2BMOVR5,A;保存和低字节,FDMOVA,R0;取高字节被加数,E8ADDCA,R2;两高字节之和加低位进位,3AMOVR4,A;保存和高字节,FC第第3章章 指令系统及汇编指令系统及汇编3.带借位减法带借位减法指令有如下4条指令,其助记符为S

37、UBB。SUBBA,data;(A)(A)(CY)data,94dataSUBBA,direct;(A)(A)(CY)(direct),95directSUBBA,Ri;(A)(A)(CY)(Ri),9697SUBBA,Rn;(A)(A)(CY)(Rn),989F第第3章章 指令系统及汇编指令系统及汇编由于减法指令只有带借位减法指令,因此,若要进行不带借位位的减法操作,需先清借位位,即置CY=0。清CY有专门的指令,它属于位操作类指令(详见3.3.5节),指令为:CLRC;(CY)0,C3例如:设(A)=52H,(R0)=B4H执行指令:CLRC;(CY)0,C3SUBBA,R0;(A)(A)

38、(CY)(R0),98结果为:(A)=9EH,CY=1,AC=1,OV=1,P=1。第第3章章 指令系统及汇编指令系统及汇编例2:双字节无符号数相减(R0R1)(R2R3)(R4R5)。R0、R2、R4存放16位数的高字节,R1、R3、R5存放低字节,先减低8位,后减高8位和低位减借位。由于低位开始减时没有借位,所以要先清零。其编程如下:MOVA,R1;取被减数低字节,E9CLRC;清借位位,C3SUBBA,R3;低字节相减,9BMOVR5,A;保存差低字节,FDMOVA,R0;取被减数高字节,E8SUBBA,R2;两高字节差减低位借位,9AMOVR4,A;保存差高字节,FC第第3章章 指令系

39、统及汇编指令系统及汇编4.加1,减1指令加1指令共有如下5条指令,助记符为INC。INCA;(A)(A)+1,04INCdirect;(direct)(direct)+1,05directINCRi;(Ri)(Ri)+1,0607INCRn;(Rn)(Rn)+1,080FINCDPTR;(DPTR)(DPTR)+1,A3第第3章章 指令系统及汇编指令系统及汇编减1指令有如下4条指令,助记符为DEC。DECA;(A)(A)1,14DECdirect;(direct)(direct)1,15directDECRi;(Ri)(Ri)1,1617DECRn;(Rn)(Rn)1,181F第第3章章 指令

40、系统及汇编指令系统及汇编例如:设(R0)=7EH,(7EH)=FFH,(7FH)=38H,(DPTR)=10FEH,分析逐条执行下列指令后各单元的内容。INCR0;使7EH单元内容由FFH变为00HINCR0;使R0的内容由7EH变为7FHINCR0;使7FH单元内容由38H变为39HINCDPTR;使DPL为FFH,DPH不变INCDPTR;使DPL为00H,DPH为11HINCDPTR;使DPL为01H,DPH不变第第3章章 指令系统及汇编指令系统及汇编5.乘、除法指令乘、除法指令为单字节4周期指令,在指令执行周期中是最长的两条指令。(1)乘法指令MULAB(B)(A)(B)158,(A)

41、(A)(B)70(CY)0A4第第3章章 指令系统及汇编指令系统及汇编乘法指令的功能是把累加器A和寄存器B中的两个8位无符号数相乘,将乘积16位数中的低8位存放在A中,高8位存放在B中。若乘积大于FFH(255),则溢出标志OV置1,否则OV清0。乘法指令执行后进位标志CY总是清零,即CY=0。另外,乘法指令本身只能进行两个8位数的乘法运算,要进行多字节乘法还需编写相应的程序。例如:若(A)=4EH(78),(B)=5DH(93)执行指令:MULAB结 果 为 : 积 为 (BA)=1C56H(7254) FFH(255),(A)=56H,(B)=1CH,OV=1,CY=0,P=0。第第3章章

42、 指令系统及汇编指令系统及汇编例3:利用单字节乘法指令进行双字节数乘以单字节数运算。若被乘数为16位无符号数,地址为M1和M1+1(低位先、高位后),乘数为8位无符号数,地址为M2,积存入R2、R3和R4三个寄存器中。(M1+1)(M1)(M2)R3R4BAR2R3R4第第3章章 指令系统及汇编指令系统及汇编参考程序如下:MOVR0,M1;被乘数地址存于R0MOVA,R0;取16位数低8位MOVB,M2;取乘数MULAB;(M1)(M2)MOVR4,A;存积低8位MOVR3,B;暂存(M1)(M2)高8位INCR0;指向16位数高8位MOVA,R0;取被乘数高8位第第3章章 指令系统及汇编指令

43、系统及汇编MOVB,M2;取乘数MULAB;(M1+1)(M2)ADDA,R3;(A)+(R3)得(积)158MOVR3,A;(积)158存R3MOVA,B;积最高8位送AADDCA,00H;积最高8位+CY得(积)2316MOVR2,A;(积)2316存入R2 若上述程序执行前: (M1+1)=ABH, (M1)=CDH,(M2)=64H,则执行后:(R2)=43H,(R3)=1CH,(R4)=14H。第第3章章 指令系统及汇编指令系统及汇编(2)除法指令(A)(A)(B)之商,(B)(A)(B)之余数(CY)0,(OV)0除法指令的功能是把累加器A中的8位无符号整数除以寄存器B中的8位无符

44、号整数,所得商存于累加器A中,余数存于寄存器B中,进位标志CY和溢出标志OV均被清零。若除数B中的内容为0时,除法运算没有意义, 结果为不定值, 此时溢出标志OV被置为1 , 即OV=1,而CY仍为0。DIVAB;,84第第3章章 指令系统及汇编指令系统及汇编例4:利用除法指令把累加器A中的8位二进制数转换为3位BCD数,并以压缩形式存放在地址M1、M2单元中。解: 累加器A中的8 位二进制数, 先对其除以100(64H),商数即为十进制的百位数;余数部分再除以10(0AH),所得商数和余数分别为十进制十位数和个位数,即得到3位BCD数。百位数放在M1中,十位、个位数压缩BCD数放在M2中,十

45、位与个位数的压缩BCD数的存放是通过SWAP和ADD指令实现的。参考程序如下:第第3章章 指令系统及汇编指令系统及汇编MOVB,64H;除数100送BDIVAB;得百位数MOVM1,A;百位数存于M1中MOVA,0AH;取除数10XCHA,B;上述余数与除数交换DIVAB;得十位数和个位数SWAPA;十位数存于A的高4位ADDA,B;组成压缩BCD数MOVM2,A;十、个位压缩BCD数存M2若上述程序执行前:(A)=A8H(168),则执行后:(M1)=(01)BCD,(M2)=(68)BCD。第第3章章 指令系统及汇编指令系统及汇编6.十进制调整指令若(A)309或(AC)=1,则(A)30

46、(A)30+06HDAA若(A)749或(CY)=1,则(A)74(A)74+06H,D4十进制调整指令是一条对二十进制的加法进行调整的指令。两个压缩BCD码按二进制相加,必须经过本条指令调整后才能得到正确的压缩BCD码和数,实现十进制的加法运算。由于指令要利用AC、CY等标志才能起到正确的调整作用,因此它必须跟在加法ADD、ADDC指令后面方可使用。第第3章章 指令系统及汇编指令系统及汇编例5:对BCD码加法65+58BDH,进行十进制调整。解:参考程序如下:MOVA,65H;(A)65ADDA,58H;(A)(A)+58DAA;十进制调整执行结果:(A)=(23)BCD,(CY)=1,即:

47、65+58=123。0110010165+010110005810111101BD+01100110加66H调整100100011第第3章章 指令系统及汇编指令系统及汇编例6:双字节压缩BCD码加法。解:设R5(高)、R4(低)为被加数;R3(高)、R2(低)为加数,相加和的结果存入:R6(万)、R5(千、百)、R4(十、个)。参考程序如下:MOVA,R4;被加数十位、个位送入AADDA,R2;十位、个位相加DAA;和的十位、个位调整MOVR4,A;和的十位、个位存入R4MOVA,R5;被加数千位、百位送入AADDCA,R3;千位、百位的和加低位进位第第3章章 指令系统及汇编指令系统及汇编DA

48、A;和的千位、百位调整MOVR5,A;和的千位、百位存入R5MOVA,00H;A清零ADDCA,00H;求和的万位值MOVR6,A;和的万位存入R6若程序执行前:(R5)=(98)BCD,(R4)=(76)BCD,(R3)=(54)BCD,(R2)=(32)BCD,则执行后:(R6)=(01)BCD,(R5)=(53)BCD,(R4)=(08)BCD。第第3章章 指令系统及汇编指令系统及汇编例7:利用十进制加法调整指令DA作十进制减法调整。解:由于DA指令不能直接对减法进行十进制调整,为了进行十进制减法运算,只能用加减数的补数来进行。两位十进制数是对100取补的,如60-30=30,也可改为补

49、数相加:60+(100-30)=130丢掉进位(模)100后,就得到正确的结果。第第3章章 指令系统及汇编指令系统及汇编在实际运算时,由于CPU为8位,不可能用9位二进 制 数 表 示 十 进 制 数 100, 但 可 用 8位 二 进 制 数10011010(9AH)代替,因为这个二进制数经过十进制调整后就是100000000。这样十进制无符号数的减法运算可按以下步骤进行:(1)求减数的补数(9AH-减数);(2)被减数与减数的补数相加;(3)经DA指令调整后就得到所求的十进制减法运算结果。第第3章章 指令系统及汇编指令系统及汇编这里用“补数”而不是“补码”是为了和带符号位的补码加以区别。由

50、于现在操作数都是正数,没有必要再加符号位,故称“补数”更为合适一些。设M1、M2、M3分别为被减数、减数和差的符号地址,相应的十进制减法运算程序如下:第第3章章 指令系统及汇编指令系统及汇编CLRC;CY清0MOVA,9AH;(A)9AHSUBBA,M2;求减数的补数ADDA,M1;加补数完成减法DAA;十进制调整MOVM3,A;差存入M3单元若程序执行前:(M1)=(91)BCD,(M2)=(36)BCD,则程序执行后:(M3)=(55)BCD。第第3章章 指令系统及汇编指令系统及汇编3.3.3逻辑运算及移位类指令逻辑运算及移位指令共有24条,其中逻辑指令有“与”、“或”、“异或”、累加器A

51、清零和求反20条,移位指令4条。1.逻辑“与”运算指令逻辑“与”运算指令共有如下6条,其助记符为ANL。ANLdirect,A;(direct)(direct)(A),52directANLdirect,data;(direct)(direct)data,53directdata第第3章章 指令系统及汇编指令系统及汇编ANLA,data;(A)(A)data,54dataANLA,direct;(A)(A)(direct),55directANLA,Ri;(A)(A)(Ri),5657ANLA,Rn;(A)(A)(Rn),585F逻辑“与”运算指令是将两个指定的操作数按位进行逻辑“与”的操作。

52、例如:(A)=FAH=11111010B,(R1)=7FH=01111111B执行指令:ANLA,R1;(A)1111101001111111结果为:(A)=01111010B=7AH。逻辑“与”ANL指令常用于屏蔽(置0)字节中某些位。若清除某位,则用“0”和该位相与;若保留某位,则用“1”和该位相与。第第3章章 指令系统及汇编指令系统及汇编2.逻辑“或”运算指令逻辑“或”运算指令共有如下6条指令,其助记符为ORL。ORLdirect,A;(direct)(direct)(A),42directORLdirect,data;(direct)(direct)data,43directdataO

53、RLA,data;(A)(A)data,44dataORLA,direct;(A)(A)(direct),45directORLA,Ri;(A)(A)(Ri),4647ORLA,Rn;(A)(A)(Rn),484F第第3章章 指令系统及汇编指令系统及汇编逻辑“或”指令将两个指定的操作数按位进行逻辑“或”操作。它常用来使字节中某些位置“1”,欲保留(不变)的位用“0”与该位相或,而欲置位的位则用“1”与该位相或。例如:若(A)=C0H,(R0)=3FH,(3F)=0FH执行指令:ORLA,R0;(A)(A)(R0)结果为:(A)=CFH。第第3章章 指令系统及汇编指令系统及汇编又如:根据累加器A

54、中40位的状态,用逻辑与、或指令控制P1口40位的状态,P1口的高3位保持不变。ANLA,00011111B;屏蔽A的高3位ANLP1,11100000B;保留P1的高3位ORLP1,A;使P140按A40置位若上述程序执行前:(A)=B5H=10110101B,(P1)=6AH=01101010B,则执行程序后:(A)=15H=00010101B,(P1)=75H=01110101B。第第3章章 指令系统及汇编指令系统及汇编3.逻辑“异或”运算指令“异或”运算是当两个操作数不一致时结果为1,两个操作数一致时结果为0,这种运算也是按位进行,共有如下6条指令,其助记符为XRL。XRLdirect

55、,A;(direct)(direct)(A),62directXRLdirect,data;(direct)(direct)data,63dataXRLA,data;(A)(A)data,64dataXRLA,direct;(A)(A)(direct),65directXRLA,Ri;(A)(A)(Ri),6667XRLA,Rn;(A)(A)(Rn),686F第第3章章 指令系统及汇编指令系统及汇编逻辑“异或”指令常用来对字节中某些位进行取反操作,欲某位取反则该位与“1”相异或;欲某位保留则该位与“0”相异或。还可利用异或指令对某单元自身异或,以实现清零操作。例如:若(A)=B5H=10110

56、101B,执行下列指令:XRLA,0F0H;A的高4位取反,低4位保留MOV30H,A;(30H)(A)=45HXRLA,30H;自身异或使A清零执行后结果:(A)=00H。第第3章章 指令系统及汇编指令系统及汇编以上逻辑“与”、“或”、“异或”各6条指令有如下共同的特点:(1)逻辑“与”ANL、“或”ORL、“异或”XRL运算指令除逻辑操作功能不同外,三者的寻址方式相同,指令字节数相同,机器周期数相同。(2)ANL、ORL、XRL的前两条指令的目的操作数均为直接地址方式,可很方便地对内部RAM的00HFFH任一单元或特殊功能寄存器的指定位进行清零、置位、取反、保持等逻辑操作。第第3章章 指令

57、系统及汇编指令系统及汇编(3)ANL、ORL、XRL的后4条指令,其逻辑运算的目的操作数均在累加器A中,且逻辑运算结果保存在A中。4.累加器A清零与取反指令CLRA;(A)00H,E4CPLA;(A)(A),F4第1条是对累加器A清零指令,第2条是把累加器A的内容取反后再送入A中保存的对A求反指令,它们均为单字节指令。若用其它方法达到清零或取反的目的,则至少需用双字节指令。第第3章章 指令系统及汇编指令系统及汇编例如:上例中用异或指令使累加器清零,需要两条双字节指令:MOV30H,A和XRLA,30H共占用四字节存储空间;若用MOVA,00H实现累加器清零,也需一条双字节指令,而用CLRA一条

58、单字节指令就可完成A清零的操作,大大节约了程序的存储空间和程序的执行时间。第第3章章 指令系统及汇编指令系统及汇编例1:双字节数求补码。解:对于一个16位数,R3存高8位,R2存低8位,求补结果仍存R3、R2。求补的参考程序如下:MOVA,R2;低8位数送ACPLA;低8位数取反ADDA,01H;加1得低8位数补码MOVR2,A;存补码低8位MOVA,R3;高8位数送ACPLA;高8位取反ADDCA,00H;加低8位进位MOVR3,A;存补码高8位第第3章章 指令系统及汇编指令系统及汇编5.移位指令移位指令有如下循环左移、带进位位循环左移、循环右移和带进位位循环右移4条指令,移位只能对累加器A

59、进行。循环左移RLA;(An+1)(An),(A0)(A7),23带进位位循环左移RLCA;(An+1)(An),(CY)(A7),(A0)(CY),33循环右移RRA;(An)(An+1),(A7)(A0),03带进位位循环右移RRCA;(An)(An+1),(CY)(A0),(A7)(CY),13以上移位指令操作,可用图35表示。第第3章章 指令系统及汇编指令系统及汇编图35移位指令操作示意图第第3章章 指令系统及汇编指令系统及汇编另外,值得一提的是在前述数据传送类指令中有一条累加器A的内容半字节交换指令:SWAPA;(A)74(A)30,C4它实际上相当于执行循环左移指令4次。该指令在B

60、CD码的变换中是很有用的,如3.3.2节的例4。第第3章章 指令系统及汇编指令系统及汇编例如:设(A)=43H,(CY)=0,则执行指令:RLA;RLCA;RRA;RRCA;结果为:(A)=86H,(CY)=0(A)=0CH,(CY)=1(A)=06H,(CY)=1(A)=83H,(CY)=0第第3章章 指令系统及汇编指令系统及汇编例2:16位数的算术左移。16位数在内存中低8位存放在M1单元,高8位存放在M1+1单元。解:所谓算术左移就是将操作数左移一位,并使最低位补充0,相当于完成16位数的乘2操作,故称算术左移。参考程序如下:CLRC;进位CY清零MOVR1,M1;操作数地址M1送R1M

61、OVA,R1;16位数低8位送ARLCA;低8位左移,最低位补0第第3章章 指令系统及汇编指令系统及汇编MOVR1,A;低8位左移后,回送M1存放INCR1;指向16位高8位地址M1+1MOVA,R1;高8位送ARLCA;高8位带低8位进位左移MOVR1,A;高8位左移后回送M1+1存放第第3章章 指令系统及汇编指令系统及汇编3.3.4控制转移类指令控制转移类指令共计17条,可分为无条件转移指令、条件转移指令、子程序调用及返回指令。有了丰富的控制转移类指令,就能很方便地实现程序的向前、向后跳转,并根据条件分支运行、循环运行、调用子程序等。1.无条件转移指令无条件转移指令有如下4条指令,它们提供

62、了不同的转移范围和寻址方式:LJMPaddr16;(PC)addr16,02addr158addr70AJMPaddr11;(PC)(PC)+2,addr10800001addr70(PC)100addr11第第3章章 指令系统及汇编指令系统及汇编SJMPrel;(PC)(PC)+2+rel,80relJMPA+DPTR;(PC)(A)+DPTR,73(1)LJMP称为长转移指令,三字节指令,提供16位目标地址addr16。例如:在程序存储器0000H单元存放一条指令:LJMP3000H;(PC)3000H,023000则上电复位后程序将跳到3000H单元去执行用户程序。第第3章章 指令系统及

63、汇编指令系统及汇编(2)AJMP称为绝对转移指令,双字节指令。它的机器代码是由11位直接地址addr11和指令特有操作码00001,按下列分布组成的:该指令执行后,程序转移的目的地址是由AJMP指令所在位置的地址PC值加上该指令字节数2,构成当前PC值。取当前PC值的高5位与指令中提供的11位直接地址形成转移的目的地址,即:a10a9a800001a7a6a5a4a3a2a1a0PC15PC14PC13PC12PC11a10a9a8a7a6a5a4a3a2a1a0PC转移目的地址:第第3章章 指令系统及汇编指令系统及汇编由 于 11 位 地 址 的 范 围 是 0000000000011111

64、111111,即2KB范围,而目标地址的高5位是由PC当前值固定的,所以程序可转移的位置只能是和PC当前值在同一2KB的范围之内。本指令转移可以向前也可以向后,指令执行后不影响状态标志位。例如:若AJMP指令地址(PC)=2300H。执行指令:AJMP0FFH;(PC)(PC)+2=2302H,01FF(PC)10000011111111第第3章章 指令系统及汇编指令系统及汇编结果为:转移目的地址(PC)=20FFH,程序向前转向20FFH单元开始执行。又如:若AJMP指令地址(PC)=2FFFH。执行指令:AJMP0FFH;(PC)(PC)+2=3001H,01FF(PC)100000111

65、11111结果为:转移目的地址(PC)=30FFH,程序向后转向30FFH单元开始执行。第第3章章 指令系统及汇编指令系统及汇编(3)SJMP称为短转移指令,双字节指令,指令的操作数是相对地址rel。由于rel是带符号的偏移量,所以程序可以无条件向前或向后转移,转移的范围是在SJMP指令所在地址PC值(源地址)加该指令字节数2的基础上,以-128+127为偏移量(256个单元)的范围内实现相对短转移,即:目的地址=源地址+2+rel第第3章章 指令系统及汇编指令系统及汇编用汇编语言编程时,指令中的相对地址rel往往用欲转移至的地址的标号(符号地址)表示,能自动算出相对地址值;但人工将程序翻译成

66、机器代码时,需自己计算相对地址rel。rel的计算公式如下:向前转移:rel=FE(源地址与目的地址差的绝对值)向后转移:rel=(源地址与目的地址差的绝对值)2若rel值大于80H,程序向前转移;若rel值小于80H,则程序向后转移。例如:设(PC)=2100H,若转向215CH去执行程序,则:rel=(215CH2100H)2H=5AH第第3章章 指令系统及汇编指令系统及汇编(4)JMP称为间接长转移指令。它是以数据指针DPTR的内容为基址,以累加器A的内容为相对偏移量,在64KB范围内可无条件转移的单字节指令。该指令的特点是转移地址可以在程序运行中加以改变。例如:根据累加器A的数值,转不

67、同处理程序的入口。MOVDPTR,TABLE;表首址送DPTRJMPA+DPTR;依据A值转移TABLE:AJMPTAB1;当(A)=0时转TAB1执行AJMPTAB2;当(A)=2时转TAB2执行AJMPTAB3;当(A)=4时转TAB3执行第第3章章 指令系统及汇编指令系统及汇编2.条件转移指令(判跳指令)条件转移指令是当某种条件满足时,程序转移执行;条件不满足时,程序仍按原来顺序继续执行。条件转移的条件可以是上一条指令或者更前一条指令的执行结果(常体现在标志位上),也可以是条件转移指令本身包含的某种运算结果。1)累加器判零转移指令这类指令有2条:JZrel;若(A)=0,则(PC)(PC

68、)+2+rel60rel若(A)0,则(PC)(PC)+2第第3章章 指令系统及汇编指令系统及汇编JNZrel;若(A)0,则(PC)(PC)+2+rel,70rel若(A)=0,则(PC)(PC)+2例1:将外部数据RAM的一个数据块传送到内部数据RAM,两者的首址分别为DATA1和DATA2,遇到传送的数据为零时停止。解:外部RAM向内部RAM的数据传送一定要以累加器A作为过渡,利用判零条件转移正好可以判别是否要继续传送或者终止。完成数据传送的参考程序如下:第第3章章 指令系统及汇编指令系统及汇编MOVR0,DATA1;外部数据块首址送R0MOVR1,DATA2;内部数据块首址送R1LOO

69、P:MOVXA,R0;取外部RAM数据入AHERE:JZHERE;数据为零则终止传送MOVR1,A;数据传送至内部RAM单元INCR0;修改地址指针,指向下一数据地址INCR1SJMPLOOP;循环取数第第3章章 指令系统及汇编指令系统及汇编2)比较转移指令比较转移指令共有4条,其一般格式为:CJNE目的操作数,源操作数,rel这组指令是先对两个规定的操作数进行比较,根据比较的结果来决定是否转移到目的地址。4条比较转移指令如下:CJNEA,data,rel;B4datarelCJNEA,direct,rel;B5directrelCJNERi,data,rel;B6B7datarelCJNER

70、n,data,rel;B8Bfdatarel第第3章章 指令系统及汇编指令系统及汇编这4条指令的含义分别为:第1条指令:累加器内容与立即数比较,不等则转移;第2条指令:累加器内容与内部RAM(包括特殊功能寄存器)内容比较,不等则转移;第3条指令:内部RAM内容与立即数比较,不等则转移;第4条指令:工作寄存器内容与立即数比较,不等则转移。第第3章章 指令系统及汇编指令系统及汇编以上4条指令的差别仅在于操作数的寻址方式不同,均完成以下操作:若目的操作数=源操作数,则(PC)(PC)+3;若目的操作数源操作数, 则 (PC) (PC)+3+rel,CY=0;若目的操作数源操作数, 则 (PC) (P

71、C)+3+rel,CY=1;指令的操作过程如图36所示。第第3章章 指令系统及汇编指令系统及汇编偏移量rel的计算公式为:向前转移:rel=FD(源地址与目的地址差的绝对值)向后转移:rel=(源地址与目的地址差的绝对值)-3例如:当P1口输入为3AH时,程序继续进行,否则等待,直至P1口出现3AH。参考程序如下:MOVA,3AH;立即数3A送A;743AWAIT:CJNEA,P1,WAIT;(P1)3AH,则等待,B590FD第第3章章 指令系统及汇编指令系统及汇编图36比较转移指令操作示意图第第3章章 指令系统及汇编指令系统及汇编3)减1条件转移指令(循环转移指令)减1条件转移指令有如下两

72、条:DJNZdirect,rel;(direct)(direct)1,D5directrel若(direct)=0,则(PC)(PC)+3否则,(PC)(PC)+3+relDJNZRn,rel;(Rn)(Rn)1,D8DFrel若(Rn)=0,则(PC)(PC)+2否则,(PC)(PC)+2+rel第第3章章 指令系统及汇编指令系统及汇编这组指令是把减1功能和条件转移结合在一起的一组指令。程序每执行一次该指令,就把第一操作数减1,并且结果保存在第一操作数中,然后判断操作数是否为零。若不为零,则转移到规定的地址单元,否则顺序执行。转移的目标地址是在以PC当前值为中心的128+127的范围内。如果

73、第一操作数原为00H,则执行该组指令后,结果为FFH,但不影响任何状态标志。第第3章章 指令系统及汇编指令系统及汇编例2:软件延时程序:MOVR1,0AH;给R1赋循环初值DELAY:DJNZR1,DELAY;(R1)(R1)1,若(R1)0则循环由于DJNZR1,DELAY为双字节双周期指令,当单片机主频为12MHz时,执行一次该指令需24个振荡周期约2s。因此,R1中置入循环次数为10时,执行该循环指令可产生20s的延时时间。第第3章章 指令系统及汇编指令系统及汇编例3:将内部RAM中从DATA单元开始的10个无符号数相加,相加结果送SUM单元保存。解:设相加结果不超过8位二进制数,则相应

74、的程序如下:MOVR0,0AH;给R0置计数器初值MOVR1,DATA;数据块首址送R1CLRA;A清零第第3章章 指令系统及汇编指令系统及汇编LOOP:ADDA,R1;加一个数INCR1;修改地址,指向下一个数DJNZR0,LOOP;R0减1,不为零循环MOVSUM,A;存10个数相加和第第3章章 指令系统及汇编指令系统及汇编3.子程序调用及返回指令在主程序中,有时需要反复执行某段程序,通常把这段程序设计成子程序,用一条子程序调用指令,将程序转向子程序的入口地址。(1)子程序调用指令。子程序调用有长调用指令LCALL和绝对调用指令ACALL两条,它们分别表示如下:LCALLaddr16;(P

75、C)(PC)+3,12addr158addr70(SP)(SP)+1,(SP)(PC70)(SP)(SP)+1,(SP)(PC158)(PC)addr150第第3章章 指令系统及汇编指令系统及汇编ACALLaddr11;(PC)(PC)+2,addr10810001addr70(SP)(SP)+1,(SP)(PC70)(SP)(SP)+1,(SP)(PC158)(PC)100addr11LCALL和 ACALL指 令 类 似 于 转 移 指 令 LJMP和AJMP,不同之处在于它们在转移前要把执行完该指令的PC内容自动压入堆栈后,才将addr16(或addr11)送往PC,即把子程序的入口地址

76、装入PC。第第3章章 指令系统及汇编指令系统及汇编LCALL与LJMP一样提供16位地址,可调用64KB范围内所指定的子程序。由于该指令为三字节指令,所以执行该指令时首先把(PC)+3(PC),以获得下一条指令地址,并把此时PC内容压入堆栈(先压入低字节,后压入高字节)作为返回地址,堆栈指针SP加2指向栈顶,然后把目的地址addr16装入PC。执行该指令不影响标志位。第第3章章 指令系统及汇编指令系统及汇编ACALL与AJMP一样提供11位目的地址。由于该指令为两字节指令,所以执行该指令时(PC)+2(PC)以获得下一条指令的地址,并把该地址压入堆栈作为返回地址。该指令可寻址2KB,只能在与P

77、C同一2KB的范围内调用子程序。执行该指令不影响标志位。例如:设:(SP)=30H,标号为SUB1的子程序首址在2500H,(PC)=3000H。执行指令:3000H:LCALLSUB1;1225003003H结果为:(SP)=32H,(31H)=03H,(32H)=30H,(PC)=2500H。第第3章章 指令系统及汇编指令系统及汇编(2)返回指令。返回指令共有两条:一条是对应两条调用指令的子程序返回指令RET;另一条是对应从中断服务程序的返回指令RETI。RET;(PC158)(SP),(SP)(SP)1,22(PC70)(SP),(SP)(SP)1RETI;(PC158)(SP),(SP

78、)(SP)1,32(PC70)(SP),(SP)(SP)1第第3章章 指令系统及汇编指令系统及汇编4.空操作指令NOP;(PC)(PC)+1,00空操作指令是一条单字节单周期指令。它控制CPU不做任何操作,仅仅是消耗这条指令执行所需要的一个机器周期的时间,不影响任何标志,故称为空操作指令。但由于执行一次该指令需要一个机器周期,所以常在程序中加上几条NOP指令用于设计延时程序,拼凑精确延时时间或产生程序等待等。第第3章章 指令系统及汇编指令系统及汇编3.3.5位操作类指令位操作又称为布尔变量操作,它是以位(bit)作为单位来进行运算和操作的。MCS51系列单片机内设置了一个位处理器(布尔处理机)

79、,它有自己的累加器(借用进位标志CY),自己的存储器(即位寻址区中的各位),也有完成位操作的运算器等。第第3章章 指令系统及汇编指令系统及汇编这一组指令的操作对象是内部RAM中的位寻址区,即20H2FH中连续的128位(位地址00H7FH),以及特殊功能寄存器SFR中可进行位寻址的各位。在指令中,位地址的表示方法主要有以下4种(均以程序状态字寄存器PSW的第五位F0标志为例说明):(1)直接位地址表示方式:如D5H;(2)点操作符表示(说明是什么寄存器的什么位)方式:如PSW.5,说明是PSW的第五位;(3)位名称表示方法:如F0;(4)用户定义名表示方式:如用户定义用FLG这一名称(位符号地

80、址)来代替F0,第第3章章 指令系统及汇编指令系统及汇编1.位传送指令位传送指令有如下互逆的两条双字节单周期指令,可实现进位位CY与某直接寻址位bit间内容的传送。MOVC,bit;(CY)(bit),A2bitMOVbit,C;(bit)(CY),92bit上述指令中:bit为直接寻址位,C为进位标志CY的简写。第1条指令是把bit中的一位二进制数送位累加器CY中,不影响其余标志。第2条指令是将C中的内容传送给指定位。第第3章章 指令系统及汇编指令系统及汇编由于两个寻址位之间没有直接的传送指令,常用上述两条指令并通过C作为中间媒介来进行寻址位间的传送。例如:将内部RAM中20H单元的第7位(

81、位地址为07H)的内容,送入P1口的P1.0中的程序如下:MOVC,07H;(CY)(07H)MOVP1.0,C;(P1.0)(CY)当(20H)=A3H,(P1)=11111110B时,执行上述指令后修改了P1口第0位,即(CY)=1,(P1)=11111111B。第第3章章 指令系统及汇编指令系统及汇编2.位置位指令对进位标志CY以及位地址所规定的各位都可以进行置位或清零操作,共有如下4条指令:CLRbit;(bit)0,C2bitCLRC;(CY)0,C3SETBbit;(bit)1,D2bitSETBC;(CY)1,D3第第3章章 指令系统及汇编指令系统及汇编前两条指令为位清零指令,后

82、两条指令为位置1指令。当第1、3条指令的直接寻址位为某端口的某位时,指令执行时具有读修改写功能。例如:将P1口的P1.7置位,并清进位位的程序如下:SETBP1.7;(P1.7)1CLRC;(CY)0当(P1)=00001111B时,执行完上述指令后,(P1)=10001111B,(CY)=0。第第3章章 指令系统及汇编指令系统及汇编3.位逻辑指令位逻辑指令包含“与”ANL、“或”ORL、“非”CPL位逻辑运算操作,共有如下6条指令:ANLC,bit;(CY)(CY)(),82bitANLC,/bit;(CY)(CY)(),B0bitORLC,bit;(CY)(CY)(),72bitORLC,

83、/bit;(CY)(CY)(),A0bitCPLbit;(bit)(),B2bitCPLC;(CY)(C),B3第第3章章 指令系统及汇编指令系统及汇编例1:完成(Z)=(X)(Y)异或运算,其中:X、Y、Z表示位地址。解:异或运算可表示为:(Z)=(X)()+()(Y),参考子程序如下:PR1:MOVC,X;(CY)(X)ANLC,/Y;(CY)(X)()MOVZ,C;暂存Z中MOVC,Y;(CY)(Y)ANLC,/X;(CY)()(Y)ORLC,Z;(CY)(X)()+()(Y)MOVZ,C;保存异或结果RET第第3章章 指令系统及汇编指令系统及汇编例2:利用位逻辑指令,模拟图37所示硬件

84、逻辑电路功能。参考子程序如下:PR2:MOVC,P1.1;(CY)(P1.1)ORLC,P1.2;(CY)(P1.1)(P1.2)=AANLC,P1.0;(CY)(P1.0)ACPLC;(CY)MOVF0,C;F0内暂存BMOVC,P1.3;(CY)(P1.3)ANLC,/P1.4;(CY)(P1.3)ORLC,F0;(CY)BDMOVP1.5,C;运算结果送入P1.5RET第第3章章 指令系统及汇编指令系统及汇编4.位条件转移指令位条件转移指令是以进位标志CY或者位地址bit的内容作为是否转移的条件,共有5条指令。(1)以CY内容为条件的双字节双周期转换指令。JCrel;若(CY)=1,则(

85、PC)(PC)+2+rel转移,40rel否则,(PC)(PC)+2顺序执行JNCrel;若(CY)=0,则(PC)(PC)+2+rel转移,50rel否则,(PC)(PC)+2顺序执行第第3章章 指令系统及汇编指令系统及汇编这两条指令常和比较条件转移指令CJNE一起使用,先由CJNE指令判别两个操作数是否相等,若相等就顺序执行;若不相等则依据两个操作数的大小置位或清零CY(参见图3-6),再由JC或JNC指令根据CY的值决定如何进一步分支,从而形成三分支的控制模式,如图3-8所示。第第3章章 指令系统及汇编指令系统及汇编图37例2硬件逻辑电路第第3章章 指令系统及汇编指令系统及汇编图38CJ

86、NE与JC(或JNC)一起构成三分支模式第第3章章 指令系统及汇编指令系统及汇编例3:比较内部RAMI、J单元中A、B两数的大小。若A=B,则使内部RAM的位K置1;若AB,则大数存M单元,小数存N单元。设A、B数均为带符号数,以补码数存入I、J中,该带符号数比较子程序的比较过程示意图如图39所示。参考子程序如下:第第3章章 指令系统及汇编指令系统及汇编图39带符号数比较过程示意图第第3章章 指令系统及汇编指令系统及汇编MOVA,I;A数送累加器AANLA,80H;判A数的正负JNZNEG;A0则转至NEGMOVA,J;B数送累加器AANLA,80H;判B数的正负JNZBIG1;A0,B0,转

87、BIG1SJMPCOMP;A0,B0,转COMPNEG:MOVA,J;B数送累加器AANLA,80H;判B数的正负JZSMALL;A0,B0,转SMALLCOMP:MOVA,I;A数送累加器A第第3章章 指令系统及汇编指令系统及汇编CJNEA,J,BIG;AB则转BIGSETBK;A=B,位K置1RETBIG:JCSMALL;A0Y=0X=0-1X0则转移到POSIMOVA,0FFH;若X0时A=1COMP:MOVFUNC,A;存函数Y值HERE:AJMPHERE;结束程序第第3章章 指令系统及汇编指令系统及汇编例4:3个无符号单字节整数分别存于R1、R2、R3中,找出其中最大数放于R0中。解

88、:首先将R0清零,然后进行(R1)与(R0)减法,若(R1)(R0)0,则(R1)(R0),把(R1)送(R0);否则(R0)保持不变。再将(R0)分别与(R2)和(R3)比较,比较处理的方法与上面相同,这样比较3次后,R0中即为3数中的最大数。程序清单如下:BR2:ORG2500HMOVR0,00H;R0清零MOVA,R1;第一个数(R1)送AACALLCOMP;比较(R1)与(R0)大小第第3章章 指令系统及汇编指令系统及汇编MOVA,R2;第二个数(R2)送AACALLCOMP;比较(R2)与(R0)大小MOVA,R3;第三个数(R3)送AACALLCOMP;比较(R3)与(R0)大小H

89、ERE:AJMPHERECOMP:MOVR4,A;R4暂存A的内容CLRC;清进位位CSUBBA,R0;(A)(R0)JCM1;(A)(R0)时大数存R0M1:RET第第3章章 指令系统及汇编指令系统及汇编3.5.4循环结构程序设计在解决实际问题时,往往会遇到同样的一组操作需要重复多次的情况,这时应采用循环结构,以简化程序,缩短程序的长度及节省存储空间。例如,要做1到100的加法,没有必要写100条加法指令,而只需写一条加法指令,使其执行100次,每次执行时操作数亦作相应的变化,同样能完成原来规定的操作。第第3章章 指令系统及汇编指令系统及汇编循环程序一般由3部分组成:(1)置循环初值:即设置

90、循环开始时的状态。(2)循环体:即要求重复执行的部分。(3)循环控制部分:它包括循环参数修改和依据循环结束条件判断循环是否结束两部分。第第3章章 指令系统及汇编指令系统及汇编例5:从BLOCK单元开始有一个无符号数数据块,其长度存于LEN单元,试求出数据块中最大的数并存入MAX单元。解:该问题解决方法与例4相同,所不同的是无符号数个数增加,即搜索寻找最大值的范围扩大了。因此,本例题采用直到型单重循环的程序结构方式比较合理。程序框图如图314所示。第第3章章 指令系统及汇编指令系统及汇编图314例5程序框图第第3章章 指令系统及汇编指令系统及汇编程序清单:LOOP:ORG2000HMOVR0,B

91、LOCK;数据块首址送R0MOVR1,LEN;数据块长度送R1MOVMAX,00H;存最大数单元清零LOOP1:MOVA,MAX;(A)(MAX)CLRC;清CSUBBA,R0;(MAX)(R0)JNCNEXT;若(MAX)(R0),则转移MOVMAX,R0;若(MAX)(R0),则(MAX)(R0)NEXT:INCR0;修改地址指针DJNZR1,LOOP1;若(R1)0则循环搜索RET第第3章章 指令系统及汇编指令系统及汇编图315例6程序框图第第3章章 指令系统及汇编指令系统及汇编例6:设计100ms延时程序。解:计算机执行一条指令需要一定的时间,由一些指令组成一段程序,并反复循环执行,利

92、用计算机执行程序所用的时间来实现延时,这种程序称为延时程序。如当系统使用12MHz晶振时,一个机器周期为1s,执行一条双字节双周期DJNZ指令的时间为2s,因此,执行该指令50000次,就可以达到延时100ms的目的。对于50000次循环可采用外循环、内循环嵌套的多重循环结构。本例题的程序流程如图315所示。第第3章章 指令系统及汇编指令系统及汇编程序清单:START:ORG1000HMOVR6,0C8H;外循环200次LOOP1:MOVR7,0F8H;内循环248次NOP;时间补偿LOOP2:DJNZR7,LOOP2;延时2s248=496sDJNZR6,LOOP;延时500s200=100

93、msRET第第3章章 指令系统及汇编指令系统及汇编以上程序执行MOVRn,data指令的时间为1s,DJNZ指令2s,NOP指令1s,所以,内循环延迟时间:1s+1s+2s248=498s,外循环延迟时间:1s+(内环延时+2s)200=100.001ms。第第3章章 指令系统及汇编指令系统及汇编3.5.5子程序结构程序设计在一个程序中,将反复出现的程序段编制成一个个独立的程序段,存放在内存中,这些完成某一特定任务可被重复调用的独立程序段被称为子程序。在前面所举的例子中,已有一些程序段是以带有RET指令的子程序形式出现的。在汇编语言编程时,恰当地使用子程序,可使整个程序的结构清楚,阅读和理解方

94、便,而且还可以减少源程序和目标程序的长度,不必多次重复书写和翻译同样的指令。在汇编语言源程序中使用子程序,需要强调注意两个问题,即子程序中参数传递和现场保护的问题。第第3章章 指令系统及汇编指令系统及汇编一般在汇编语言中采用的参数传递方法有以下3种。(1)用累加器或工作寄存器来传递参数。(2)用指针寄存器传递参数。(3)用堆栈来传递参数。第第3章章 指令系统及汇编指令系统及汇编例7:将HEX单元存放的两个十六进制数分别转换成ASCII码,并存入ASC和ASC+1单元。解:由于伪指令DB在汇编后,使字节以ASCII码形式存放,所以采用查表子程序的方式来实现十六进制数到ASCII码的转换。转换子程

95、序为HASC,调用时传递参数采用堆栈来完成。程序清单如下:ORG2000HPUSHHEX;第一个十六进制数入栈ACALLHASC;调查表转换子程序第第3章章 指令系统及汇编指令系统及汇编POPASC;低4位转换值保存MOVA,HEX;十六进制数送ASWAPA;高4位低4位交换PUSHA;第二个十六进制数入栈ACALLHASC;调查表转换子程序POPASC+1;高4位转换值保存HERE:AJMPHERE;结束源程序HASC:DECSP;DECSP;修改SP到参数位置POPA;弹出十六进制数到AANLA,0FH;取A低4位第第3章章 指令系统及汇编指令系统及汇编ADDA,07H;为查表进行地址调整

96、MOVCA,A+PC;查表转换PUSHA;转换结果入栈INCSP;INCSP;恢复返回地址RETASCTAB:DB0,1,2,3,4,5,6,7DB8,9,A,B,C,D,E,FEND第第3章章 指令系统及汇编指令系统及汇编由于堆栈操作是“先入后出”,因此,先压入堆栈的参数应后弹出,才能保证恢复原来的状态。例如:SUBROU:PUSHAPUSHPSWPUSHDPLPUSHDPHPOPDPHPOPDPLPOPPSWPOPARET第第3章章 指令系统及汇编指令系统及汇编3.6 程序设计举例程序设计举例 3.6.1代码转换程序设计前面各章节的举例中已介绍了BCD码与二进制数间的相互转换(见3.5节例

97、1、例2,3.3.2节例4),以及十六进制数用查表法转换为ASCII码的程序设计方法(见3.5节例7)。第第3章章 指令系统及汇编指令系统及汇编例1:十六进制数到ASCII码的转换子程序设计。解:该转换的算法为:凡大于等于10的十六进制数加37H,凡小于10的十六进制数加30H,便可得到相应的ASCII码。入口:R2(高4位为0000,低4位为00001111的一个十六进制数0F)。出口:R2(相应的ASCII码)。程序清单如下:HASC1:MOVA,R2;十六进制数送AADDA,0F6H;(A)+(-10)补第第3章章 指令系统及汇编指令系统及汇编MOVA,R2;恢复十六进制数JNCAD30

98、H;若(A)10则转AD30HADDA,07H;(A)10则先加07HAD30H:ADDA,30H;(A)+30HMOVR2,A;ASCII码存R2RET第第3章章 指令系统及汇编指令系统及汇编例2:ASCII码到十六进制数的转换子程序设计。解:该转换的算法为:若为09的ASCII码,则减去30H;若为AF的ASCII码,则减去37H,便可得到相应的十六进制数0F。入口:R2(09或AF的ASCII码)。出口:R2(高4位为0000,低4位为00001111)。程序清单如下:ASCH1:MOVA,R2;ASCII码值送AADDA,0D0H;(A)+(-30H)补MOVR2,A;R2暂存减结果A

99、DDA,0F6H;A+(-10)补第第3章章 指令系统及汇编指令系统及汇编JNCRET1;若(A)10转RET1MOVA,R2;若(A)10则(R2)送AADDA,0F9H;(A)+(-07H)补MOVR2,A;十六进制数存R2RET1:RET第第3章章 指令系统及汇编指令系统及汇编3.6.2运算子程序设计在3.3.2节例1、例2中已经介绍了双字节无符号数的加法、减法程序,在3.3.2节例3中介绍了双字节数乘单字节数,以及在3.3.2节例5、例6、例7中介绍了BCD码加法和利用DA调整指令进行十进制减法程序等。下面再分别介绍双字节乘法、除法子程序。例3:双字节无符号数乘法子程序设计。解:算法:

100、两个双字节无符号数被分别放在R7、R6和R5、R4中。由于MCS51指令中只有8位数的乘法指令MUL,用它来实现双字节数相乘时,可把被乘数分解为:第第3章章 指令系统及汇编指令系统及汇编(R7)(R6)=(R7)28+(R6),(R5)(R4)=(R5)28+(R4)则这两个数的乘积可表示为:(R7)(R6)(R5)(R4)=(R7) 28 +(R6)(R5) 288+(R4)=(R7)(R5)216+(R7)(R4)28+(R6)(R5)28+(R6)(R4)=(R04)(R03)(R02)(R01)第第3章章 指令系统及汇编指令系统及汇编显然, 我们将(R6)(R4)放入(R02)(R01

101、)中, 将(R7)(R4)和(R6)(R5)累加到(R03)(R02)中;再将(R7)(R5)累加到(R04)(R03)中即可得到乘积结果。入口:(R7R6)=被乘数;(R5R4)=乘数;(R0)=乘积的低位字节地址指针。出口:(R0)=乘积的高位字节地址指针,指向32位积的高8位。工作寄存器:R3、R2存放部分积;R1存放进位位。第第3章章 指令系统及汇编指令系统及汇编程序清单如下:MUL1:MOVA,R6MOVB,R4MULAB;(R6)(R4)MOVR0,A;R01存乘积低8位MOVR3,B;R3暂存(R6)(R4)的高8位MOVA,R7MOVB,R4MULAB;(R7)(R4)ADDA

102、,R3;(R7)(R4)低8位加(R3)第第3章章 指令系统及汇编指令系统及汇编MOVR3,A;R3暂存28部分项低8位MOVA,B;(R7)(R4)高8位送AADDCA,00H;(R7)(R4)高8位加进位CYMOVR2,A;R2暂存28部分项高8位MOVA,R6MOVB,R5MULAB;(R6)(R5)ADDA,R3;(R6)(R5)低8位加(R3)INCR0;调整R0地址为R02单元MOVR0,A;R02存放乘积158位结果第第3章章 指令系统及汇编指令系统及汇编MOVR1,00H;清暂存单元MOVA,R2ADDCA,B;(R6)(R5)高8位加(R2)与CYMOVR2,A;R2暂存28

103、部分项高8位JNCNEXT;28项向216项无进位则转移INCR1;有进位则R1置1标记NEXT:MOVA,R7MOVB,R5MULAB;(R7)(R5)ADDA,R2;(R7)(R5)低8位加(R2)INCR0;调整R0地址为R03第第3章章 指令系统及汇编指令系统及汇编MOVR0,A;R03存放乘积2316位结果MOVA,BADDCA,R1;(R7)(R5)高8位加28项进位INCR0;调整R0地址为R04MOVR0,A;R04存放乘积3124位结果RET第第3章章 指令系统及汇编指令系统及汇编例4:双字节带符号数乘法子程序设计。解:算法:由于带符号数乘法和无符号数乘法的基本算法是一样的,

104、因此可以根据入口条件调用例3MUL1子程序进行计算。不同之处有以下3点:(1)需根据被乘数和乘数的符号计算乘积的符号;(2)当被乘数和乘数为负数时,应对它们取补,形成2的补码,然后才能调用MUL1进行运算;(3)当积为负数时,计算的结果尚需取补后才是正确的积(绝对值),积为31位。第第3章章 指令系统及汇编指令系统及汇编乘积符号的算法在本程序中分两步完成:首先用ANL指令判断两数是否均为负,若与操作的结果为1,则两数均为负,乘积应为正,对与的结果取反即为积的符号,存入SIG;若不属于此情况,则用ORL指令算出积的符号存入SIG。程序中SIG、SIG1、SIG2均为内部RAM中的可寻址位。入口:

105、(R7R6)=带符号位被乘数;(R5R4)=带符号位乘数;(R0)=乘积的低位字节地址指针。第第3章章 指令系统及汇编指令系统及汇编出口:(R0)=乘积的高位地址指针。程序清单如下:MUL2:MOVA,R7;被乘数高8位送ARLCA;(R7)的符号位送CYMOVSIG1,C;SIG1存被乘数符号MOVA,R5;乘数高8位送ARLCA;(R5)的符号位送CYMOVSIG2,C;SIG2存放乘数符号ANLC,SIG1;计算积的符号第第3章章 指令系统及汇编指令系统及汇编JCPOSI;若两数均负积为正则转POSIMOVC,SIG1;计算两数非全负时积的符号ORLC,SIG2SJMPSIGNPOSI:

106、CPLCSIGN:MOVSIG,C;存积的符号MOVA,R7JBA.7,CPL1;被乘数为负转求补STEP1:MOVA,R5JBA.7,CPL2;乘数为负转求补第第3章章 指令系统及汇编指令系统及汇编STEP2:ACALLMUL1;调(R7R6)(R5R4)子程序JBSIG,CPL3;积符号为负转求补RETCPL1:MOVA,R6;被乘数求补CPLAADDA,01HMOVR6,AMOVA,R7CPLAADDCA,00HMOVR7,ASJMPSTEP1第第3章章 指令系统及汇编指令系统及汇编CPL2:MOVA,R4;乘数求补CPLAADDA,01HMOVR4,AMOVA,R5CPLAADDCA,

107、00HMOVR5,ASJMPSTEP2CPL3:DECR0;乘积结果求补DECR0DECR0;使R0指向乘积低字节地址第第3章章 指令系统及汇编指令系统及汇编MOVR2,03H;待取补数字节数-1送R2ACALLCPL4;调用多字节数求补子程序RETCPL4:MOVA,R0;多字节数求补CPLAADDA,01HMOVR0,ASTEP3:INCR0MOVA,R0CPLAADDCA,00H第第3章章 指令系统及汇编指令系统及汇编MOVR0,ADJNZR2,STEP3;字节未转换完转移RETCPL4为多字节数求补子程序,入口为(R0)=待取补数低字节地址指针;(R2)=待取补数字节数-1。出口为(R

108、0)=求补后的高位字节地址指针。第第3章章 指令系统及汇编指令系统及汇编例5:双字节无符号数除法子程序设计。解:MCS51除法指令只能进行8位无符号数相除运算,而对于多字节除法,还需用一般的除法算法进行。常用的除法算法采用“移位相减法”,即:先设余数为0,并将被除数和余数分别左移一位,使被除数的最高位移入余数的最低位,再求(余数除数)之差,若差为正,则令差代替余数,商为1;若差为负,则不作任何操作。然后重复以上移位相减的过程,使每位被除数都参与了运算为止。第第3章章 指令系统及汇编指令系统及汇编图316例5程序框图(a)除法程序框图;(b)四舍五入处理框图第第3章章 指令系统及汇编指令系统及汇

109、编入口:(R7R6)=被除数,(R5R4)=除数。出口:(R7R6)=商数,(OVER)=溢出标志(FFH为溢出)。工作寄存器:(R3R2)=部分余数,(R1)=计数器,(R0)=差值暂存。程序清单如下:DIV:MOVA,R5;除数高8位送AJNZBEGIN;除数非零则转BEGINMOVA,R4;除数低8位送A第第3章章 指令系统及汇编指令系统及汇编JZOVER;除数为零置溢出标志BEGIN:MOVA,R7;被除数高8位送AJNZBEGIN1;被除数非零则转BEGIN1MOVA,R6;被除数低8位送AJNZBEGIN1;被除数非零则转BEGIN1RET;被除数为零则返回BEGIN1:CLRA;

110、清余数单元MOVR2,AMOVR3,A第第3章章 指令系统及汇编指令系统及汇编MOVR1,10H;双字节除法计数器置16DIV1:CLRC;开始R3R2R7R6左移MOVA,R6;被除数低8位送ARLCA;R6循环左移一位MOVR6,A;左移结果回送MOVA,R7;被除数高8位送ARLCA;R7循环左移一位MOVR7,A;左移结果回送MOVA,R2;余数左移一位RLCAMOVR2,AMOVA,R3第第3章章 指令系统及汇编指令系统及汇编RLCAMOVR3,ADIV2:MOVA,R2;开始部分余数减除数SUBBA,R4;低8位先减MOVR0,A;暂存差值MOVA,R3SUBBA,R5;高8位相减

111、JCNEXT;若部分余数除数则转NEXTINCR6;若部分余数除数则商为1MOVR3,A;新余数存R3R2MOVA,R0MOVR2,A第第3章章 指令系统及汇编指令系统及汇编NEXT:DJNZR1,DIV1;16位未除完则返回MOVA,R3;开始四舍五入处理JBA.7,ADD1;若余数最高位为1则进1CLRC;开始余数乘2处理MOVA,R2RLCA;余数低8位乘2MOVR2,AMOVA,R3RLCA;余数高8位乘2SUBBA,R5;余数2除数JCNOOVER;若余数2除数则转JNZADD1;若够减则转进1第第3章章 指令系统及汇编指令系统及汇编MOVA,R2;高8位相等时比较低8位SUBBA,

112、R4JCNOOVER;余数2除数则转ADD1:MOVA,R6;开始商进1处理ADDA,01HMOVR6,AMOVA,R7ADDCA,00HMOVR7,ANOOVER:MOVOVER,00H;清溢出标志RETOVER:MOVOVER,0FFH;置溢出标志RET第第3章章 指令系统及汇编指令系统及汇编双字节带符号数除法的算法与无符号数除法的算法基本相同,所不同的是在计算除法之前先进行商的符号确定。商的符号确定方法与例4带符号数乘法中乘积符号的确定方法相同。所以双字节带符号除法程序首先要进行商的符号确定,再调用无符号数除法子程序DIV即可,这里不再重复。第第3章章 指令系统及汇编指令系统及汇编3.6

113、.3查表程序设计查表,就是根据变量x,在表格中查找y,使y=f(x)。单片机应用系统中,查表程序是一种常用程序,它被广泛应用于LED显示器控制,打印机打印以及数据补偿、计算、转换等功能程序中(如3.3.1节例1、2、4;3.5.4节例7)。第第3章章 指令系统及汇编指令系统及汇编例6:设有一巡检报警装置,需要对16路值进行比较,当每一路输入值超过该路的报警值时,实现报警。要求编制一个查表子程序,依据路数xi,查表得yi的报警值。解:xi为路数,查表时按照0,1,2,15取值,故为单字节规则量。表格依xi顺序列表,仅存二字节报警值yi,其表格构造见表34。第第3章章 指令系统及汇编指令系统及汇编

114、表34路数xi与报警值yi对应关系第第3章章 指令系统及汇编指令系统及汇编程序入口:(R2)=路数xi。程序出口:(R4R3)=对应xi的报警值yi。查表子程序如下:STA1:MOVA,R2;路数xi送ARLA;x-i2MOVR4,A;暂存ADDA,TABL(rel);加上表首偏移量MOVCA,A+PC;查y-i第一字节XCHA,R4;第一字节送R4ADDA,TABL(rel)+1;形成第二字节表址第第3章章 指令系统及汇编指令系统及汇编MOVCA,A+PC;取yi第二字节MOVR3,A;第二字节送R3RETTAB2:DW050FH,0E89H,A695H,1EAAH;报警值表DW0D9BH,

115、7F93H,0373H,26D7HDW2710H,9E3FH,1A66H,22E3HDW1174H,16EFH,33E4H,6CA0H第第3章章 指令系统及汇编指令系统及汇编上述查表程序中使用RLA使(A)乘2,这是由于DW定义的是双字节空间,为了保证指向正确的查表地址,所以要进行乘2处理。另外,程序中使用MOVCA,A+PC指令,使表格偏移不得超过255个字节。当表格偏移大于255个字节时,应使用MOVCA,A+DPTR查表指令。第第3章章 指令系统及汇编指令系统及汇编表35x与表地址对应关系第第3章章 指令系统及汇编指令系统及汇编编制一个查表程序,将查得的函数值yi存入R4、R3中。解:入

116、口:(R3R2)=由其它程序得到的xi规则量,即:xi=0000H,0001H,0002H,。出口:(R5R4)=依据xi查得的函数值yi。查表程序如下:STA:MOVDPTR,TABL;置表首地址MOVA,R2;求yi在表中序号CLRCRLCAMOVR2,AMOVA,R3第第3章章 指令系统及汇编指令系统及汇编RLCAMOVR3,AMOVA,R2;求yi在表中地址ADDA,DPLMOVDPL,AMOVA,R3ADDCA,DPHMOVDPH,ACLRAMOVCA,A+DPTR;查表得yi高位MOVR5,AINCDPTR;表格地址加1第第3章章 指令系统及汇编指令系统及汇编CLRAMOVCA,A

117、+DPTR;查表得yi低位MOVR4,ARETTAB1:DW;函数值yi表第第3章章 指令系统及汇编指令系统及汇编例8:输入一个ASCII命令符,要求按照输入的命令字符转去执行相应的处理程序。设命令为单字节字符A、D、E、L、M、X、Z七种,相应的处理程序入口标号分别为双字节XA、XD、XE、XL、XM、XX、XZ。解:对于上述情况,由于xi与yi均为非规则量,因此在表格中必须存放相应的xi、yi值,xi为输入命令符,yi为相应处理程序入口地址,其表格构造见表36。第第3章章 指令系统及汇编指令系统及汇编表36存储内容与表地址关系第第3章章 指令系统及汇编指令系统及汇编这类表格xi、yi可以是

118、单字节、双字节或多字节,它以两种方式给出表格的容量。一种是用表格结束标志0来表示,另一种则是给出表格中的项数。本程序采用结束标志0表示。该查表子程序的算法为:当输入一个ASCII命令符时,该子程序顺序查找,若为所定义的种命令符,则转相应的处理程序;若查不到则返回。第第3章章 指令系统及汇编指令系统及汇编入口:(A)=由其它程序将命令字符送入A中。出口:查到命令字符则转处理程序,反之,若为结束标志则返回。程序清单如下:STA3:MOVDPTR,TABL;置表首地址MOVB,A;输入命令符暂存LOOP:CLRAMOVCA,A+DPTR;取存储命令符xiJZLEND;查到结束标志返回INCDPTR;

119、表格地址指向yi高位第第3章章 指令系统及汇编指令系统及汇编CJNEA,B,LNF;输入与存储命令符不等转移CLRAMOVCA,A+DPTR;命令符相等时取转移地址MOVB,A;yi高位暂存于BINCDPTR;MOVCA,A+DPTR;yi低位送AMOVDPL,A;转移地址送DPTRMOVDPH,BCLRAJMPA+DPTR;转相应处理程序入口第第3章章 指令系统及汇编指令系统及汇编LNF:INCDPTR;准备查下一项INCDPTRSJMPLOOP;转LOOP查下一项LEND:RET;没查到返回TABL:DBA;ASCII码ADWXA;相应处理入口地址第第3章章 指令系统及汇编指令系统及汇编D

120、BDDWXDDBEDWXEDBLDWXLDBMDWXMDBXDWXXDBZDWXZDB0;表格结束标志第第3章章 指令系统及汇编指令系统及汇编3.6.4散转(多分支)程序设计散转程序是一种并行分支程序。它是根据某种输入或运算结果,分别转向各个处理程序。在MCS51单片机中,散转指令为JMPA+DPTR,它按照程序运行时决定的地址执行间接转移指令。1.使用地址偏移量表的散转程序如果所有的N个分支处理程序的总长度小于256个字节时,可以使用地址偏移量来实现N分支散转。它的优点是程序简单,转移表短。第第3章章 指令系统及汇编指令系统及汇编例9:按R2的内容转向4个分支处理程序。4个分支处理程序总长度

121、小于256个字节。解:入口:(R2)=入口条件(0,1,2,3)。出口:各分支处理程序入口。程序清单如下:N-JMP:MOVA,R2MOVDPTR,TABL;分支表首地址送DPTRMOVCA,A+DPTR;查表取转移目标地址偏移量JMPA+DPTR;转移到相应处理程序TABL:DBPRG0(rel);存放转移目标地址偏移量第第3章章 指令系统及汇编指令系统及汇编DBPRG1(rel)DBPRG2(rel)DBPRG3(rel)PRG0:;分支处理程序0PRG3:;分支处理程序3第第3章章 指令系统及汇编指令系统及汇编2.使用转移指令表的散转程序使用地址偏移量表的散转程序分支N不能太多,而且由于

122、DB伪指令只能定义8位字节,分支入口地址的分布也要受到较大的限制。若在TABL表中存放的不是入口地址偏移量,而存放的是一系列转移指令AJMP,则可实现128分支程序,各分支入口地址可在2KB范围内分布。第第3章章 指令系统及汇编指令系统及汇编例10:设计可多达128路分支出口的转移程序。解:入口:(R2)=转移目标地址的序号00H7FH。出口:转移到相应分支程序入口。程序清单如下:JMP-128:MOVDPTR,TABL;转移指令表首址送DPTRMOVA,R2RLA;(A)(R2)2JMPA+DPTRTABL:AJMPPRG00AJMPPRG01;AJMPPRG7F128个分支程序首址第第3章

123、章 指令系统及汇编指令系统及汇编PRG00:PRG7F:以上程序中由于AJMP是双字节指令,因此采用RL指令使(R2)乘以2,可保证移向正确的位置。值得注意的是:每个分支的入口地址(PRG00PRG7F)必须与其相应的AJMP指令在同一个2K存储区内。也就是说,分支入口地址的安排仍有一定的限制。如改用长转移LJMP指令,则分支入口可在64KB范围内任意安排,但程序要作相应的修改(请参阅其它参考书)。第第3章章 指令系统及汇编指令系统及汇编3.使用位检测指令的散转程序例11:根据P1口上的位状态(“1”有效)散转到不同的处理程序。解:若P1口D0D7位为1,则转相应处理子程序。如P1中第0位为1,则转PRG0。程序清单如下:BIT-JMP:JB90H,LP0;P1口D0为1,则转LP0子程序JB91H,LP1JB92H,LP2JB93H,LP3JB94H,LP4第第3章章 指令系统及汇编指令系统及汇编JB95H,LP5JB96H,LP6JB97H,LP7RETLP0:ACALLPRG0;调相应子程序RETLP1:ACALLPRG1RETLP7:ACALLPRG7RET

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号