单片机微机原理及应用基础教程第章汇编语言及其程序设计课件_第1页
单片机微机原理及应用基础教程第章汇编语言及其程序设计课件_第2页
单片机微机原理及应用基础教程第章汇编语言及其程序设计课件_第3页
单片机微机原理及应用基础教程第章汇编语言及其程序设计课件_第4页
单片机微机原理及应用基础教程第章汇编语言及其程序设计课件_第5页
已阅读5页,还剩281页未读 继续免费阅读

下载本文档

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

文档简介

第3章汇编语言及其程序设计3.1汇编语言及其指令格式3.2寻址方式3.3单片机汇编语言指令体系3.4汇编语言及程序设计3.5基本程序设计方法3.6程序设计举例第3章汇编语言及其程序设计3.1汇编语言及其指令格式3.1汇编语言及其指令格式

机器语言汇编语言

74H09H MOVA,#09H汇编 人工汇编 机器汇编机器语言汇编语言返回本章3.1.151单片机汇编语言概述3.1汇编语言及其指令格式 机器语言汇编语言机器语言汇编语指令与指令系统MCS-51的指令系统分为:(1)数据传送类(29条)(2)算术运算类(24条)(3)逻辑运算类(24条)(4)控制转移类(17条)(5)位操作类(17条)共111条指令指令与指令系统例如:MOVP1,#0FFH源操作数操作码目的操作数3.1.2汇编语言指令格式例如:MOVP1,#0FFH源操作数操作码目的操作数3.

在MCS-51指令中,一般指令主要由操作码、目的操作数、源操作数组成。(1)操作码指明执行什么性质和类型的操作。例如,数的传送、加法、减法等。(2)目的操作数指定操作结果存放的地址。(3)源操作数指明操作的对象或者是操作数所在的地址。在MCS-51指令中,一般指令主要由操作码、目的操作数、指令格式LOOP:MOVA,#10H

;(A)10H

标号注释[标号:]

操作码

[目的操作数][,源操作数]

[;注释]指令格式LOOP:MOVA,#10H;(A)3.1.3汇编语言指令表常用符号说明(1)Ri和Rn(2)#data(3)#data16(4)rel(5)addr16(6)addr11(7)direct(8)bit(9)@(10)(X)(11)((X))(12)3.1.3汇编语言指令表常用符号说明(1)Ri和Rn(73.2寻址方式

寻找操作数所在单元的地址称之为寻址。寻址方式的多少是计算机功能强弱的重要标志。

3.2寻址方式寻找操作数所在单元的地址称之为寻寻址方式分类3.2.1立即寻址 3.2.2直接寻址3.2.3寄存器寻址3.2.4寄存器间接寻址3.2.5变址寻址 3.2.6相对寻址 3.2.7位寻址返回本章寻址方式分类3.2.1立即寻址 返回本章3.2.1立即寻址

指令中直接给出操作数的寻址方式。例如:MOVP1,#0FFH MOVDPTR,#3400HMOV30H,#40H;上述三条指令执行完后,寄存器P1中数据为立即数据FFH,DPTR寄存器中数据为3400H,30H单元中数据为立即数40H。返回本节3.2.1立即寻址 指令中直接给出操作数的寻址方式A片内RAM30H34H3.2.2直接寻址

指令中直接给出操作数地址的寻址方式。例如:MOVA,30H ;(A)←(30H)

30H为直接给出的内部RAM的地址34H34H返回本节A片内RAM30H34H3.2.2直接寻址 指令中直

能进行直接寻址的存储空间有SFR寄存器和内部数据RAM。例如:

MOVPSW,#20H;(PSW)←20H

PSW为直接寻址寄存器的符号地址

MOVA,40H

;(A)←(40H)40H为直接给出的内部RAM的地址MOVD0H,#20H能进行直接寻址的存储空间有SFR寄存器和内部数据RAM。AR030H3.2.3寄存器寻址

以通用寄存器的内容为操作数的寻址方式。通用寄存器指A、B、DPTR、C以及R0~R7

。例如: MOVA,R030H30H返回本节AR030H3.2.3寄存器寻址 以通用寄存器的内容3.2.4寄存器间接寻址

看这个问题,要求从30H单元开始,取20个数,分别送入A累加器

MOVA,30HMOVA,31H…MOVR7,#20MOVR0,#30HLOOP:MOVA,@R0;(A)((R0))

INCR0

DJNZR7,LOOP3.2.4寄存器间接寻址看这个问题,要求从30H单MOVA,@R0执行示意图片内RAMR034HA30H34H30HMOVA,@R0执行示意图片内RAMR034HA3

寄存器间接寻址:以寄存器中内容为地址,以该地址中内容为操作数的寻址方式。间接寻址的存储器空间包括内部数据RAM和外部数据RAM。能用于寄存器间接寻址的寄存器有R0,R1,DPTR,SP。SP仅用于堆栈操作。返回本节寄存器间接寻址:以寄存器中内容为地址,以该地址中内容为操3.2.5变址寻址

变址寻址:本指令是要在ROM的一个地址单元中找出数据。单元地址:(DPTR)+(A)(PC)+(A)变址寻址只有读操作而无写操作,在指令符号上采用MOVC的形式,例如:

MOVCA,@A+DPTR;(A)←((A)+(DPTR))

MOVCA,@A+PC;(A)←((A)+(PC))

返回本节3.2.5变址寻址 变址寻址:本指令是要在ROM的3.2.6相对寻址

相对寻址用于修改PC值,主要用于实现程序的分支转移。以当前程序计数器PC的内容为基础,加上指令给出的偏移量rel,而构成实际操作数地址的寻址方式。当前PC值=源地址+转移指令字节数。偏移量rel为单字节有符号数,以补码形式表示,范围是-128~+1273.2.6相对寻址 相对寻址用于修改PC值,主要用相对寻址目的地址=当前PC值+rel

=源地址+转移指令字节数+rel相对寻址目的地址=当前PC值+rel200AH程序存储器SJMP08H2000H2001H2002H…2000HPC当前PC=2000H+2(2002H)200AHPC2001HPC2002HPCrel=08H例如SJMP08H;(PC)←(PC)+2+08H

返回本节200AH程序存储器SJMP08H2000H…2000HPC3.2.7位寻址

位寻址其实是一种直接寻址方式,不过其地址是位地址。位寻址只能对有位地址的单元作位寻址操作。例如:SETB10H;将位地址为10H的位置1

22H单元的D0位的位地址为10H,若22H单元中存放着数据40H执行上述指令后(22H)=41H。又如:MOV32H,C;(32H)←(CY)SETBPSW.3

返回本节3.2.7位寻址位寻址其实是一种直接寻址方式,不过3.3单片机汇编语言指令体系

3.3.1数据传送类指令3.3.2算术运算类指令3.3.3逻辑运算与移位类指令3.3.4控制转移类指令3.3.5位操作指令返回本章返回本章3.3单片机汇编语言指令体系 3.3.1数据传送类指3.3.1数据传送类指令

数据传送类指令共29条指令执行后,源操作数不变,目的操作数被源操作数取代。数据传送类指令用到的助记符有

MOV、MOVX、MOVCXCH、XCHD、SWAPPUSH、POP

数据传送类指令不影响标志位CY、AC、OV但可能影响奇偶标志P返回本节3.3.1数据传送类指令数据传送类指令共29条返回本直接地址direct累加器A直接地址direct间接地址@Ri寄存器Rn立即数#data寄存器DPTR图3-6MCS-51单片机片内数据传送图一、内部数据存储器间数据传送指令MOVA,directMOVA,#dataMOVA,RnMOVA,@RiMOVRn,AMOVRn,directMOVRn,#dataMOVdirect,AMOVdirect,@RiMOVdirect,#dataMOVdirect,RnMOVdirect2,direct1MOV@Ri,directMOV@Ri,#dataMOV@Ri,AMOVDPTR,#Data直接地址累加器直接地址间接地址寄存器立即数寄存器图3-61.以A为目的操作数MOVA,Rn;(A)←(Rn)MOVA,direct;(A)←(direct)MOVA,@Ri ;(A)←((Ri))MOVA,#data;(A)←#data返回一、内部数据存储器间数据传送指令1.以A为目的操作数返回一、内部数据存储器间数据传送指令2.以Rn为目的操作数MOVRn,A ;(Rn)←(A)MOVRn,direct;(Rn)←(direct)MOVRn,#data;(Rn)←#data返回一、内部数据存储器间数据传送指令2.以Rn为目的操作数返回一、内部数据存储器间数据传送指令3.以直接地址为目的操作数MOVdirect,A;(direct)←(A)MOVdirect,Rn;(direct)←(Rn)MOVdirect2,direct1;(direct2)←(direct1)MOVdirect,@Ri;(direct)←((Ri))MOVdirect,#data;(direct)←#data返回一、内部数据存储器间数据传送指令3.以直接地址为目的操作数返回一、内部数据存储器间数据传送指4.以间接地址为目的操作数MOV@Ri,A ;(Ri)←(A)MOV@Ri,direct;(Ri)←(direct)MOV@Ri,#data;(Ri)←#data例如:设(30H)=6FH,R1=40H,执行:MOV@R1,30H结果:(40H)=6FH。返回一、内部数据存储器间数据传送指令4.以间接地址为目的操作数返回一、内部数据存储器间数据传送指5.以DPTR为目的操作数MOVDPTR,#data16;(DPTR)←#data16例如:执行MOVDPTR,#2000H

结果:(DPTR)=2000H。返回一、内部数据存储器间数据传送指令5.以DPTR为目的操作数返回一、内部数据存储器间数据传送指例:(30H)=40H,(40H)=10H,(P1)=0CAH执行:

MOVR0,#30H MOVA,@R0 MOVR1,A MOV30H,@R1 MOV@R1,P1 MOVP2,P1问:(30H)=?(40H)=?(P1)=?(P2)=?(R1)=?(R2)=?(A)=?例:(30H)=40H,(40H)=10H,(P1)=0CA二、访问外部数据存储器的指令

访问外部存储器必须通过累加器A

采用间接寻址方式MOVXA,@DPTR ;(A)←((DPTR))MOVX@DPTR,A ;((DPTR))←(A)MOVXA,@Ri ;(A)←((P2Ri))MOVX@Ri,A ;((P2Ri))←(A)外部RAM二、访问外部数据存储器的指令访问外部存储器必须通过累加例:已知外部RAM(0203H)=0FFH,执行:

MOVDPTR,#0203H MOVXA,@DPTR MOV30H,A MOVA,#00H MOVX@DPTR,A问:(1)程序功能(2)(DPTR)=?(A)=?(30H)=?例:已知外部RAM(0203H)=0FFH,执行:

MOVP2,#02H MOVR0,#03H MOVXA,@R0 MOV30H,A MOVA,#00H MOVX@R0,A

程序2MOVP2,#02H程序2三、访问程序存储器的指令MOVCA,@A+DPTR;(A)←((A)+(DPTR))MOVCA,@A+PC ;(A)←((A)+(当前PC))例如:已知(A)=30H,(DPTR)=3000H,程序存储器单元(3030H)=50H,执行:MOVCA,@A+DPTR则:(A)=50H。三、访问程序存储器的指令MOVCA,@A+DPTR;(A例:在外部ROM/EPROM中从2000H单元开始依次存放0-9的平方值:0,1,4,…,81,要求依据累加器A的值(0-9)来查找对应的平方值。方法1MOVDPTR,#2000HMOVA,#09HMOVCA,@A+DPTR执行结果:(A)=81,(DPTR)=2000H…012000H2001H2002H…0212224外部ROM2009H8192…例:在外部ROM/EPROM中从2000H单元开始依次存放0…方法2MOVA,#09H ADDA,#0FH

MOVCA,@A+PC执行结果:(A)=81,(PC)=1FF1H74H09H24H0FH83H1FF0H012000H2001H2002H…0212224外部ROMPC偏移量=表首地址-(MOVC指令所在地址+1)2009H8192……偏移量=2000H-(1FF0H+1)=0FH(A)=18H1FF1H当前PC…方法274H09H24H0FH83H1FF0H012000四、数据交换类指令l

字节交换XCHA,Rn ;(A)(Rn)XCHA,direct;(A)(direct)XCHA,@Ri ;(A)((Ri))2

半字节交换XCHDA,@Ri;(A0~3)(Ri0~3)SWAPA ;(A0~3)(A4~7)四、数据交换类指令l

字节交换例:(R0)=20H,(A)=3FH,(20H)=75H(1)执行

XCHA,R0;(A)=?

XCHDA,@R0;(A)=?

SWAPA;(A)=?

(2)执行程序段

MOVA,20HXCHA,R0MOV20H,ASJMP $则(A)=?(R0)=?(20H)=?例:(R0)=20H,(A)=3FH,(20H)=75H五、堆栈操作类指令

PUSHdirect;(SP)←(SP)+1,((SP))←(direct)

POPdirect;(direct)←((SP)),

(SP)←(SP)-1五、堆栈操作类指令PUSHdirect;(SP)←(S片内RAM50H40H11H10H50H××SP30H执行PUSH指令指令PUSH40H

操作示意图××片内RAM40H11H10HSP××30H执行前50H片内RAM50H40H11H10H50H××SP30H执行P执行前指令POP30H

操作示意图片内RAM40H11H10H34H×SP30H××执行POP指令片内RAM30H11H10HSP40H34H34H××执行前指令POP30H操作示意图片内RAM4例:已知外部RAM(0203H)=0FFH,(DPTR)=1000H执行下面的程序,问(A)=?,(DPTR)=?。

PUSHDPH PUSHDPL

MOVDPTR,#0203H MOVXA,@DPTR MOV30H,A MOVA,#00H MOVX@DPTR,A

POPDPL POPDPH例:已知外部RAM(0203H)=0FFH,(DPTR【例】将片内RAM30H单元与40H单元中的内容互换。方法1(直接地址传送法):

MOV 31H,30HMOV 30H,40HMOV 40H,31HSJMP $片内RAM40H11H10H34H×30H××31H【例】将片内RAM30H单元与40H单元中的内容互换。方法方法2(间接地址传送法):

MOV R0,#40HMOV R1,#30HMOV A,@R0MOV B,@R1MOV @R1,AMOV @R0,BSJMP $方法2(间接地址传送法):方法3(字节交换传送法):

MOV A,30HXCH A,40HMOV 30H,ASJMP $方法3(字节交换传送法):方法4(堆栈传送法):

PUSH 30HPUSH 40HPOP 30HPOP 40HSJMP $返回本节方法4(堆栈传送法):返回本节3.3.2算术运算类指令 1.加法指令

ADDA,Rn ;(A)←(A)+(Rn)ADDA,direct ;(A)←(A)+(direct)

ADDA,@Ri ;(A)←(A)+((Ri))ADDA,#data ;(A)←(A)+#data3.3.2算术运算类指令 1.加法指令

这四条加法指令使累加器A可以和内部RAM的任何单元内容相加,也可和8位立即数相加。参与运算的是两个8位二进制数,可以看作带符号数,也可看作无符号数。加法指令影响标志位CY,OV,AC,P

对无符号数CY=1表示溢出,对有符号数OV=1表示溢出这四条加法指令使累加器A可以和内部RAM的任何单元内容相2.带进位加指令ADDCA,Rn ;(A)←(A)+(Rn)+(C)ADDCA,direct;(A)←(A)+(Rn)+(direct)+(C)ADDCA,@Ri ;(A)←(A)+((Ri))+(C)ADDCA,#data ;(A)←(A)+#data+(C)用于多字节的加法中ADDA,Rn ;(A)←(A)+(Rn)ADDA,direct ;(A)←(A)+(direct)ADDA,@Ri ;(A)←(A)+((Ri))ADDA,#data ;(A)←(A)+#data2.带进位加指令ADDA,Rn ;(A)←(A)+(3.带借位减指令SUBBA,Rn ;(A)←(A)-(Rn)-(C)SUBBA,direct;(A)←(A)-(direct)-(C)SUBBA,@Ri ;(A)←(A)-((Ri))-(C)SUBBA,#data ;(A)←(A)-#data-(C)

例如,设(A)=39H,(R0)=20H,(20H)=32H,(C)=1执行指令:SUBBA,@R0结果(A)=06H。3.带借位减指令4.乘法指令

MULAB ;(B)(A)←(A)×(B)A和B中各存放一个8位无符号数,指令执行后,16位乘积的高8位在B中,低8位存A中。若乘积大于FFH(255),则溢出标志OV=1乘法指令执行后CY=0乘法指令本身只能进行8位数的乘法运算。例如,(A)=30H(48),(B)=60H(96),执行:MULAB结果(BA)=1200H(4608)A=00H,B=12H。4.乘法指令

5.除法指令DIVAB;(A)÷(B)→商在A中,余数在B中A和B中各存放一个8位无符号数,A放被除数,B放除数。指令执行后,A中存放商,B中存入余数;CY=0,OV=0若B=00H,则指令执行后OV=1,A与B不变。

例如,A=30H,B=07H,执行:DIVAB结果:A=06H,B=06H。5.除法指令6.加1指令INCA ;(A)←(A)+1INCRn ;(Rn)←(Rn)+1INCdirect;(direct)←(direct)+1INC@Ri ;((Ri))←((Ri))+1INCDPTR;(DPTR)←(DPTR)+1例如:(30H)=22H,执行INC30H结果:(30H)=23H。6.加1指令7.减1指令DECA ;(A)←(A)-1DECRn ;(Rn)←(Rn)-1DECdirect;(direct)←(direct)-1DEC@Ri ;((Ri))←((Ri))-1例如:(R0)=30H,(30H)=22H,执行:DEC@R0结果:(30H)=21H。注意:加(减)1指令执行后不影响状态标志位7.减1指令8.十进制调整指令DAA

;把A中按二进制相加的结果调整成按BCD码相加的结果(1)十进制调整的必要性 二进制的加法运算不能完全正确适用于十进制的加法运算(2)出错原因及调整方法8.十进制调整指令8.十进制调整指令(3)十进制调整的方法累加器低4位大于9或辅助进位(AC)为1,则进行低4位加6修正:(A)(A)+06H累加器高4位大于9或进位标志位(CY)为1,则进行高4位加6修正:(A)(A)+60H累加器高4位为9,低4位大于9,则进行高低4位加6修正:(A)(A)+66H8.十进制调整指令(3)十进制调整的方法例:双字节压缩BCD码加法 (R5R4)+(R3R2)(R6R5R4)

MOVA,R4 ADDA,R2 DAA MOVR4,A MOVA,R5

ADDCA,R3 DAA MOVR5,A MOVA,#00H

ADDCA,#00H MOVR6,A

(R5)(R4)+(R3)(R2)(R6)(R5)(R4)返回本节例:双字节压缩BCD码加法(R5)(R4)(R63.3.3逻辑运算与移位类指令1.“与”操作指令ANLdirect,AANLdirect,#dataANLA,directANLA,#dataANLA,@RiANLA,Rn3.3.3逻辑运算与移位类指令1.“与”操作指令ANL2.“或”操作指令ORLdirect,AORLdirect,#dataORLA,directORLA,#dataORLA,@RiORLA,Rn2.“或”操作指令ORLdirect,A3.“异或”操作指令XRLdirect,AXRLdirect,#dataXRLA,directXRLA,#dataXRLA,@RiXRLA,Rn3.“异或”操作指令XRLdirect,A

上述与、或、异或三种逻辑运算都是按位进行的,而且不影响标志位CY、OV、AC

ANL运算常用来屏蔽某些不用位;ORL运算可对某些位进行置位例:将累加器A的内容送P1口的低5位,传送时要求绝对不影响P1口的高3位

ANLA,#00011111B ANLP1,#11100000B ORLP1,A上述与、或、异或三种逻辑运算都是按位进行的,而且不影响标4.累加器A清零与取反指令CLRACPLA4.累加器A清零与取反指令CLRAA0A7CYCY5.移位指令RLA

;(An+1)(An),(A0)(A7)RLCA

;(An+1)(An),(CY)(A7)

(A0)(CY)

A0A7CYCY5.移位指令RRA

;(An)(An+1),(A7)(A0)RRCA

;(An)(An+1),(CY)(A0)

(A7)(CY)

CYCYRRA;(An)(An+例:已知(20H)=X7X6X5X4X3X2X1X0

(21H)=Y7Y6Y5Y4Y3Y2Y1Y0执行下段程序

MOV30H,20HANL30H,#00011111BMOVA,21HSWAPARLAANLA,#11100000BORL30H,A问:(30H)=_________返回本节例:已知(20H)=X7X6X5X4X3X2X13.3.4控制转移类指令1.无条件转移指令

LJMP addr16;(PC)←addr16

AJMP addr11;(PC)←(PC)+2

(PC)10~0←addr11

SJMP rel ;(PC)←(PC)+2+rel

JMP @A+DPTR ;(PC)←(A)+(DPTR)长转移指令,三字节指令,提供16位目标地址addr16,转移范围64K绝对转移指令,双字节指令,转移范围是和当前PC在同一个2K范围内短转移指令,双字节指令,目的地址=源地址+2+rel间接长转移指令,单字节指令,可实现多分支的选择转移3.3.4控制转移类指令1.无条件转移指令长转移指令,三 ORG0000H

AJMP

MAIN

MOVA,#20H……

ORG0080HMAIN:

MOVA,#30H…… ORG0000H2.条件转移指令

1)累加器判零转移指令

JZ rel;若A=0则转移:

(PC)←(PC)+2+rel,否则程序顺序执行

(PC)←(PC)+2

JNZrel;若A≠0则转移:

(PC)←(PC)+2+rel

,否则程序顺序执行

2.条件转移指令例:将外部RAM的一个数据块传送到内部RAM,两者首地址分别为DAT1和DAT2,遇到传送的数据为零时为止。

MOVDPTR,#DAT1 MOVR1,#DAT2 LOOP:MOVXA,@DPTR

HERE:JZHERE MOV@R1,A INCDPTR INCR1

SJMPLOOP例:将外部RAM的一个数据块传送到内部RAM,两者首地址分别

2)比较转移指令(3字节)

CJNE A,#data,rel

CJNE A,direct,rel CJNE @Ri,#data,rel CJNE Rn,#data,rel

2)比较转移指令(3字节)CJNE A,#data,

CJNE 目的操作数,源操作数,rel

若目的操作数=源操作数,则(PC)←(PC)+3,顺序执行若目的操作数>源操作数,则(PC)←(PC)+3+rel;CY=0,程序转移若目的操作数<源操作数,则(PC)←(PC)+3+rel;CY=1程序转移CJNE 目的操作数,源操作数,rel

3)减1条件转移指令(循环转移指令)

DJNZ direct,rel;

(direct)←(direct)–1

若(direct)=0,则(PC)←(PC)+3

否则(PC)←(PC)+3+rel

DJNZ Rn,rel;

(Rn)←(Rn)–1

若(Rn)=0,则(PC)←(PC)+2

否则(PC)←(PC)+2+rel

3)减1条件转移指令(循环转移指令)例:将内部RAM中从DATA单元开始的10个无符号数相加,结果送SUM单元保存

MOVR0,#0AH MOVR1,#DATA CLRA LOOP:ADDA,@R1 INCR1

DJNZR0,LOOP MOVSUM,A

例:将内部RAM中从DATA单元开始的10个无符号数相加,结3.子程序调用及返回指令1)子程序调用指令LCALLaddr16

; (PC)←(PC)+3,

(SP)←(SP)+1,((SP))←(PC7~0)

(SP)←(SP)+1,((SP))←(PC15~8)

(PC)←addr163.子程序调用及返回指令

ACALLaddr11;

(PC)←(PC)+2,(SP)←(SP)+1,((SP))←(PC7~0)

;(SP)←(SP)+1,((SP))←(PC15~8)

(PC10~0)←addr11

ACALLaddr11;

RET(PC15~8)←((SP)),(SP)←(SP)-1;(PC7~0)←((SP)),(SP)←(SP)-1;

RETI(PC15~8)←((SP)),(SP)←(SP)-1;(PC7~0)←((SP)),(SP)←(SP)-1;

2)返回指令RET2)返回指令子程序的调用过程

MOVSP,#50H

ACALLDIMS …… DIMS:MOVR7,#64H DELAY:DJNZR7,DELAY

RET子程序的调用过程NOP;(PC)←(PC)+1

4.空操作指令返回本节NOP;(PC)←(PC)+14.3.3.5位操作类指令

1.位数据传送指令

MOV C,bit ;C←(bit)

MOV bit,C ;(bit)←C位地址的表示方法有以下四种:直接位地址表示方式,如:D5H

点操作符表示方式,如PSW.5

位名称表示方法,如F0

用户定义名表示方式。3.3.5位操作类指令1.位数据传送指令2.位置位指令

CLR C ;(CY)←0

CLR bit ;(bit)←0

SETB C ;(CY)←1

SETB bit ;(bit)←12.位置位指令3.位逻辑运算指令ANL C,bit ;(CY)←(CY)∧(bit)ANL C,/bit ;(CY)←(CY)∧(bit)ORL C,bit ;(CY)←(CY)∨(bit)ORL C,/bit ;(CY)←(CY)∨(bit)CPLC;(CY)←(CY)CPLbit;(bit)←(bit)3.位逻辑运算指令4.位条件转移指令

1)判布尔累加器条件转移指令JCrel若(CY)=1,则转移:(PC)←(PC)+2+rel;(CY)=0,则程序顺序执行JNCrel

若(CY)=0,则转移(PC)←(PC)+2+rel;

(CY)=1,则程序顺序执4.位条件转移指令2)判位变量条件转移指令JBbit,rel

若(bit)=1,则转移(PC)←(PC)+3+rel;

(bit)=0,则程序顺序执行JNBbit,rel

;若(bit)=0,则转移(PC)←(PC)+3+rel;

(bit)=1,则程序顺序执行

2)判位变量条件转移指令

JBCbit,rel

若(bit)=1,则(PC)←(PC)+3+rel,(bit)←0;

(bit)=0,则程序顺序执行

JBCbit,rel;例:编程序用以实现图示逻辑功能

例:编程序用以实现图示逻辑功能MOVC,P2.2ORLC,TF0ANLC,P1.1MOVF0,CMOVC,IE1ORLC,/20H.0ANLC,F0ANLC,/08HMOVP3.3,C

MOVC,P2.2例:(20H)=X7X6X5X4X3X2X1X0,执行MOVC,00HRLCAMOVC,01HRLCAMOVC,02H

RLCAMOVC,03HRLCAANLA,#0FHMOV20H,A

问:(20H)=___例:(20H)=X7X6X5X4X3X2X1X03.4汇编语言及程序设计

3.4.1程序设计语言1.机器语言:机器语言是用二进制代码0和1表示指令和数据的最原始的程序设计语言。2.汇编语言:在汇编语言中,指令用助记符表示,地址、操作数可用标号、符号地址及字符等形式来描述。3.高级语言:高级语言是接近于人的自然语言,面向过程而独立于机器的通用语言。3.4汇编语言及程序设计 3.4.1程序设计语言3.4.2汇编语言语句结构

汇编语言的指令类型(1)基本指令(2)伪指令汇编语言的语句(指令)格式标号:操作码 操作数;注释START:MOVA,30H;A←(30H)3.4.2汇编语言语句结构 汇编语言的指令类型(1)ORG:设置目标程序起始地址格式:[标号:]ORG16位地址

ORG2000HSTART:MOVA,#7FH3.4.3伪指令200AH程序存储器74H7FH2000H2001H2002H…(2)END:汇编结束格式:[标号:]END(1)ORG:设置目标程序起始地址3.4.3伪指令20(3)DB:定义数据字节格式:[标号:]DB项或项表

一个字节的常数或常数表…ORG2000HTAB1:DB30H,8AH,7FH,49H DB‘5’,‘A’,‘BCD’2000H30H2001H8AH2002H7FH2003H49H2004H35H2005H41H2006H42H2007H43H2008H44H2009H(3)DB:定义数据字节一个字节的常数或常数表…(4)DW:定义数据字 格式:[标号:]DW项或项表两个字节的常数或常数表ORG1500HTAB2:DW1234H,0080H,1500H12H1501H34H1502H00H1503H80H(4)DW:定义数据字两个字节的常数或常数表(5)DS:预留存储空间格式:[标号:]DS表达式

ORG1500H DS20HTAB2:DW1234H,0080H1500H1501H1502H1503H151FH1520H12H1521H34H1522H00H1523H80H…(5)DS:预留存储空间ORG(6)

EQU:赋值格式:标号:EQU项

给变量标号赋予一个确定的数值。

TAB:EQU1000HTAB1:EQUTAB(7)BIT:位地址赋值格式:标号:BIT位地址

AI:BITP1.0常数,地址标号或表达式返回本章(6)EQU:赋值常数,地址标号或表达式返回本章3.5汇编语言程序设计方法1.分析问题2.确定算法3.设计程序流程图4.分配地址(主要是分配内存单元)5.编写汇编语言源程序6.调试程序3.5.1程序设计一般步骤

3.5汇编语言程序设计方法1.分析问题3.5.1程序3.5.2程序基本结构

(1)顺序程序【例3.1】将30H单元内的两位BCD码拆开并转换成ASCII码,存入RAM两个单元31H(高位),32H(低位)中。程序流程如图3-1所示。3.5.2程序基本结构 (1)顺序程序结束取数据低4位转换成ASCII码存ASCII码取数据高4位转换成ASCII码存ASCII码开始图3-1拆字程序流程图结束取数据低4位转换成ASCII码存ASCII码取数据高4位ORG 2000HMOV 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 $ENDORG 2000H(2)分支程序

1)分支程序的基本形式分支程序有三种基本形式,如下图所示。分支程序结构流程图(2)分支程序 1)分支程序的基本形式分支程序结构流程图分支程序的设计要点如下:(1)先建立可供条件转移指令测试的条件。(2)选用合适的条件转移指令。(3)在转移的目的地址处设定标号。单片机微机原理及应用基础教程第章汇编语言及其程序设计课件2)分支程序设计举例【例3.2】设X存在30H单元中,根据下式

1 X>0Y= 0 X=0-1 X<0求出Y值,将Y值存入31H单元。解:根据数据的符号位判别该数的正负,若最高位为0,再判别该数是否为0。2)分支程序设计举例例3.2程序流程图A为负数?取数,A←(30H)开始结束A=0?YNNA←-1A←0A←1存数,(31H)←A例3.2程序流程图A为负数?取数,A←(30H)开始结束A= ORG 1000H MOV A,30H ;取数

JB ACC.7,NEG

;负数,转NEG

JZ ZER0

;为零,转ZER0

MOV A,#01H

;为正数,A=1 AJMPSAVE ;转到SAVE,保存数据ZER0:MOV A,#0H

;数据为零,Y=0 AJMPSAVE ;转到SAVE,保存数据NEG:MOVA,#0FFH

;X为负数,A=-1SAVE:MOV 31H,A ;保存数据

SJMP $ ;暂停 ORG 1000H(3)循环程序

1)循环程序的结构循环程序一般包括如下四个部分:初始化循环体循环控制结束(3)循环程序 1)循环程序的结构(a)当型循环结构(b)直到型循环结构循环结束?循环体YN初始化修改循环参数结束部分开始结束循环结束?循环体Y初始化修改循环参数结束部分开始N结束循环结构程序流程图(a)当型循环结构(b)直到型循环结构循环结束?循环体YN初外循环中循环内循环外循环内循环外循环内循环内循环(a)嵌套正确(b)嵌套正确(c)交叉不正确多重循环示意图外循环中循环内循环外循环内循环外循环内循环内循环(a)嵌套正2)循环程序设计举例【例3.3】从BLOCK单元开始有一个无符号数数据块,其长度存于LEN单元,试求出数据块中的最大数并存入MAX单元。2)循环程序设计举例开始置初值取数数>MAX修改循环参数搜索完否?返回NYMAX数N例3流程图开始置初值取数数>MAX修改循环参数搜索完否?返回NYMAX参考程序:

ORG2000HLOOP:

MOVR0,#BLOCK MOVR1,LEN MOVMAX,#00HLOOP1:MOVA,MAX CLRC SUBBA,@R0 JNCNEXT MOVMAX,@R0;(cy)=1,MAX<((R0))NEXT:INCR0

DJNZR1,LOOP1RET BLOCKEQU30HLENEQU20HMAXEQU10HMOV20H,#10参考程序: BLOCKEQU3(4)子程序结构

1)子程序概念调用子程序应注意:(1)现场保护(2)参数的传递。(3)嵌套调用与递归调用。通过寄存器传递参数;通过堆栈传递参数;通过数据指针传递参数(4)子程序结构 1)子程序概念通过寄存器传递参数;通子程序的调用与返回RETLCALLSUB…子程序的调用与返回RETLCALLSUB…LCALLARETRETLCALLB子程序的嵌套调用与返回LCALLARETRETLCALLB子程序的嵌套调用与2)子程序设计举例【例3.4】有一数据块从片内RAM的30H单元开始存入,设数据块长度为10个单元。根据下式:

X+2 X>0Y=100X=0求出Y值,并将Y值放回原处。∣X∣X<0解:数据块中的十个数都需要进行符号判断并作相应处理,可把一部分工作交给子程序完成,主程序只负责读取数据、调用判断处理子程序、保存数据、循环控制工作。2)子程序设计举例

ORG 1000HMOV R0,#10 MOV R1,#30HSTART:MOV A,@R1 ;取数

LCALL

DISPOSE

;调用判断、处理子程序SAVE:MOV @R1,A ;保存数据

INC R1 ;修改地址指针,指向下一个地址

DJNZ R0,START ;数据未处理完继续

SJMP $ ;暂停

ORG 2000HDISPOSE:

JB ACC.7,NEG;若为负数,转NEGORG 1000HJZ ZER0 ;若为零,转ZER0 ADDA,#02H ;若为正数,求X+2 AJMPBACK ;返回ZER0:MOVA,#64H ;数据为零,Y=100 AJMPBACK ;返回NEG:DEC A CPL A ;数据为负求∣X∣BACK:RET;返回返回本章JZ ZER0 ;若为零,转ZER3.6程序设计举例查表程序:预先将某一数据表格存放在ROM中,程序中根据自变量X利用查表指令读出与其对应的数据。查表指令:MOVCA,@A+DPTRMOVCA,@A+PC在LED显示和键盘处理程序中将会用到。3.6.1查表程序设计

3.6程序设计举例查表程序:预先将某一数据表格存放在RO单片机微机原理及应用基础教程第章汇编语言及其程序设计课件1000H001001H111002H421003H931004H1641005H2551006H3661007H4971008H6481009H819y=x2

地址X函数y的地址=1000H+xROM中的数据表表首地址MOVDPTR,#1000HMOVA,#04HMOVCA,@A+DPTR1000H001001H111002H421003H9310例:设有一巡回检测报警装置需对16路输入值进行比较,当某一路输入值超过该路的报警值时实现报警,编制查表程序依据路数xi查得报警值yi程序入口:(R2)=路数xi程序出口:(R4R3)=对应xi的报警值yi例:设有一巡回检测报警装置需对16路输入值进行比较,当某一路TABY0高0TAB+1Y0低TAB+2Y1高1TAB+3Y1低TAB+4Y2高2TAB+5Y2低TAB+30Y15高15TAB+31Y15低报警值路数Xi报警值yi高的地址=TAB+2*Xi报警值地址……报警值yi低的地址=TAB+2*Xi+1TABY0高0TAB+1Y0低TAB+2Y1高1TAB+3Y利用DPTR做基地址查表(1)表格首地址送DPTR(2)查表项数送累加器A(3)执行查表指令:MOVCA,@A+DPTR

查表结果回累加器A利用DPTR做基地址查表(1)表格首地址送DPTR

MOVDPTR,#TABMOVA,R2ADDA,R2MOVR4,AMOVCA,@A+DPTRXCHA,R4

INCAMOVCA,@A+DPTRMOVR3,ARETTAB:DW050FH…..TABY0高0TAB+1Y0低TAB+2Y1高1TAB+3Y1低TAB+4Y2高2TAB+5Y2低TAB+30Y15高15TAB+31Y15低报警值yi高的地址=TAB+2*XiMOVCA,@A+PC报警值yi低的地址=TAB+2*Xi+1MOVDPTR,#TABTABY0高0TAB利用PC做基地址查表(1)查表项数送累加器A(2)累加器A加上表首偏移量偏移量=表首地址-PC当前值(A)=项数+表首地址-PC当前值(3)执行查表指令:MOVCA,@A+PC

查表结果回累加器AMOVC指令所在地址+1利用PC做基地址查表(1)查表项数送累加器AMOVC指令所在EAMOVA,R22AADDA,R2ECMOVR4,A2407

ADDA,#07H83MOVCA,@A+PCCCXCHA,R404INCA2402ADDA,#02H83MOVCA,@A+PCFBMOVR3,A22RET050FTAB:DW050FH…..…83HCCH04H24H02H83HFBH22HTAB05H0TAB+10FHTAB+20EH1TAB+389H….TAB+306CH15TAB+31A0HPCTAB-1TAB-2TAB-3TAB-7EAMOVA,R2…83HCCH例:设(R0)=2FH,(R1)=6,(A)=01H,写出执行这段程序后30H~35H各单内容。

MOVDPTR,#TABLELOOP:INCA INCR0LCALLCAPDJNZR1,LOOPHEAR:SJMPHEARCAP:PUSHAMOVCA,@A+DPTRMOV@R0,APOPARETTABLE:DB00H,01H,04H,09HDB16H,25H,36H,49H DB64H,81HEND例:设(R0)=2FH,(R1)=6,(A)=01H,写出执散转程序是指通过修改某个参数后,程序可以有三个以上的流向,多用于键盘程序。常用的指令是JMP@A+DPTR,该指令是把16位数据指针DPTR的内容与累加器A中的8位无符号数相加,形成地址,装入程序计数器PC,形成散转的目的地址。DPTR+APCA中内容为8位无符号数16位地址数3.6.2散转程序设计

散转程序是指通过修改某个参数后,程序可以有三个以上的流向,多JUMP1:MOVDPTR,#JPTAB;跳转表首送数据指针

MOVA,R7ADDA,R7;2*(R7)

JNCNOAD

INCDPHNOAD:JMP@A+DPTR;转向形成的散转地址入口JPTAB:AJMPOPR0;直接转移地址表

AJMPOPR1...AJMPOPRn例:根据R7的内容,转向各自对应的操作程序

(R7=0,转入OPR0;R7=i,转入OPRi;n<=255)JUMP1:MOVDPTR,#JPTAB;源程序:指令周期DELAY:MOVR3,#(X)H1个T机器

DEL2:MOVR4,#(Y)H1个T机器

DEL1:NOP1个T机器

NOP1个T机器

DJNZR4,DEL12个T机器

DJNZR3,DEL22个T机器

RET指令周期、机器周期T机器与时钟周期T时钟的关系:

T机器=12T时钟=12*1/fosc=1us

(假设晶振频率fosc为12M)延时时间的简化计算结果:(1+1+2)*X*Y若想延时100ms,只需修改计数初始值,即(1+1+2)*200*125us=100ms#200#1253.6.3延时程序设计

源程序:1S延时程序源程序:DELAY:MOVR2,#10DEL3:MOVR3,#200DEL2:MOVR4,#125DEL1:NOPNOPDJNZR4,DEL1DJNZR3,DEL2DJNZR2,DEL3RET1S延时程序源程序:单片机微机原理及应用基础教程第章汇编语言及其程序设计课件例5:编程实现P1口连接的8个LED显示方式如下:从P1.0到P1.7

温馨提示

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

评论

0/150

提交评论