第4讲 51单片机指令系统教材_第1页
第4讲 51单片机指令系统教材_第2页
第4讲 51单片机指令系统教材_第3页
第4讲 51单片机指令系统教材_第4页
第4讲 51单片机指令系统教材_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

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

文档简介

第四讲

51单片机指令系统3/20/202414.18051指令系统概述4.2寻址方式4.3指令说明4.4伪指令4.5实用程序设计3/20/202424.18051指令系统概述4.1.1指令、指令系统的概念指令:为使计算机内部执行一种操作,而提供给用户编程使用的一种命令。机器语言:计算机只能识别二进制代码,以二进制代码来描述指令功能的语言,称之为机器语言。汇编语言:由于机器语言不便被人们识别、记忆、理解和使用,因此给每条机器语言指令赋予助记符号来表示,这就形成了汇编语言。也就是说,汇编语言是便于人们识别、记忆、理解和使用的一种指令形式,它和机器语言指令一一对应。3/20/20243指令系统:计算机能够执行的全部操作所对应的指令集合,称为这种计算机的指令系统。指令的三种属性:功能、时间和空间。功能属性:是指每条指令都对应一个特定的操作功能;时间属性:是指一条指令执行所用的时间,一般用机器周期来表示;空间属性:是指一条指令在程序存储器中存储所占用的字节数。

指令的两种描述形式:机器语言形式和汇编语言形式。采用机器语言编写的程序称之为目标程序。采用汇编语言编写的程序称之为源程序。3/20/20244时间属性划分:单机器周期指令(64条)、双机器周期指令(45条)和只有乘、除法两条4个机器周期的指令。4.1.2

MCS-51单片机指令系统

MCS-51单片机指令系统具有功能强、指令短、执行快等特点,共有111条指令。功能上划分:数据传送、算术操作、逻辑操作、程序转移、位操作等五大类。空间属性划分:单字节指令(49条)、双字节指令(46条)和三字节指令(只有16条)。3/20/20245每条指令通常由操作码和操作数两部分组成。操作码:表示计算机执行该指令将进行何种操作,操作数:表示参加操作的数的本身或操作数所在的地址。4.1.3汇编指令行格式[标号:]操作码助记符[目的操作数][,源操作数][;注释]

MCS-51单片机的指令有无操作数、单操作数、双操作数三种情况。汇编语言指令有如下的格式:3/20/202464.1.4常用的缩写符号A——累加器。B——寄存器,用于MUL和DIV指令中。C——进位标志或进位位。@——间接寻址寄存器或基址寄存器的前缀,如@Ri,@DPTR。direct——8位内部RAM单元的地址。可以是一个内部数据区RAM单元(00H~7FH)地址

特殊功能寄存器地址(I/O端口、控制寄存器、状态寄存器80H~0FFH)。#data——8位立即数,指令中的8位常数。#data16——16位立即数,指令中的16位常数。3/20/20247X——

表示寄存器名。(X)——表示X单元中的内容。((X))——表示以X单元的内容为地址的存储器单元内容,即(X)作地址,该地址单元的内容用((X))表示。/——位操作数的前缀,表示对该位取反。rel

——8位带符号的偏移量字节,用于SJMP和所有条件转移指令中。偏移量相对于下一条指令的第一个字节计算,在-128~+127范围内取值。→——表示操作流程,将箭尾一方的内容送入箭头所指另一方的单元中去。$——指本条指令起始地址。3/20/202484.2寻址方式所谓寻址方式,就是指令给出参与运算的操作数的有效地址的方式。在MCS-51单片机指令系统中,有以下7种寻址方式:

(1)立即寻址;

(2)直接寻址;

(3)寄存器寻址;

(4)寄存器间接寻址;

(5)基址寄存器加变址寄存器间接寻址;

(6)相对寻址;

(7)位寻址;3/20/20249寄存器寻址按所选定的工作寄存器R0~R7进行操作,指令机器码的低3位的八种组合000,001,…,110,111分别指明所用的工作寄存器R0,R1,…,R6,R7。

如:MOVA,Rn(n=0~7),这8条指令对应的机器码分别为E8H~EFH。4.2.1寄存器寻址

在指令选定的某寄存器的内容作为操作数,以完成指令规定的操作,称为寄存器寻址。例如:MOV

A,R0指令中源操作数R0和目的操作数A都是寄存器寻址。该指令的功能是把工作寄存器R0中的内容传送到累加器A中,如R0中的内容为30H,则执行该指令后A的内容也为30H。3/20/202410

累加器A,寄存器B、数据指针DPTR和布尔处理器的位累加器Cy也可用寄存器寻址方式访问。例如:MOVA,40H指令中的源操作数40H就是直接寻址,40H为操作数的地址。该指令的功能是把片内RAM地址为40H单元的内容送到A中。该指令的机器码为E5H40H,8位直接地址在指令操作码中占一个字节。4.2.2直接寻址

指令中直接给出操作数所在的存储器地址,以供取数或存数的寻址方式称为直接寻址。3/20/202411位地址空间。在MCS-51单片机指令系统中,直接寻址方式中可以访问3种存储器空间:内部数据存储器的低128个字节单元(00H~7FH)。特殊功能寄存器。特殊功能寄存器只能用直接寻址方式进行访问。3/20/2024124.2.3寄存器间接寻址由指令指出某一寄存器的内容作为操作数地址的寻址方法,称为寄存器间接寻址。注意:寄存器中的内容不是操作数本身,而是操作数的地址,到该地址单元中才能得到操作数。寄存器起地址指针的作用。寻址内部RAM区的数据时,可使用寄存器R0、R1(、SP)作为地址指针。当访问外部RAM时,可使用R0、R1及DPTR作为地址指针。寄存器间接寻址符号为“@”3/20/202413例如:MOVA,@R1指令的源操作数@R1是寄存器间接寻址。该指令的功能是将以工作寄存器R1中的内容为地址的片内RAM单元的数据传送到A中去。例如:若R1中的内容为80H,片内RAM地址为80H的单元中的内容为2FH,则执行该指令后,片内RAM80H单元的内容2FH被送到A中。寄存器间接寻址示意图如图3.1所示。3/20/2024144.2.4立即寻址立即寻址方式是指操作数包含在指令字节中。跟在指令操作码后面的数就是参加运算的数,该操作数称为立即数。

汇编指令中,在一个数的前面冠以"#"符号作前缀,就表示该数为立即寻址。例如:MOV

A,#30H指令中30H就是立即数。这一条指令的功能是执行将立即数30H传送到累加器A中的操作。3/20/2024154.2.5

基址寄存器加变址寄存器间接寻址

基址寄存器DPTR或PC的内容为基本地址,加上变址寄存器A的内容作为操作数的地址。MOVCA,@A+DPTRMOVCA,@A+PC3/20/2024164.2.6相对寻址

例如:SJMPrel

执行该指令时,先将PC+2,再把指令中带符号的偏移量加到PC上,得到跳转的目标地址送入PC。相对寻址是以当前程序计数器PC值加上指令中给出的偏移量rel,而构成实际操作数地址的寻址方法。指令中给出的偏移量是一个8位带符号的常数,可正可负,其范围为-128~+127。常出现在相对转移指令中。3/20/2024174.2.7位寻址位寻址是在位操作指令中直接给出位操作数的地址,可以对片内RAM中的128位和特殊功能寄存器SFR中的93位进行寻址。例如:MOVC,bit3/20/2024184.3指令说明1、数据传送指令2、程序转移指令3、算术运算指令4、逻辑运算指令5、位运算指令3/20/2024194.3.1数据传送指令1、内部数据传送指令(1)以累加器A为目的操作数的指令MOVA,Rnn=0~7MOVA,directMOVA,@Rii=0,1MOVA,#data这组指令的功能是:把源操作数的内容送入累加器A。3/20/202420(2)以Rn为目的操作数的指令MOVRn,AMOVRn,directMOVRn,#data这组指令的功能是:把源操作数的内容送入当前工作寄存器区的R0~R7中的某一个寄存器。3/20/202421(3)以直接寻址的单元为目的操作数的指令

MOVdirect,AMOVdirect,Rn

MOVdirect,directMOVdirect,@Ri

MOVdirect,#data这组指令的功能是:把源操作数的内容送入内部RAM单元或特殊功能寄存器(直接地址指出的存储单元)。3/20/202422(4)以寄存器间接寻址的单元为目的操作数指令MOV@Ri,AMOV@Ri,directMOV@Ri,#data这组指令的功能是:把源操作数的内容送入R0,R1所指出的内部RAM单元。(5)16位数据传送指令MOVDPTR,#data16这组指令的功能是:将16位的立即数送入数据指针寄存器DPTR。3/20/202423MOVR0,#30H;(R0)←30HMOVA,@R0 ;(A)←((R0))MOVR1,A ;(R1)←(A)MOVB,@R1 ;(B)←((R1))MOV@R1,P1 ;((R1))←(P1)MOVP2,P1 ;(P2)←(P1)MOV10H,#20H ;(10H)←20H执行上述指令后的结果为:

(R0)=30H,(R1)=(A)=40H,

(B)=10H,(40H)=(P1)=(P2)=CAH,

(10H)=20H。例1

设内部RAM(30H)=40H,(40H)=10H,(10H)=00H(P1)=CAH,分析以下程序执行后各单元及寄存器、

P2口的内容。3/20/2024242、查表指令访问程序存储器的数据传送指令又称作查表指令,采用基址寄存器加变址寄存器间接寻址方式,把程序存储器中存放的表格数据读出,传送到累加器A。MOVCA,@A+PC以PC作为基址寄存器,A的内容作为无符号数和PC的内容(下一条指令的起始地址)相加后得到一个16位的地址,并将该地址指出的程序存储器单元的内容送到累加器A。3/20/202425MOVCA,@A+DPTR这条指令的执行结果只与指针DPTR及累加器A的内容有关,与该指令存放的地址无关。因此,表格的大小和位置可以在64KB程序存储器中任意安排,并且一个表格可以为各个程序块所共用。指令是以DPTR作为基址寄存器,累加器A的内容作为无符号数与DPTR内容相加,得到一个16位的地址,并把该地址指出的程序存储器单元的内容送到累加器A。3/20/202426如果用以DPTR为基址寄存器的查表指令,其程序如下:MOVDPTR,2000H ;置表首地址MOVA,09HMOVCA,@A+DPTR例:从片外程序存储器2000H单元开始存放0~9的平方值,以PC作为基址寄存器进行查表得9的平方值。3/20/202427

完成上述功能的程序如下:MOVA,#03H ;(A)←03HPUSHDPH ;保护DPTR高8位入栈PUSHDPL ;保护DPTR低8位入栈MOVDPTR,#2000H;(DPTR)←2000HMOVCA,@A+DPTR ;(A)←(2000H+03H)POPDPL ;弹出DPTR低8位POPDPH ;弹出DPTR高8位执行结果:(A)=09H,(DPTR)=3A00H。例若在外部程序存储器中2000H单元开始依次存放0~9的平方值,数据指针(DPTR)=3A00H,用查表指令取得2003H单元的数据后,要求保持DPTR中的内容不变。3/20/2024283、累加器A与外部数据存储器传送指令

MOVXA,@DPTRMOVXA,@Ri

MOVX@DPTR,AMOVX@Ri,ADPTR所包含的16位地址信息由P0(低8位)和P2(高8位)输出,而数据信息由P0口传送,P0口作分时复用的总线。由Ri作为间接寻址寄存器时,P0口上分时输出Ri指定的8位地址信息及传输8位数据。

这组指令是:在累加器A与外部数据存储器RAM单元或I/O口之间进行数据传送。前两条指令执行时,P3.7

引脚上输出RD有效信号,用作外部数据存储器的读选通信号;后两条指令执行时,P3.6

引脚上输出WR有效信号,用作外部数据存储器的写选通信号。3/20/202429例:设外部RAM(0203H)=FFH,分析以下指令执行后的结果。

MOVDPTR,#0203H

;(DPTR)←0203HMOVXA,@DPTR

;(A)←((DPTR))MOV30H,A

;(30H)←(A)

MOVA,#0FH

;(A)←0FHMOVX@DPTR,A

;((DPTR))←(A)执行结果为:(DPTR)=0203H,(30H)=FFH,(0203H)=(A)=0FH。3/20/2024304、字节交换指令XCHA,RnXCHA,@RiXCHA,direct将累加器A的内容和源操作数内容相互交换。3/20/2024315、堆栈操作指令在MCS-51单片机的内部RAM中,可以设定一个先进后出的区域,称其为堆栈。在特殊功能寄存器中有一个堆栈指针SP,它指出栈顶的位置。PUSHdirect;进栈指令POPdirect;出栈指令进栈指令的功能是:首先将堆栈指针SP的内容加1,然后将直接地址所指出的内容送入SP指出的内部RAM单元;

出栈指令的功能是:将SP所指出的内部RAM单元的内容送入由直接地址所指出的字节单元,接着将堆栈指针SP的内容减1。3/20/202432例如:

进入中断服务子程序时,把程序状态寄存器PSW、累加器A、数据指针DPTR进栈保护。设当前SP为60H。

PUSHPSWPUSHACCPUSHDPLPUSHDPH执行后,SP内容修改为64H,而61H、62H、63H、64H单元中依次栈入PSW、A、DPL、DPH的内容。当中断服务程序结束之前,如下程序段(SP保持64H不变)

POPDPHPOPDPLPOPACCPOPPSW执行之后,SP内容修改为60H,而64H、63H、62H、61H单元中的内容依次弹出到DPH、DPL、A、PSW中。3/20/2024334.3.2程序转移指令1、无条件转移指令这是2KB范围内的无条件跳转指令,执行该指令时,先将PC+2,然后将addr11送入PC10~PC0,而PC15~PC11保持不变。这样得到跳转的目的地址。需要注意的是,目标地址与AJMP后面一条指令的第一个字节必须在同一个2KB区域的存储器区内。短跳转指令

AJMPaddr113/20/202434

执行该指令时,将16位目标地址addr16

装入PC,程序无条件转向指定的目标地址。转移的目标地址可以在64KB程序存储器地址空间的任何地方,不影响任何标志。长跳转指令LJMPaddr16相对转移指令

SJMPrel执行该指令时,先将PC+2,再把指令中带符号的偏移量加到PC上,得到跳转的目标地址送入PC。3/20/202435执行该指令时,把累加器A中的8位无符号数与数据指针中的16位数相加,结果作为下条指令的地址送入PC,不改变累加器A和数据指针DPTR的内容,也不影响标志。利用这条指令能实现程序的散转。散转指令JMP@A+DPTR3/20/202436例:

根据累加器A的值,转不同处理程序的入口。

MOVDPTR,#TABLE ;表首地址送DPTRJMP@A+DPTR ;根据A值转移

TABLE:AJMPTAB1 ;当(A)=0时转TAB1执行

AJMPTAB2;当(A)=2时转TAB2执行

AJMPTAB3 ;当(A)=4时转TAB3执行3/20/202437无条件转移指令3/20/2024382、条件转移指令

条件转移指令是当某种条件满足时,程序转移执行;条件不满足时,程序仍按原来顺序执行。转移的条件可以是上一条指令或更前一条指令的执行结果(常体现在标志位上),也可以是条件转移指令本身包含的某种运算结果。

由于该类指令采用相对寻址,因此程序可在以当前PC值为中心的-128~+127范围内转移。3/20/202439JZrel;(A)=0转移JNZrel;(A)≠0转移JCrel;若(Cy)=1,则转移PC←(PC)+2+relJNCrel;若(Cy)=0,则转移PC←(PC)+2+relJBbit,rel;若(bit)=1,则转移PC←(PC)+3+relJNBbit,rel;若(bit)=0,则转移PC←(PC)+3+relJBCbit,rel;若(bit)=1,则转移PC←(PC)+3+rel,并bit←03/20/202440

例:将片外RAM首地址为DATA1的一个数据块转送到片内RAM首地址为DATA2的存储区中。外部RAM向内部RAM的数据转送一定要经过累加器A,利用判零条件转移正好可以判别是否要继续传送或者终止。完成数据传送的参考程序如下:

MOVR0,#DATA1;R0作为外部数据块的地址指针

MOVR1,#DATA1;R1作为内部数据块的地址指针LOOP:MOVXA,@R0;取外部RAM数据送入AHERE:JZHERE ;数据为零则终止传送

MOV@R1,A ;数据传送至内部RAM单元

INCR0 ;修改指针,指向下一数据地址

INCR1 SJMPLOOP ;循环取数3/20/202441

比较转移指令共有4条。这组指令是先对两个规定的操作数进行比较,根据比较的结果来决定是否转移。若两个操作数相等,则不转移,程序顺序执行;若两个操作数不等,则转移。3、比较不相等转移指令

CJNE比较是进行一次减法运算,但其差值不保存,两个数的原值不受影响,而标志位要受到影响。如果第一个操作数小于第二个操作数,则置位进位标志CY,否则,清“0”CY.

利用标志位CY作进一步的判断,可实现三分支转移。3/20/202442CJNEA,direct,rel

CJNEA,#data,rel

CJNERn,#data,rel

CJNE@Ri,#data,rel

例:

当从P1口输入数据为01H时,程序继续执行,否则等待,直到P1口出现01H。参考程序如下:

MOVA,#01H ;立即数01H送AWAIT:CJNEA,P1,WAIT ;(P1)≠01H,则等待3/20/202443

减1条件转移指令有两条。每执行一次这种指令,就把第一操作数减1,并把结果仍保存在第一操作数中,然后判断是否为零。若不为零,则转移到指定的地址单元,否则顺序执行。4、减1不为0转移指令DJNZ这组指令对于构成循环程序是十分有用的,可以指定任何一个工作寄存器或者内部RAM单元作为循环计数器。每循环一次,这种指令被执行一次,计数器就减1。预定的循环次数不到,计数器不会为0,转移执行循环操作;到达预定的循环次数,计数器就被减为0,顺序执行下一条指令,也就结束了循环。3/20/202444DJNZRn,rel

DJNZdirect,rel

例:

将内部RAM从DATA单元开始的10个无符号数相加,相加结果送SUM单元保存。设相加结果不超过8位二进制数,则相应的程序如下:

MOVR0,#0AH;设置循环次数

MOVR1,#DATA;R1作地址指针,指向数据块首地址

CLRA ;A清零LOOP:ADDA,@R1;加一个数

INCR1 ;修改指针,指向下一个数

DJNZR0,LOOP;R0减1,不为0循环

MOVSUM,A;存10个数相加的和3/20/2024453/20/202446

在程序设计中,通常把具有一定功能的公用程序段编制成子程序,当主程序需要使用子程序时用调用指令,而在子程序的最后安排一条子程序返回指令,以便执行完子程序后能返回主程序继续执行。5、调用及返回指令3/20/202447所用的子程序的入口地址必须与ACALL下面一条指令的第一个字节在同一个2KB区域的存储器区内。短调用指令ACALLaddr11

3/20/202448

LCALLaddr16

长调用指令3/20/202449子程序返回指令

RET中断返回指令RETI3/20/202450空操作指令是一条单字节单周期指令。它控制CPU不做任何操作,仅仅是消耗这条指令执行所需要的一个机器周期的时间,不影响任何标志位,故称为空操作指令。NOP指令在设计延时程序、拼凑精确延时时间及在程序等待或修改程序等场合是很有用的。7、空操作指令NOP;(PC)←(PC)+13/20/2024514.3.3算术运算指令

加、减法指令加减法指令形式结构图(a)加减法指令关系图;(b)加1、减1指令关系图

3/20/2024521、加法指令不带进位的加法指令

ADDA,Rn

ADDA,directADDA,@Ri

ADDA,#data对标志位的影响:如果位7有进位,则置“1”进位CY;否则清“0”CY.如果位3有进位,则置“1”进位AC;否则清“0”AC.如果位6有进位输出而位7没有,或者位7有进位输出而位6没有,则置位溢出标志OV,否则清“0”OV.3/20/202453带进位的加法指令ADDCA,Rn

ADDCA,directADDCA,@Ri

ADDCA,#data这组指令的功能与普通加法指令类似,唯一的不同之处是,在执行加法时,还要将上一次进位标志Cy的内容也一起加进去。对于标志位的影响也与普通加法指令相同。3/20/202454最后一条指令是对16位的数据指针寄存器DPTR执行加1操作,指令执行时,先对低8位指针DPL的内容加1,当产生溢出时就对高8位指针DPH加1,但不影响任何标志。增量指令INCAINCRn

INCdirectINC@Ri

INCDPTR这组指令的功能是:将指令中所指出操作数的内容加1。若原来的内容为0FFH,则加1后将产生溢出,使操作数的内容变成00H,但不影响任何标志。3/20/2024552、减法指令

这组指令的功能是:将累加器A的内容与第二操作数及进位标志相减,结果送回到累加器A中。若要进行不带借位的减法操作,则必须先将Cy清“0”。带进位减法指令

SUBBA,Rn

SUBBA,directSUBBA,@Ri

SUBBA,#data3/20/202456如位6有借位而位7没有借位,或位7有借位而位6没有借位,则溢出标志OV置“1”,否则清“0”。对标志位的影响:如果位7(D7)有借位,则进位标志Cy置“1”,否则清“0”;如果位3(D3)有借位,则辅助进位标志AC置“1”,否则清“0”;3/20/202457这组指令的功能是:将指出的操作数内容减1。如果原来的操作数为00H,则减1后将产生下溢出,使操作数变成0FFH,但不影响任何标志。(除A减1影响P)减1指令

DECADECRn

DECdirectDEC@Ri

3/20/2024583、乘法指令这条指令的功能是:将累加器A的内容与寄存器B的内容相乘,乘积的低8位存放在累加器A中,高8位存放于寄存器B中。如果乘积超过0FFH,则溢出标志OV置“1”,

否则清“0”。进位标志Cy总是被清“0”。

MULAB3/20/2024594、除法指令将累加器A中的内容除以寄存器B中的8位无符号整数,所得商的整数部分存放在累加器A中,余数部分存放在寄存器B中,清“0”进位标志Cy和溢出标志OV。DIVAB这条指令的功能是:若原来B中的内容为0,则执行该指令后A与B中的内容不定,并将溢出标志OV置“1”。在任何情况下,进位标志Cy总是被清“0”。

3/20/2024603/20/202461这组指令的功能是:将两个操作数的内容按位进行逻辑与操作,并将结果送回目的操作数的单元中。(1)逻辑与指令

ANLA,Rn

ANLA,directANLA,@Ri

ANLA,#dataANLdirect,AANLdirect,#data4.3.4逻辑运算操作3/20/202462这组指令的功能是:将两个操作数的内容按位进行逻辑或操作,并将结果送回目的操作数的单元中。(2)逻辑或指令

ORLA,Rn

ORLA,directORLA,@Ri

ORLA,#dataORLdirect,AORLdirect,#data3/20/202463这组指令的功能是:将两个操作数的内容按位进行逻辑异或操作,并将结果送回到目的操作数的单元中。(3)逻辑异或指令

XRLA,Rn

XRLA,directXRLA,@Ri

XRLA,#dataXRLdirect,AXRLdirect,#data3/20/202464(4)移位操作RLA;累加器A的内容向左环移1位RLCA;累加器A的内容带进位标志位向左环移1位RRA;累加器A的内容向右环移1位RRCA;累加器A的内容带进位标志位向右环移1位这组指令的功能是:对累加器A的内容进行简单的逻辑操作。除了带进位标志位的移位指令外,其它都不影响Cy,AC,OV等标志。3/20/202465

CLRA;对累加器A清“0”CPLA;对累加器A按位取反3/20/202466

位操作也称布尔变量操作,它是以位(bit)作为单位来进行运算和操作的。MCS-51单片机内部有一个功能相对独立的布尔处理机,它有借用进位标志CY作为位累加器,有位存储器(即位寻址区中的各位),指令系统中有17条专门进行位处理的指令集。位处理指令可以完成以位为对象的数据转送、运算、控制转移等操作。4.3.5位操作指令3/20/202467

(1)直接地址方式:如0A8H;(2)点操作符方式:如IE.0;(3)位名称方式:如EX0;(4)用户定义名方式:如用伪指令BIT定义:

WBZD0BITEX0

经定义后,允许指令中使用WBZD0代替EX0。

指令中位地址的表达形式有以下几种:3/20/202468(1)位变量传送指令这组指令的功能是:把源操作数指出的布尔变量送到目的操作数指定的位地址单元中。

其中一个操作数必须为进位标志Cy,另一个操作数可以是任何可直接寻址位。MOVC,bitMOVbit,C3/20/202469(2)位变量修改指令CLRCCLRbitCPLCCPLbitSETBCSETBbit这组指令对操作数所指出的位进行清“0”,取反,置“1”的操作,不影响其它标志。3/20/202470(3)位变量逻辑操作指令这组指令的功能是:如果源位的布尔值是逻辑0,则将进位标志清“0”;否则,进位标志保持不变,不影响其它标志。位变量逻辑与指令ANLC,bitANLC,/bitbit前的斜杠表示对(bit)取反,直接寻址位取反后用作源操作数,但不改变直接寻址位原来的值。例如指令:ANLC,/ACC.0执行前ACC.0为0,C为1,则指令执行后C为1,而ACC.0仍为0。3/20/202471位变量逻辑或指令这组指令的功能是:如果源位的布尔值是逻辑1,则将进位标志置“1”;否则,进位标志保持不变,不影响其它标志。ORLC,bitORLC,/bit3/20/202472例:

利用位操作指令,模拟图所示硬件逻辑电路的功能。3/20/202473

MOVC,P1.1 ;(CY)←(P1.1) ORLC,P1.2 ;(CY)←(P1.1)∨(P1.2)=A ANLC,P1.0;(CY)←(P1.0)∧A CPLC ;(CY)←(P1.0)∧A=B MOVF0,C ;F0内暂存B MOVC,P1.3 ;(CY)←(P1.3) ANLC,/P1.4 ;(CY)←(P1.3)∧(P1.4)=D ORLC,F0 ;(CY)←B∨D MOVP1.5,C ;运算结果送入P1.53/20/2024743/20/2024754.3.6十进制指令(1)半字节交换指令

XCHDA,@RiSWAPA将累加器A的低4位内容和(Ri)所指出的内部RAM单元的低4位内容相互交换。将累加器A的高4位与低4位之间进行交换。3/20/202476

这条指令对累加器A参与的BCD码加法运算所获得的8位结果进行十进制调整,使累加器A中的内容调整为二位压缩型BCD码的数。使用时必须注意,它只能跟在加法指令之后,不能对减法指令的结果进行调整,且其结果不影响溢出标志位。(2)十进制调整指令

DAA执行过程:判断A中的低4位是否大于9和辅助进位标志AC是否为“1”,若两者有一个条件满足,则低4位加6操作;同样,A中的高4位大于9或进位标志Cy为“1”两者有一个条件满足时,高4位加6操作。3/20/2024774.4伪指令伪指令不要求计算机做任何操作,也没有对应的机器码,不产生目标程序,不影响程序的执行,仅仅是能够帮助进行汇编的一些指令。伪指令主要作用:指定程序或数据的起始位置;给出一些连续存放数据的地址;为中间运算结果保留一部分存储空间;表示源程序结束等等。不同版本的汇编语言,伪指令的符号和含义可能有所不同,但基本用法是相似的。3/20/202478功能:规定其后面的目标程序或数据块的起始地址。它放在一段源程序(主程序、子程序)或数据块的前面,说明紧跟在其后的程序段或数据块的起始地址就是ORG后面给出的地址。

1、定位伪指令ORG格式:[标号:]ORG地址(十六进制表示)例如:

ORG2000H START:MOVA,#7FH3/20/202479格式:[标号:]END

2、汇编结束伪指令END作用:END是汇编语言源程序的结束标志,表示汇编结束。在END以后所写的指令,汇编程序都不予处理。一个源程序只能有一个END命令,否则就有一部分指令不能被汇编。3/20/202480

用EQU伪指令对某符号赋值后,该符号的值在整个程序中不能再改变。3、赋值伪指令EQU功能:将表达式的值或寄存器名赋予EQU前面的符号名。格式:符号名EQU表达式或符号名EQU寄存器名例如:

TAB1EQU1000HTAB2EQU2000H

汇编后TAB1、TAB2分别具有值1000H、2000H。3/20/2024814、位地址赋值伪指令BIT格式:

符号名BIT位地址功能:将位地址赋予BIT前面的符号名,经赋值后可用该符号名代替BIT后面的位地址。例如:PLGBITF0AIBITP1.0

经以上伪指令定义后,在程序中就可以把PLG和AI作为位地址来使用。3/20/202482例如:

ORG2000HTAB1:DB30H,8AH,7FH,73DB'5','A','BCD'5、定义字节伪指令DB格式:[标号:]DB项或项表其中项或项表指一个字节数据,用逗号分开的字节数据串,或以引号括起来的字符串。功能:把项或项表的数据(字符串按字符顺序以ASCII码)存入从标号地址开始的连续存储单元中。3/20/202483

由于ORG2000H,所以TAB1的地址为2000H,因此,以上伪指令经汇编后,将对2000H开始的连续存储单元赋值:(2000H)=30H(2001H)=8AH(2002H)=7FH(2003H)=49H;十进制数73以十六进制数存放(2004H)=35H;35H是数字5的ASCII码(2005H)=41H;41H是字母A的ASCII码(2006H)=42H;42H是字符串'BCD'中B的ASCII码(2007H)=43H;43H是字符串'BCD'中C的ASCII码(2008H)=44H;44H是字符串'BCD'中D的ASCII码3/20/202484例如:

ORG1500HTAB2:DW1234H,80H

汇编以后:(1500H)=12H,

(1501H)=34H,

(1502H)=00H,

(1503H)=80H6、定义字伪指令DW格式:[标号:]DW项或项表DW伪指令与DB相似,但用于定义字的内容。项或项表指所定义的一个字(两个字节)或用逗号分开的字串。汇编时,机器自动按高8位先存入,低8位在后的格式排列。3/20/2024857、数据赋值伪指令DATA用于给一个8位的内部RAM单元起一个名字。同一个单元可以有多个名字。格式:名字DATA直接字节地址8、数据赋值伪指令XDATA用于给一个8位的外部RAM单元起一个名字。同一个单元可以有多个名字。格式:名字XDATA直接字节地址3/20/2024864.5实用程序设计4.5.1程序结构的三种形式

1.三种形式顺序结构、分支结构、循环结构2.汇编语言程序设计步骤:

◆分析问题

◆确定算法

◆设计程序流程图

◆分配内存单元

◆编写汇编语言源程序

◆调试程序3/20/202487【例】将30H单元内的两位BCD码拆开并转换成ASCII码,存入RAM两个单元中。ORG 0030HMOV A,30H;取值ANL A,#0FH;取低4位ADD A,#30H;转换成ASCII码MOV 32H,A ;保存结果MOV A,30H;取值SWAP A ;高4位与低4位互换ANL A,#0FH;取低4位(原来的高4位)ADD A,#30H;转换成ASCII码MOV 31H,A ;保存结果SJMP $END结束取数据低4位转换成ASCII码存ASCII码取数据高4位转换成ASCII码存ASCII码开始4.5.2顺序结构程序设计3/20/2024881.分支程序有三种基本形式,即单分支、双分支、多分支。

2.分支程序的设计要点如下:(1)先建立可供条件转移指令测试的条件。(2)选用合适的条件转移指令。(3)在转移的目的地址处设定标号。条件满足?AYN(a)条件满足?ABNY(b)(c)A0A1AnK=0K=1…K=nK=?……4.5.3分支程序设计单分支双分支多分支3/20/2024893.

分支程序设计举例【例】设X存在30H单元中,根据下式

X+2 X>0Y= 100 X=0。

∣X∣ X<0A为负数?取数,A←(30H)开始结束A=0?YNNA←|X|A←64HA←X+2存数(31H)←A(30H)求出Y值,将Y值存入31H单元。3/20/202490分析:根据数据的符号位判别该数的正负,若最高位为0,再判别该数是否为0。参考程序如下:

ORG 0030HMOV A,30H ;取数

JB ACC.7,NEG

;负数,转NEG

JZ ZER0

;为零,转ZER0ADD A,#02H ;为正数,求X+2AJMPSAV ;转到SAVE,保存数据ZER0:MOV A,#64H ;数据为零,Y=100AJMPSAV ;转到SAVE,保存数据

NEG:DECA ;

CPL A ;求∣X∣SAV:MOV31H,A ;保存数据

SJMP $ ;暂停

END3/20/202491

4.5.4多分支程序设计-散转程序

散转程序是分支程序的一种,它可根据运算结果或输入数据将程序转入不同的分支。

MCS-51指令系统中有一条跳转指令JMP@A+DPTR,用它可以很容易地实现散转功能。该指令把累加器的8位无符号数与16位数据指针的内容相加,并把相加的结果装入程序计数器PC,控制程序转向目标地址去执行。例根据工作寄存器R0内容的不同,使程序转入相应的分支。(R0)=0对应的分支程序标号为ONE;(R0)=1对应的分支程序标号为TWO;

(R0)=N对应的分支程序标号为PRN。3/20/202492程序如下:LP0:MOVDPTR,#TABLE;取表头地址

MOVA,R0ADDA,R0;R0内容乘以2JNCLP1;无进位转移

INCDPH;加进位位LP1:JMP@A+DPTR;跳至散转表中相应位置

TABLE:AJMPONEAJMPTWOAJMPTHREEAJMPFOURAJMPPRN3/20/2024931.循环程序的结构循环程序一般由四个主要部分组成:

初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。

处理部分:

为反复执行的程序段,是循环程序的实体,也是循环程序的主体。

循环控制部分:

这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。结束部分:

这部分主要是对循环程序的结果进行分析、处理和存放。4.5.4循环程序3/20/202494(a)当型循环结构(b)直到型循环结构循环结束?循环体YN初始化修改循环参数结束部分开始结束循环结束?循环体Y初始化修改循环参数结束部分开始N结束循环结构程序流程图3/20/2024952.

循环程序设计举例例:不同存储区域之间的数据传输。将内部RAM30H单元开始的内容依次传送到外部RAM0100H单元开始的区域,直到遇到传送的内容是0为止。3/20/202496

(2)汇编语言源程序。

ORG 0000HMOV R0,#30H;

MOV DPTR,#0100H;

TRANS:MOVA,@R0

;A←(R0)

MOVX@DPTR,A

;(DPTR)←A

CJNEA,#00H,NEXT

SJMPFINISH

;A=0,传送完成

NEXT:

INC R0

;修改地址指针

INC DPTR

AJMP TRANS

;继续传送

FINISH:

SJMP $ END3/20/2024973.多重循环结构程序某些复杂问题或者循环数超过256,则需采用多重循环的程序结构,即循环程序中包含循环程序或一个大循环中包含多个小循环程序,称多重循环程序结构,又称循环嵌套。循环的重数不限,但必须每循环的层次分明,不能有相互交叉!外循环中循环内循环外循环内循环外循环内循环内循环(a)嵌套正确(b)嵌套正确(c)交叉不正确多重循环示意图3/20/202498范例:延时程序设计(晶振12MHz)DEL:MOVR7,#200DEL1:

MOVR6,#125DEL2:

DJNZR6,DEL2;125×2=250

DJNZR7,DEL1;250×200=50msRET精确的计算:(250+1+2)×200+1=50.301msMOVRn#data是单机器周期指令DJNZRn,rel

是双机器周期指令3/20/2024994.5.6子程序设计子程序作为一个具有独立功能的程序段,编程时需遵循以下原则:1.子程序的编程原则(1)子程序的第一条指令必须有标号,明确子程序入口地址。(2)以返回指令RET结束子程序。(3)简明扼要的子程序说明部分。(4)较强的通用性和可浮动性,尽可能避免使用具体的内存单元和绝对转移地址等。

(5)注意保护现场和恢复现场。3/20/2024100

;程序名:BCDBIN

;功能:BCD码转换为二进制数 ;入口参数:要转换的BCD码存在累加器A中 ;出口参数:转换后的二进制数存放在累加器A中 ;占用资源:寄存器BBCDBIN:

PUSHB

;保护现场

PUSHPSWPUSH ACC ;暂存A的内容

ANLA,#0F0H ;屏蔽掉低4位

SWAP A ;将A的高4位与低4位交换

MOV B,#10 MUL AB ;乘法指令,

MOV B,A;乘积不会超过256,

POP ACC;取原BCD数

ANL A,#0FH;屏蔽掉高4位

ADD A,B ;个位数与十位数相加

POP PS

温馨提示

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

评论

0/150

提交评论