第3章指令系统培训讲学_第1页
第3章指令系统培训讲学_第2页
第3章指令系统培训讲学_第3页
第3章指令系统培训讲学_第4页
第3章指令系统培训讲学_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

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

文档简介

第3章指令系统1.掌握指令格式和寻址方式2.理解每条指令的含义3.熟练运用每条指令编写程序4.掌握汇编语言程序编译环境本章学习要求:单片机原理及应用3.1AT89C51程序设计语言介绍3.1AT89C51程序设计语言介绍机器语言:用二进制代码表示的指令,也是CPU唯一能够接受的指令形式.如:MOVA,R0;机器语言(机器码)为:1110_1000bMOVR1,A;机器码为:1111_1001b汇编语言:

汇编语言就是用助字符表示的指令,与机器语言指令一一对应。 如:两个寄存器相加汇编语言指令:ADDA,R0C51语言:

语法同标准C语言。开发效率高,可读性强,是目前使用最为广泛的单片机开发语言。一条C语言通常需要由多条机器语言组成。

机器语言(MachineLanguage)有三类汇编语言

(Assemble)

高级语言

(HighLevelLanguage)3.2指令格式和寻址方式3.2指令格式和寻址方式3.2.1汇编语言指令格式:[标号:]操作码操作数1,操作数2[;注释]

例如:LOOP:MOVA,#40H ;取参数

1.标号:指令的符号地址。2.操作码:指明指令功能。3.操作数:指令操作对象。

数据、地址、寄存器名及约定符号。

操作数1:目的操作数;操作数2:源操作数.4.注释行:说明指令在程序中的作用。操作码和操作数是指令主体。换行表示一条指令结束。3.2指令格式和寻址方式3.2.2机器语言指令格式:内部数据存储器开辟的工作寄存器区可以减小程序长度、提高程序运行速度、简化程序设计。举例: 汇编语言: 机器语言: MOVA,R0 E8H11 MOVA,30H E530H21 MOVR6,#32H 7E32H21 MOV40H,#64H 754064H32011101010100000001100100字节数机器周期数 操作码[操作数1][操作数2]

有单字节、双字节和三字节指令。3.2指令格式和寻址方式3.2.3指令寻址方式一.操作数类型:位(bit)─位寻址区中的一位二进制数据字节(Byte)─8位二进制数据字(Word)─16位双字节数据二.七种寻址方式:(1)立即寻址方式:

指令中给出实际操作数据(立即数),用于寄存器或存储器赋常数初值。举例:8位立即数:MOVA,#40H ;A¬#40H16位立即数:MOVDPTR,#2100H;DPTR¬#2100H★思考题:什么是立即数?3.2指令格式和寻址方式(2)直接寻址方式:操作数是存储器单元地址,数据放在存储器单元中。

MOVA,40H

;A¬(40H),注意小括弧的含义直接寻址方式对数据操作时,地址是固定值,而地址所指定的单元内容为变量形式。41H

78H40H

56H

例:设存储器两个单元的内容如图所示,执行指令MOVA,40H后(A)=?思考题:★直接寻址方式指令和立即寻址方式指令的形式有什么不同?56H3.2指令格式和寻址方式(3)寄存器寻址方式:(4)寄存器间接寻址方式:

操作数为寄存器名,寄存器中存放的是数据地址。存放地址的寄存器称为间址寄存器或数据指针。例: MOVA,@R0 ;A¬((R0))设指令执行前A=20H,R0=40H,地址为40H存储器单元内容如图所示。执行指令后,A=?,R0=?,(40H)=?34H40H34H01000000AR000100000

41H 67H

40H

34HR0→A20HR040H例:MOVA,R0 ;A¬(R0)设指令执行前(A)=20H,(R0)=40H,执行指令后,(A)=?,(R0)=?操作数为寄存器名,数据存放在寄存器中。40H40H3.2指令格式和寻址方式(5)变址间接寻址方式:

例: MOVCA,@A+DPTR ;A¬((A)+(DPTR))设指令执行前(A)=09H,(DPTR)=2000H,存储器单元内容如图所示。执行指令后,(A)=?(DPTR)=?12H2000H2008H 89H2009H

12H

数据在存储器中,指令给出的寄存器中为数据的基地址和偏移量。数据地址=基地址+偏移量。

说明:1、只对程序存储器;

2、指令形式:MOVCA,@A+DPTR

MOVCA,@A+PC

3.2指令格式和寻址方式指令给出位地址。一位数据在存储器位寻址区。(1)内部RAM中的位寻址区:字节地址为20H~2FH;(2)专用寄存器的可寻址位.表示方法:1)直接使用位地址;如:PSW的位6可表示为0D6H2)位名称表示;或AC3)字节地址加位数表示;或D0H.64)专用寄存器符号加位数表示。或PSW.6例:MOVC,40H ;Cy¬(位地址40H)设指令执行前Cy=1,位地址40H存储器单元如图,执行指令后,Cy=?29H

0110001028H

11010110位寻址区0(6)位寻址方式:3.2指令格式和寻址方式(7)相对寻址方式:主要用于相对跳转指令。目的地址=转移指令地址+rel(偏移量)当前PC值加上指令中规定的偏移量rel,构成实际的操作数地址例:SJMPrel操作:跳转到的目的地址=当前16位PC值+rel注意:符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:-128~+127(80H~7FH)。在实际编程中,“rel”通常用标号代替。不需要手工计算3.2.4指令执行过程3.2指令格式和寻址方式例:MOVA,30H1.PC直针按照当前指令字节数递增,指向下一条指令;2.执行指令主体功能,将30H单元内数据传送到A;3.修改PSW中的相关标志位,本例中涉及校验位P。3.3指令分类介绍3.3指令分类介绍指令按功能分类:数据传送、算术运算、逻辑运算、布尔处理、程序控制。实现寄存器、存储器之间的数据传送。一、内部传送指令: 片内数据存储器数据传送。二、外部传送指令: 片外数据存储器数据传送。三、查表指令: 程序存储器数据传送。四、交换指令: 片内数据存储器数据传送。五、堆栈操作指令: 片内数据存储器数据传送。3.3.1数据传送指令3.3指令分类介绍一内部传送指令:(MOV)指令机器码:11101rrrE8~EF11100101nE5

n1110011iE6、E701110100d74d10101rrrn 1010011in85n1n2

90d1d2MOVA,Rn ;A←(Rn),n=0~7MOVA,direct ;A←(direct)MOVA,@Ri ;A←((Ri)),i=0、1

MOVA,#data ;A←data

MOVRn,direct ;Rn←(direct)

MOV@Ri,direct ;(Ri)←(direct)MOVdirect1,direct2

;direct1←(direct2)

MOVDPTR,#data16;DPTR←data16实现片内数据存储器中数据传送。指令格式:MOV目的操作数,源操作数寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间址。3.3指令分类介绍例1:MOV A,#30H MOV 4FH,A MOV R0,#20H MOV @R0,4FH MOV 21H,20H例2:用两种寻址方式实现,将片内RAM60H单元的数据传送给累加器A。解:MOVA,#60H;(A)=30H;(4FH)=30H;(R0)=20H;(20H)=30H;(21H)=30HMOVR0,60HMOVA,@R0顺序执行下列指令序列,求每一步执行结果。(×)(×)解:MOVA,60H(√)MOVR0,#60HMOVA,@R0(√)3.3指令分类介绍1.立即数送累加器A和内部数据存储器(Rn,内部RAM,SFR)共5条指令:MOVA,#data ;A←#dataMOVdirect,#data ;direct←#dataMOV@Ri,#data ;(Ri)←#data.MOVRn,#data ;Rn←#dataMOVDPTR,#data16 ;DPTR←#data16共有6条指令:MOVA,direct ;A←

(direct)MOVA,@Ri ;A

((Ri))MOVA,Rn ;A

←(Rn)MOVdirect,A ;direct

(A)MOV@Ri,A ;(Ri)←

(A)MOVRn,A ;Rn←

(A)2.内部数据存贮器(Rn、内部RAM、SFR)与累加器A间传送数据3.3指令分类介绍共有5条指令,三种寻址方式:直接寻址,寄存器寻址,寄存器间接寻址。:MOVdirect1,direct2 ;direct1←(direct2)MOVdirect,@Ri ;direct←((Ri))MOVdirect,Rn ;direct←(Rn).MOV@Ri,direct ;(Ri)←(direct)MOVRn,direct ;Rn←(direct)3、内部数据存贮器中Rn、SFR和片内数据RAM之间的数据传送只有指令表中的指令才有对应指令代码,计算机才能执行。编程时,不能随意创造发明指令。1.一条指令中不能同时出现两个工作寄存器:

非法指令: MOVR1,R2

MOVR2,@R02.间址寄存器只能使用R0、R1。

非法指令:MOVA,@R23.指令表中的两个参数:指令字节数和机器周期数注意:3.3指令分类介绍二外部数据存储器读写传送指令:(MOVX)DPTR作间接寻址寄存器:

MOVXA,@DPTR ;A←((DPTR))(读)

MOVX@DPTR,A ;(DPTR)←(A)(写)2.

Ri作间接寻址寄存器(了解):

MOVX A,@Ri

;A←((P2Ri))(读)

MOVX @Ri,A ;(P2Ri)←A(写)实现外部数据存储器和累加器A之间的数据传送。指令格式:MOVX目的操作数,源操作数寻址方式:通过A并使用寄存器间接寻址方式。3.3指令分类介绍例3:实现片外数据存储器2000H内的数据传送到2100H单元。 MOVDPTR,#2000H MOVXA,@DPTR MOVDPTR,#2100H MOVX@DPTR,A ;DPTR←#2000H ;A←(2000H) ;DPTR←#2100H ;2100H←(A)片外数据存储器不能采用直接寻址。下列为非法指令:MOVXA,2000HMOVX2100H,2000H思考题:为什么对DPTR的数据传送使用内部传送指令?3.3指令分类介绍三程序存储器读指令(查表指令):(MOVC)1.DPTR为基址寄存器: MOVC A,@A+DPTR;A¬((A)+(DPTR))(读) 查表范围为64KB程序存储器任意空间。2.PC为基址寄存器(了解): MOVC A,@A+PC ;A¬((A)+(PC))(读)实现从程序存储器读取数据到累加器A,只能使用变址寻址方式。多用于查常数表程序,可直接求取常数表中的函数值。3.3指令分类介绍例4:以查表方法把累加器A中的十六进制数转换为ASCII码,并送回累加器中。指令地址源程序

ORG2000H2000H2A:INCA2001MOVCA,@A+PC2002RET2003DB30H2004DB31H2005DB32H……2011DB45H2012DB46H思考题1:伪指令ORG和DB的含义是什么?思考题2:基址寄存器PC的值是如何确定的?3.3指令分类介绍例5:ORG1000H SQU: MOVA,20H ;取X(变量:偏移量) MOVDPTR,#3000H ;确定表首地址(基地址)MOVCA,@A+DPTR ;查表求Y=X2 MOV21H,A ;保存Y(结果) RET ;子程序结束 … ORG3000H;常数表格首地址TAB:DB00,01,04,09,…,225;平方表查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H单元中,要求查表求Y,存入片内RAM21H单元。3.3指令分类介绍

ORG1000H ;程序起始地址1000H SQU: MOVA,20H ;取X1002H ADDA,#3 ;修正偏移量1004H MOVCA,@A+PC ;查表求Y=X2(PC=1005H)1005H MOV21H,A ;存结果1007H RET ;子程序结束1008H TAB: DB00,01,04 ;平方表100BH DB09,…,225 查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H单元中,要求查表求Y,存入片内RAM21H单元。例6:3.3指令分类介绍四交换指令: 1.字节交换指令:XCHXCHA,Rn;(A)«(Rn)XCHA,@Ri;(A)«((Ri))XCHA,direct;(A)«(direct)思考题:将片内RAM60H单元与61H单元的数据交换。例7:设(A)=29H,执行指令XCHA,2AH后,(A)=?, (2AH)=?38H29HXCH60H,61H;←对吗?29H实现片内RAM区的数据双向传送。3.3指令分类介绍2.半字节交换指令:XCHDXCHDA,@Ri ;A3~0

«((Ri))3~03.累加器A高低半字节交换指令:SWAPSWAPA ;A7~4

«A3~0例8:将片内RAM2AH和2BH单元中的低半字节拼成新字节存储到20H单元,其中2BH单元的低半字节作为新字节的高半字节。58HMOV A,#0;MOV R0,#2AH;MOV R1,#2BH;XCHD A,@R0;SWAP A;XCHDA,@R1;XCHA,20H;A0000000000H0101100058H20H30H00110000@R105H00000101A30H00110000@R00101000050HA0101100058HA35H00110101@R138H00111000@R03.3指令分类介绍什么是堆栈?堆栈是一种数据结构,是只允许在其一端进行数据插入和数据删除操作的线性表;数据写入堆栈称为压入,或叫进栈(PUSH);数据从堆栈中读出称为弹出,或叫出栈(POP);堆栈操作遵循先进后出的规则.堆栈的功用为子程序调用和中断操作而设立,用于保护断点和现场;堆栈也可用于数据的临时存放.五堆栈操作指令:3.3指令分类介绍堆栈区域的开辟堆栈区域由堆栈指针SP指定;堆栈指针SP是一个SFR,字节地址是81H;堆栈指针SP的复位值为07H;实际工作中通常将堆栈区域设在30H到7FH单元间。堆栈操作进栈和出栈操作实际就是对栈顶单元的写和读操作;堆栈指针SP总是指示当前栈顶位置;进栈操作:先SP自动加1,然后写入数据;出栈操作:先读出数据,然后SP自动减1;3.3指令分类介绍例9:设(A)=02H,(B)=56H,执行下列指令后,(SP)=?,(A)=?,(B)=?SBR:MOVSP,#60H;设栈底PUSHA PUSHB MOVA,#00H MOV B,#01H … POP B POPASP→××××

×SP→B02H×××02H

×56HASP→B02H××56H02H

×56HASP→B00H××56H02H

×01HASP→B00H××56H02H

×56HASP→B02H××56H02H

×56HA02H56H60HB02H56HA进栈指令:PUSHdirect ;SP←(SP)+1,(SP)←(direct)出栈指令:POPdirect ;(direct)←((SP)),SP←(SP)-1

“先加后压”“先弹后减”3.3指令分类介绍1.五类数据传送指令;2.指令表中的两个参数:指令字节数和机器周期数;3.执行每条指令,单片机依次所做的3件工作:(1)依据指令字节数修改PC指针,为执行下一指令做准备;(2)执行指令主体功能,数据传送;(3)修改校验标志位P(仅对涉及到累加器A的指令)。4.不要随意创造指令。数据传送指令总结:3.3指令分类介绍思考题:找出指令错误并改正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.3指令分类介绍3.3.2 算术运算指令完成累加器A和片内RAM中数据的加减乘除运算。多数算术运算指令的执行结果会自动影响状态寄存器PSW中的标志位。状态寄存器PSW:字节地址为D0H位序D7D6D5D4D3D2D1D0位符号CYACF0RS1RS0OV--P★思考题:能否根据PSW的字节地址,推出PSW中各位的位地址?3.3指令分类介绍1)Cy:进位标志位 保存运算后最高位的进位/借位状态, 当有进位/借位,Cy=1,否则Cy=0。2)AC:辅助进位标志位 保存低半字节的进位/借位状态,用于十进制调整。 当D3产生进位/借位,AC=1,否则AC=0。3)OV:溢出标志位 运算结果按有符号数+127~-128理解。 有溢出OV=1,否则OV=0。4)P:奇偶标志位 反映累加器A中数据的奇偶性。 当1的个数为奇数,P=1,否则P=0。例10:已知(A)=3BH,(PSW)=0,执行指令”ADDA,#3BH”后求:(A)=?(Cy)=?(OV)=?(AC)=?(P)=? (PSW)=?3.3指令分类介绍一.加法指令:ADD

指令格式:ADDA,源操作数 ;A←(A)+源操作数结果影响:Cy、AC、OV、P00111011=3BH+00111011=3BH

0111011076H001101000001=41H位序D7D6D5D4D3D2D1D0位符号CYACF0RS1RS0OV--PADD A,#data; A←(A)+dataADD A,direct; A←(A)+(direct)ADD A,Rn; A←(A)+(Rn)ADD A,@Ri; A←(A)+((Ri))例11:(A)=9AH,(R2)=E3H,(PSW)=0,执行指令ADDCA,R2后求:(A)=?(Cy)=?(OV)=?(AC)=?(P)=? PSW=?3.3指令分类介绍10011010=9AH

11100011=E3H+0101111101=7DH7DH110010000100=84H二.带进位加法指令:ADDC指令格式:ADDCA,源操作数;A←(A)+源操作数+(Cy)结果影响:Cy、AC、OV、PADDC A,#data;A←(A)+data+(Cy)ADDC A,direct; A←(A)+(direct)+(Cy)ADDC A,Rn; A←(A)+(Rn)+(Cy)ADDC A,@Ri;A←(A)+((Ri))+(Cy)位序D7D6D5D4D3D2D1D0位符号CYACF0RS1RS0OV--P3.3指令分类介绍带进位加法指令ADDC用于多字节加法运算:例12:设双字节数X存在片内RAM41H、40H单元,Y存在43H、42H单元,编程求Z=X+Y,并存入片内RAM单元46H、45H、44H。MOV A,40HADD A,42HMOV 44H,AMOV A,41HADDC A,43HMOV 45H,AMOV A,#00HADDC A,#00HMOV 46H,ARET;取被加数低字节;加上加数低字节;保存和的低字节;取被加数高字节;加上加数高字节;保存和的高字节;求高字节进位;子程序结束;低字节相加;高字节相加;计算高字节进位;子程序结束3.3指令分类介绍三.带借位减法指令:SUBB000000例13:(A)=5AH,(R2)=5AH,(Cy)=0,执行指令SUBBA,R2求: (A)=?(Cy)=?(OV)=?(P)=?(AC)=?思考题:有不带借位的减法指令吗?01011010=5AH01011010=5AH

-0

00000000=00H指令格式:SUBBA,源操作数;A←(A)-源操作数-(Cy)结果影响:Cy、AC、OV、PSUBB A,#data;A←(A)-data-(Cy)SUBB A,direct; A←(A)-(direct)-(Cy)SUBB A,Rn; A←(A)-(Rn)-(Cy)SUBB A,@Ri;A←(A)-((Ri))-(Cy)3.3指令分类介绍四.加1指令:INC指令格式:INC操作数;操作数←操作数+1结果影响:P(仅对操作数为A的指令)INC A ;A←(A)+1INC direct ;direct←(direct)+1INC Rn;Rn←(Rn)+1INC @Ri ;(Ri)←((Ri))+1INC DPTR ;DPTR←(DPTR)+1注意:加1指令不影响标志位状态Cy、AC、OV。3.3指令分类介绍五.减1指令:DEC指令格式:DEC操作数;操作数←操作数-1结果影响:P(仅对操作数为A的指令)DEC A ;A←(A)-1DEC direct ;direct←(direct)-1DEC Rn;Rn←(Rn)-1DEC @Ri ;(Ri)←((Ri))-1注意:减1指令不影响标志位状态Cy、AC、OV。没有指令DECDPTR。3.3指令分类介绍六.乘法指令:MUL指令格式:MULAB;BA←(A)*(B)结果影响:P、OV、CyMULAB ;BA←(A)*(B)注意:Cy总是被清0;乘积大于255,OV为1,否则OV为0;乘积高字节存于B中,低字节存于A中。例14:(A)=96(60H),(B)=192(C0H),执行指令MULAB后,求:(A)=?(B)=?(Cy)=?(OV)=?(P)=?解:96×192=18432(4800H)00H48H0103.3指令分类介绍七.除法指令:DIVDIVAB ;A←(A)/(B),B←(A)%(B)注意:Cy总是被清0;若除数B为0,OV为1,否则OV为0;商存于A中,余数存于B中。指令格式:DIVAB;A←(A)/(B),B←(A)%(B)结果影响:P、OV、Cy例15:(A)=246(F6H),(B)=13(0DH),执行指令DIVAB后求:(A)=?(B)=?(Cy)=?(OV)=?(P)=?解:246÷13=18(12H),余数=12(0CH)。12H0CH0003.3指令分类介绍DAA ;把A中按二进制相加后的结果;调整成按BCD数相加的结果调整原因:1、相加结果大于9,进入无效编码区;2、相加结果有进位,跳过无效编码区。调整方法:进行加“6”修正。八.十进制调整指令:DA指令格式:DAA;BCD码加减运算结果修正结果影响:P、AC、Cy3.3指令分类介绍1.八类算术运算指令;2.指令表中的两个参数:指令字节数和机器周期数;乘法和除法指令均需要4个机器周期。3.执行每条指令,单片机依次所做的3件工作:(1)依据指令字节数修改PC指针,为执行下一指令做准备;(2)执行指令主体功能,算术运算;(3)修改标志位P、OV、AC、Cy(依不同指令而有差异)。4.不要随意创造指令。算术运算指令总结:3.3指令分类介绍3.3.3 逻辑运算及移位指令一.逻辑与、或、异或运算指令:ANL/ORL/XRL指令格式:ANL/ORL/XRL目的操作数,源操作数;

结果影响:P(仅对目的操作数为A的指令)ANL A,#data;A←(A)&dataANL A,direct; A←(A)&(direct)ANL A,Rn; A←(A)&(Rn)ANL A,@Ri;A←(A)&((Ri))ANL direct,A;direct←(direct)&(A)ANL direct,#data;direct←(direct)&dataORL A,#data;A←(A)|dataORL

A,direct; A←(A)|(direct)ORL A,Rn; A←(A)|(Rn)ORL A,@Ri;A←(A)|((Ri))ORL

direct,A;direct←(direct)|(A)ORL

direct,#data;direct←(direct)|data3.3指令分类介绍XRL A,#data;A←(A)⊕dataXRL

A,direct; A←(A)⊕(direct)XRL A,Rn; A←(A)⊕(Rn)XRL A,@Ri;A←(A)⊕((Ri))XRL

direct,A;direct←(direct)⊕(A)XRL

direct,#data;direct←(direct)⊕data注意:与0相与值总为0,与1相与值不变;与1相或值总为1,与0相或值不变;与1相异或值取反,与0相异或值不变;上述逻辑运算都是按位进行的。3.3指令分类介绍例16:(A)=01××××××B,×表示随机状态,为1或0,下述一组指令执行后,A的值将如何变化?

XRLA,#0C0H ;

ORLA,#03H ;

ANLA,#0E7H ;将累加器A的内容D7、D6取反将累加器A的内容D1、D0置1将累加器A的内容D4、D3清0解:执行上述指令后,A=10×00×11B。3.3指令分类介绍二.累加器A清0和取反指令:CLR/CPL指令格式:CLR/CPLA;

结果影响:PCLRA ;A←0CPLA ;A←(A)3.3指令分类介绍三.移位指令:RL/RR/RLC/RRC指令格式:RL/RR/RLC/RRCA;

结果影响:PRLA;An+1

←An,A0

←A7RRA;An

←An+1,A7

←A0RRCA;An

←An+1,Cy←A0,A7

←CyRLCA;An+1

←An,Cy←A7,A0

←Cy注意:左移为乘2,右移为除2;通常用移位指令代替乘除指令.3.3指令分类介绍例17(A)=11000101B,(Cy)=0,分别执行下列单条指令:CPLA 求:(A)=?(Cy)=?RLA求:(A)=?(Cy)=?RLCA求:(A)=?(Cy)=? 001110100100010110100010101CLR CMOV A,R5RLC AMOV R5,AMOV A,R6RLC AMOV R6,A0CyR6R5Cy;Cy=0,设R6=55H,R5=AAH;R6=01010101B,R5=10101010B,Cy=0;R6=01010101B,R5=01010100B,Cy=1;R6=10101011B,R5=01010100B,Cy=0思考题:如何将寄存器R6R5中的双字节数X右移一位。用9位循环指令实现多字节移位:例18:编程将寄存器R6R5中的双字节数X左移一位。3.3指令分类介绍例19.试编写一拆字程序,将累加器A中的高、低四位分开,分别对应放到31H单元、30H单元的低四位中,并将31H单元、30H单元的高四位全部补0。MOV R0,#30H ;设指针MOV R2,A ;暂存ANL A,#0FH ;高半字节清0MOV @R0,A ;保存数据低位INC R0MOV A,R2SWAPA ;ANL A,#0FHMOV @R0,A ;保存数据高位3.3指令分类介绍1.三类逻辑运算指令;2.指令表中的两个参数:指令字节数和机器周期数;常用左移和右移指令代替乘法和除法运算。3.执行每条指令,单片机依次所做的3件工作:(1)依据指令字节数修改PC指针,为执行下一指令做准备;(2)执行指令主体功能,逻辑运算;(3)修改标志位P(仅对涉及到累加器A的指令)。4.不要随意创造指令。逻辑运算指令总结:3.3指令分类介绍3.3.4 位操作指令位操作就是以位(bit)为单位进行的运算和操作。位操作数:(1)内部RAM位寻址区中的128个可寻址位。 (2)SFR中的可寻址位。 (3)位累加器Cy,它是位传送的中心。一.位传送指令:MOVMOVC,bit ;Cy¬(bit)MOVbit,C ;bit¬(Cy)例20:将位地址20H的一位数传送到位地址30H中: MOVC,20H MOV30H,C3.3指令分类介绍二.位置位、复位指令:SETB、CLR

SETBC ;Cy¬1 SETBbit ;bit¬1

CLRC ;Cy¬0 CLRbit ;bit¬0三.位逻辑运算:ANL、ORL、CPLANLC,bit ;C←(C)&(bit)ANLC,/bit ;C←(C)&(bit)ORLC,bit ;C←(C)|(bit)ORLC,/bit ;C←(C)|(bit)CPLC ;C←(C)CPLbit ;bit←(bit)3.3指令分类介绍例21:设(Cy)=1,(位地址40H)=1,执行指令 ANL C,/40H后, Cy=?,(位地址40H)=?013.3指令分类介绍1.三类位操作指令;2.指令表中的两个参数:指令字节数和机器周期数;3.执行每条指令,单片机依次所做的2件工作:(1)依据指令字节数修改PC指针,为执行下一指令做准备;(2)执行指令主体功能,逻辑运算4.不要随意创造指令。5.位地址的四种表示方法(PSW的位6

):(1)直接使用位地址:D6H(2)位名称:AC(3)字节地址加位数表示:D0H.6(4)专用寄存器符号加位数表示:PSW.6

位操作指令总结:3.3指令分类介绍3.3.5 控制转移类指令转移指令通过改写PC的当前值,从而改变CPU执行程序的顺序,使程序发生跳转。1000H 1003H 1005H 1006H 1008H ;3字节;2字节;1字节;2字节ORG 1000HMOV 30H,20H

MOV A,#30H

CLR A

SETB 40H

......非转移指令举例:PC¬(PC)+3PC¬(PC)+2PC¬(PC)+1PC¬(PC)+23.3指令分类介绍转移指令举例:3.3指令分类介绍按转移条件分类:1)无条件转移:(LJMP、AJMP、SJMP、JMP)执行无条件转移指令,程序无条件转移到指定处。2)条件转移:指令中给出转移条件,执行指令时,先测试条件:若满足条件,则程序发生转移;否则,仍顺序执行程序。按转移方式分类:1)绝对转移:指令给出转移目的的绝对地址d2d1,执行指令后,PC¬d2d1。2)相对转移:指令给出转移目的与转移指令的相对偏移量rel,执行指令后,PC¬(PC)+rel。

目的地址=PC+字节数+rel例22:地址 源程序 1000HSJMP07 ;2字节指令 … 1009H … ;转移目的指令3.3指令分类介绍一.无条件转移指令:LJMP、AJMP、SJMP、JMPLJMP addr16(d2d1) ;长跳转指令,64K跳转 ;PC¬d2d1AJMPaddr11(双字节) ;绝对跳转指令,2K跳转 ;PC¬(PC)+2 ;PC10~0¬addr11 ;PC15~11不变SJMPrel ;相对跳转指令,256字节 ;PC¬(PC)+2+relJMP@A+DPTR ;变址寻址长跳转指令,64K跳转 ;PC¬(A)+(DPTR)3.3指令分类介绍

1.长转移指令:

LJMPaddr16(d2d1) ;PC¬(PC)+2 ;PC¬d2d1 目的地址=d2d1指令转移范围:64KB例23:1830HLJMP0100H ;执行结果:PC¬0100H3.3指令分类介绍2.绝对转移指令:AJMPaddr11 ;PC¬(PC)+2 ;PC10~0¬addr11,PC15~11不变目的地址={PC15~11不变,PC10~0¬addr11}addr11也是双字节;转移时要求转移前后保持PC15~11不变。64K空间分为32组,只能组内跳转;指令转移范围:2KB;例24:1830HAJMP0100H ;执行结果:PC¬1900H

07FFHAJMP0100H;执行结果:PC¬0900H3.3指令分类介绍3.短转移(相对跳转)指令:

SJMPrel ;PC¬(PC)+2;PC¬(PC)+rel目的地址=(PC)+2+rel;相对偏移量rel为8位带符号的补码数;rel为正数:向前转移;rel为负数:向后转移;指令转移范围:前126~后129字节。实际编程中,通常用标号代替转移的相对偏移量rel,相对偏移量rel的值交给编译器计算。

SJMPNEXT

NEXT:…3.3指令分类介绍KEY: MOVDPTR,#KTABMOVA,40HADDA,AJMP@A+DPTRKTAB: AJMPFUNC0 AJMPFUNC1 …FUNC0:… FUNC1:…应用:处理功能键。例25:要求不同键执行不同程序段。每个键对应一个键值X(0~FH)。X已存入40H单元中。若X=0,则执行程序段FUNC0;若X=1,则执行程序段FUNC1; …4.变址寻址转移指令(多分支转移指令): JMP@A+DPTR ;PC←(PC)+2 ;PC←(A)+(DPTR) 目的地址=(A)+(DPTR) 指令转移范围64KB。3.3指令分类介绍二、条件转移指令:1.判累加器A值的转移指令:

JZrel ;若A=00H,PC←(PC)+2+rel(转移), ;若A≠00H,PC←(PC)+2JNZrel ;若A≠00H,PC←(PC)+2+rel(转移) ;若A=00H,PC←(PC)+2条件转移就是设有条件的程序转移。执行指令时,若满足条件则程序转移,否则程序顺序执行。条件转移指令形成程序的分支,赋予计算机判断决策能力。3.3指令分类介绍3.判位转移指令: JBbit,rel ;(bit)=1转移,否则不转移 JNBbit,rel ;(bit)=0转移,否则不转移4.判位清0转移指令: JBCbit,rel ;(bit)=1转移,且bit←0, ;否则不转移2.判Cy值的转移指令:

JCrel ;Cy=1则转移,Cy=0不转移 JNCrel ;Cy=0则转移,Cy=1不转移3.3指令分类介绍;若操作数1=操作数2,顺序执行,且Cy=0。;若操作数1≠操作数2,则程序跳转 ;且当操作数1>操作数2,Cy=0, ;且当操作数1<操作数2,Cy=1。相当于两个操作数相减,仅影响标志位Cy,不保存结果。5.比较不相等转移指令:

指令格式:CJNE操作数1,操作数2,relCJNE A,#data,relCJNE A,direct,relCJNE Rn,#data,relCJNE @Rn,#data,rel3.3指令分类介绍

6.减1(循环)转移指令:

指令格式:DJNZ操作数,rel

用于循环结构程序设要求某段程序循环执行100次。 MOVR2,#100 ;设循环计数器初值LOOP: … ;多次循环程序段… DJNZR2,LOOP ;循环控制 … ;循环结束 思考题:当循环计数器初值为0,循环次数是多少?DJNZ Rn,relDJNZ direct,rel;操作数←操作数-1。;若操作数≠

0,则程序跳转,否则程序顺序执行。3.3指令分类介绍例26:编写子程序,将内部数据存储器30H~35H单元的数据传送到外部数据存储器的2003H~2008H单元. MOV R0,#30H ;指针首地址 MOV DPTR,#2003H ;指针首地址 MOV R1,#06H ;字节个数LOOP: MOV A,@R0 ;取数据 MOVX@DPTR,A ;保存数据 INC R0 ;指针加1 INC DPTR ;指针加1 DJNZ R1,LOOP ;判断是否传送完

RET3.3指令分类介绍 例27:设一AT89C51单片机系统的外接晶振频率为6MHz,试编写一段延时约100ms的子程序。分析:T=12/6MHz=2μs 100ms/2μs=50000

Delay:MOVR7,#64H ;1T,设循环计数器初值(100次)LOOP:MOVR6,#0FAH;1T,循环250次 DJNZR6,$ ;2T,循环控制DJNZR7,LOOP;2T,循环控制RET ;2T计算实际延时时间:t=2μs+100×(2μs+1ms+2×2μs)+4μs=100.606ms 3.3指令分类介绍1.分为无条件转移和有条件转移两类指令;2.指令表中的两个参数:指令字节数和机器周期数;3.执行每条指令,单片机依次所做的3件工作:(1)依据指令字节数修改PC指针,为执行下一指令做准备;

操作数自减1(仅DJNZ指令).(2)执行指令主体功能,再次修改PC指针.(3)修改状态位Cy(仅有CJNE指令)

4.不要随意创造指令。控制转移类指令总结:3.3指令分类介绍3.3.6子程序调用和返回指令子程序调用和返回指令也使程序发生转移。一.长调用指令:

LCALLaddr16 ;PC¬(PC)+3, ;SP¬(SP)+1,(SP)¬(PC0~7); ;SP¬(SP)+1,(SP)¬(PC8~15); ;PC¬addr16 addr16为子程序起始地址,编程时可用标号代替。 指令调用范围:64KB子程序调用过程:与转移指令不同:转移时,先用堆栈保存当前PC地址。3.3指令分类介绍三.绝对调用指令:

ACALLaddr11 ;PC¬(PC)+2 ;SP¬(SP)+1,(SP)¬PC0~7

;SP¬(SP)+1,(SP)¬PC8~15

;PC10~0¬addr11 ;PC15~11不变

addr11为子程序首地址 指令调用范围2KB。二.子程序返回指令: RET/RETI

RET ;PC¬(PC)+2 ;PC15~8¬((SP)),SP¬(SP)-1,;PC7~0¬((SP)),SP¬(SP)-1 RET指令从堆栈弹出保存的PC地址,实现子程序返回。PC3.3指令分类介绍例28:子程序嵌套:

20H 92H21H53H

SP→ 2000H

208FH

2092H

2100H

2150H

2153H

2200H

2250H

2251H

2153H

2092H

21FFH

2200H

SP→

SP→

SP→

SP→

SP→

SP→3.3指令分类介绍注意:下面的子程序执行完毕后将无法返回主程序.MAIN: MOVSP,#65H ;主程序 LCALL SUBR ;调用SUBR … …SUBR: PUSH ACC ;子程序首地址 PUSH PSW … RET ;子程序返回1、子程序起始指令要使用标号,用作子程序名。2、执行返回指令RET之前,保证栈顶内容为主程序返回地址,以便正确返回主程序。3.3指令分类介绍下面的子程序执行完毕后将正常返回主程序.MAIN: MOVSP,#65H ;主程序 LCALL SUBR ;调用SUBR … …SUBR: PUSH ACC … ;子程序首地址 … POP ACC RET ;子程序返回3.3指令分类介绍1.仅有LCALL、ACALL、RET三条指令;2.指令表中的两个参数:指令字节数和机器周期数;3.执行调用指令,单片机依次所做的3件工作:(1)依据指令字节数修改PC指针,为执行下一指令做准备;(2)将PC指针所指地址压入堆栈,为子程序返回做准备;(3)执行指令主体功能,修改PC,将子程序首地址赋给PC。4.执行返回指令,单片机依次所做的3件工作:(1)依据指令字节数修改PC指针,为执行下一指令做准备;(2)执行指令主体功能,修改PC,从堆栈中弹出值赋给PC。5.不要随意创造指令。子程序调用和返回指令总结:3.3指令分类介绍本章总结1、指令的寻址方式、格式、功能和使用方法。7种寻址方式: 立即寻址; 直接寻址; 寄存器寻址; 寄存器间接寻址; 变址寻址; 位寻址; 相对寻址。2、指令分类介绍。数据传送类1.用立即寻址指令可直接给片内RAM中20H、25H单元和P1口上置数:MOV20H,#25HMOV25H,#10HMOVP1,#0CAH执行后使(20H)=

,(25H)=

,(P1)=

。若将其作为初值,再执行下列程序:MOVR0,#20H;MOVA,@R0;MOVR1,A;

温馨提示

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

评论

0/150

提交评论