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

下载本文档

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

文档简介

1、1,单片机原理与应用Principle 注释,中的内容不是必需的, 指令格式的顺序是不能更改的,LOOP: MOV A, R0;将R0的内容送到累加器A中,5,标号,对指令做标记,便于编程时找到该条指令,例如分支程序和循环程序的跳转、子程序调用都需要用到标号,在调试中也方便查找和修改。 等于指令在存储空间的实际地址,具有唯一性。 标号必须以字母开头,后跟1-8个数字、字母、下划线等,以冒号“:”结尾。 不能与系统保留字(指令助记符、汇编伪指令、寄存器名等)相同。 在其它指令中可把标号作为操作数进行引用,6,例】下面哪些符号是合法的标号,1)ABB (2)LOOP (3)A+B (4)123 (

2、5)ab (6)y_ou,7)_you (8)you (9)mov (10)mov1 (11)da (12)add,7,操作码,用于规定指令进行什么操作 用英文缩写表示,如加法ADD、减法SUBB、传送MOV等 操作码与操作数之间用空格分隔,操作数与操作数之间用“,”隔开 在指令中不能缺少操作码 操作码是给定的,不能自创,8,注释,对语句或程序简要说明,帮助阅读、理解源程序 该部分内容不会被编译成为目标代码,不影响程序的执行。 可有可无,不是必备的。 以分号“;”开始,多行注释时每行都要有“;,9,例】根据指令的格式要求,说出下面哪些指令是合乎语法的,1)L1:MOV SP,#30H (2)C

3、JNE A,#5,NEXT (3)JMP:L1 (4)THIS IS:MOV ACC,B (5);THIS IS MOV ACC,B (6)ADD:SP,C,L (7)ADD A,#12H,合乎语法的有:(1)(2)(5)(7,10,80C51单片机指令寻址方式,操作数是指令操作的对象,寻找操作数的方法称为指令寻址方式。 80C51单片机指令系统共有7种寻址方式。 立即寻址方式 寄存器寻址方式 直接寻址方式 寄存器间接寻址方式 变址寻址方式 相对寻址方式 位寻址方式,11,立即寻址方式,指令的操作数直接在指令中给出,称为立即数,“#”前缀。 8位立即寻址 16位立即寻址 仅一条 立即数可以多种

4、进制表达 十六进制后缀H、二进制后缀B、十进制带后缀D或省略,MOV A,#20H ;(A)20H,MOV DPTR,#3456H ;(DPH)34H ;(DPL)56H,data #data16,MOV A,#0BHMOV A,#1011B MOV A,#11D MOV A,#11,12,寄存器寻址方式,操作数在寄存器中,以符号名称来表示寄存器,主要对象是通用寄存器R0-R7,INC R3 ;(R3)(R3)+1,13,直接寻址方式,操作数直接以存储单元地址的形式给出。 注意与立即寻址方式的区别,ROM,MOV A,70H ;(A)(70H,14,寄存器间接寻址方式,寄存器中存放的是操作数的

5、地址,而不是操作数本身,即操作数是通过寄存器间接得到的,与MOV A,R0的区分,MOV A,R0 ;(A)(R0,15,寄存器间接寻址范围,采用Ri(R0、R1) 内部RAM低128单元 对特殊功能寄存器不能使用! 采用DPTR、 R0、R1 外部RAM 64KB 堆栈操作指令 SP,MOV R0,#20H MOV A,R0,MOV R0,#80H MOV A,R0,MOV A,R0,MOVX A,DPTR ;(A)(DPTR) MOVX R0,A ;(R0)(A) ,P2作为高位地址,16,用Ri间接寻址方式的传送指令,P2)(Ri)表示以(P2)为高8位地址,以(Ri)为低8位地址的片外

6、数据存储器单元。 (P2为MCS-51单片机的P2口,其第二功能为传送地址的高8位。,MOVX A,Ri ;(A)(P2)(Ri) MOVX Ri,A ;(P2)(Ri)(A,17,变址寻址方式,以程序计数器PC或数据指示器DPTR中的内容为基地址,加上累加器A(变址寄存器)中的内容作为操作数的地址,MOVCA,A+DPTR ;(A)(A)+(DPTR,18,变址寻址方式只能对程序存储器ROM进行寻址,MOVCA,A+PC ;(A)(A)+(PC) JMP A+DPTR,19,相对寻址方式,目的地址=转移指令地址+转移指令字节数+rel 通常采用标号:JMP LOOP,不需计算,835AH S

7、JMP 35H ;835AH + 02H + 35H = 8391H,835AH SJMP E7H ;E7H是负数19H的补码 ;835AH + 02H - 19H = 8391H,20,位寻址方式,位地址表示:MOV C,00H 单元地址加位数表示:MOV C,20H.0 内部RAM中的位寻址区(20H-2FH),位地址范围00H-7FH。 专用寄存器中的可寻址位(特殊功能寄存器的单元地址能被8整除可位寻址80H 90H)。 【例】 对于PSW(D0H)的第3位是RS0(D3H)进行清零操作,直接使用位地址:CLR D3H 位名称表示: CLR RS0 单元地址加位数: CLR D0H.3

8、专用寄存器加位数:MOV PSW.3,21,寻址方式对应的存储空间,22,80C51单片机的指令系统-111条指令,按功能分: 数据传送类指令 29条 算术运算类指令 24条 逻辑运算类指令 24条 控制转移类指令 17条 位操作类指令 17条 按字节数分: 单字节 49条 双字节 45条 三字节 17条 按周期数分: 单周期 64条 双周期 45条 四周期 2条,23,80C51指令中使用的符号的意义I,24,80C51指令中使用的符号的意义II,另,指行指令对标志位影响的表示符号为:“”有影响,“”无影响,25,数据传送类指令,指令格式: 作用:将数据从存储器某个地址单元传送到存储器另一个

9、地址单元的指令。 内部RAM数据传送指令组 外部数据存储器读/写指令 程序存储器读指令组 数据交换指令组 堆栈操作指令组,MOV,26,立即数传送指令,MOV A,#data;(A)data ;机器码:0111 0100 data MOV direct,#data;(direct)data ;机器码:0111 0101 direct data MOV Ri,#data;(Ri)data ;机器码:0111 011i data MOV Rn,#data;(Rn)data ;机器码:0111 1rrr data,MOV DPTR,#data16;(DPTR)#data16 ;机器码:1001 00

10、00 data158 data70,27,内部RAM单元之间的数据传送指令,注意:不影响标志位,MOV direct,Rn;(direct)(Rn ) ;机器码:10001rrrdirect MOV Rn,direct;(Rn)(direct) ;机器码:10101rrrdirect MOV direct,Ri ;(direct)(Ri) ;机器码:1000011idirect MOV Ri,direct ;(Ri)(direct) ;机器码:1010011idirect MOV direct,direct ;(direct)(direct) ;机器码:10000101 direct dire

11、ct,28,通过累加器A的数据传送指令,对奇偶标志位P有影响,MOV A,direct;(A)(direct) ;机器码:11100101direct MOV A,Ri;(A)(Ri) ;机器码:1110011i MOVA,Rn;(A)(Rn) ;机器码:11101rrr MOV direct,A ;(direct)(A) ;机器码:11110101direct MOV Ri,A;(Ri)(A) 机器码:1111011i MOV Rn,A;(Rn)(A)机器码:11111rrr,29,若要完成以下的数据传送,应如何用51指令来实现? R7内容传送到R4 外部RAM 20H单元内容送R0 ROM

12、 2000H单元内容送R2 外部RAM 0456H的内容送外部RAM 0078H单元,MOV A,R7 MOV R4,A,MOV DPTR,#0020H MOVX A,DPTR MOV R0,A,MOV A,#00H MOV DPTR,#2000H MOVC A,A+DPTR MOV R2,A,MOV DPTR,#0456H MOVX A,DPTR MOV DPTR,#0078H MOVX DPTR,A,30,30H)=20H,(40H)=0CAH, (10H)=20H,P1=CAH (R0)=30H, A=40H (R1)=40H, (B)=10H,31,外部数据存储器读/写指令,DPTR作

13、为间址寄存器的外部RAM单元读/写指令。 Ri作为间址寄存器的外部RAM单元读/写指令。 注意:R0、R1作为间址寻址寄存器操作外部RAM时,需预先对改变P2口锁存器的值,MOVX A,DPTR MOVX DPTR,A,MOVX A,Ri MOVX Ri,A,32,例】编程实现将0100H、0102H单元中内容分别传送到片内存储区30H和32H,分析,数据存储空间从0100H开始必然为外部数据存储器空间,此时要用MOVX指令和DPTR寻址方式对此单元进行操作,MOV DPTR,#0100H ;将外存储区地址给寄存器DPTR MOVX A,DPTR ;利用DPTR间接寻址的内容先传入A MOV

14、30H,A ;再将A中内容送入片内30H MOV DPTR,#0102H MOVX A,DPTR MOV 32H,A,程序,33,例】编写程序完成下列操作: 将地址为3000H的片外数据存储器单元的内容21H传送到片内地址为30H的单元中。 将寄存器R5中的内容32H传送到片外地址为3010H的数据存储器单元中,分析,因为没有片外数据存储器与片内数据存储器直接传送指令,所以必须通过累加器A进行中转。注意:在使用MOVX指令传送数据之前,必须先将片外数据存储器的地址赋给DPTR,程序,MOVDPTR,#3000H ;(DPTR)3000H MOVXA,DPTR ;(A)(DPTR)=(3000H

15、)=21H MOV 30H,A ;(30H)(A)=21H MOVA,R5 ;(A)(R5)=32H MOV DPTR,#3010H ;(DPTR)3010H MOVX DPTR,A ;(DPTR)=(3010H)(A)=32H,34,例】 用Ri间接寻址方式的传送指令完成上例程序,MOVP2,#30H ;(P2)30H MOVR0,#00H ;(R0)00H MOVXA,R0 ;(A)(P2)(R0)=(3000H)=21H MOV30H,A ;(30H)(A)=21H MOVA,R5 ;(A)(R5)=32H MOVP2,#30H ;(P2)30H MOVR1,#10H ;(R1)10H

16、MOVX R1,A ;(P2)(R1)=(3010H)(A)=32H,35,例】编程实现将片外40H、51H单元中内容分别传送到并行接口P1和P3中,分析,外部数据存储空间要用MOVX指令和DPTR或Ri间址寻址方式对此单元内容进行操作,程序,MOV R0,#40H MOV P2,#00H MOVX A,R0 MOV P1,A MOV R0,#51H MOVX A,R0 MOV P3,A,MOV DPTR,#0040H MOVX A,DPTR MOV P1,A MOV DPTR,#0051H MOVX A,DPTR MOV P3,A,或,36,程序存储器读指令组,对程序存储器只能读不能写。 程

17、序存储器读指令,只能通过累加器A进行 : 包括内部程序存储器和外部程序存储器,MOVC A,A+DPTR MOVC A,A+PC,37,将ROM中4000H单元内容送至片内RAM的75H单元中,程序,MOV A,#00H MOV DPTR,#4000H MOVC A,A+DPTR MOV 75H,A,38,例】 查表程序,查表程序:将A低半字节中的BCD数转转换为ASCII码,39,40,例】设在程序存储器地址为1000H1009H的存储单元中存放09的平方表,30H单元中存放变量X,任给X的值,求出Y=X2,并将Y存入40H单元中,采用变址寻址的方式求X的平方,首先将DPTR指向平方表的首地

18、址1000H,然后将30H单元中的X(如02H)传送到累加器A中,由(A)+(DPTR)可得到X平方单元的地址(如1002H),由变址寻址指令 MOVCA,A+DPTR可将1002H单元内2的平方值04H送入累加器A,再由A传送到变量Y所在单元40H单元中,MOVDPTR,#TAB;(DPTR)1000H,DPTR指向平方表首地址 MOVA,30H ;(A)(30H)=02H,设X=2,取X到累加器A MOVC A,A+DPTR ;(A)(A)+(DPTR)=(02H+1000H)=(1002H)=04H MOV40H,A;(40H)(A)=04H,存Y到40H单元 ORG 1000H TAB

19、:DB 0,1,4,9,16,25,36,49,64,81,41,例】分别用两条查表指令编写一段子程序,功能为:根据累加器A中的数(09之间)查找平方表,求出相应的平方数,放在内部RAM的30h单元中,SQUARE: MOV DPTR,#TAB MOVC A,A+DPTR MOV 30H,A RET TAB:DB 0,1,4,9,16,25,36,49,64,81,SQUARE: ADD A,#4 MOVC A,A+PC MOV 30H,A RET TAB:DB 0,1,4,9,16,25,36,49,64,81,或,42,整字节交换,在内部RAM与A之间进行,XCH A,Rn ;(A) (R

20、n) XCH A,direct;(A) (direct) XCH A,Ri ;(A) (Ri,例】利用XCH指令将R3与R4的内容交换数据,XCH A,R3 XCH A,R4,例】将A与内部RAM的30H的内容交换数据,XCH A,30H,例】将寄存器DPH和DPL内容交换一下,XCH A,DPH XCH A,DPL,43,半字节交换,在内部RAM与A之间进行,XCHD A,Ri;(A)3-0(Ri)3-0,44,高低半字节交换,SWAP A; (A)3-0(A)7-4,例】使用SWAP指令将内存33H中的两个BCD码交换位置,MOV A,33H ;将33H中内容送入A中 SWAP A ;A的

21、高4位与低4位内容互换, (A)3-0(A)7-4 MOV 33H,A ; 将交换过的数据传回到33H中 , (33H)3-0(33H)7-4,45,例】已知:(R0)=20H,(20H)=75H,(A)=3FH 。执行下列指令后R0、A、20H单元内容为多少,XCHA,R0 XCHDA,R0 SWAPA,XCHA,R0;(A)(R0)=(20H),(A)=75H,(20H)=3FH XCHDA,R0;(A)03 (R0)03,(A)=7FH, (20H)=35H SWAPA;(A)03 (A)47,(A)=F7H,上述分析可知,运行程序后,(R0)=20H,(A)=F7H,(20H)=35H

22、,46,堆栈操作指令组,进栈、出栈,PUSH ACC POP ACC,PUSH direct ;SP(SP)+1,(SP) (direct,POP direct ; direct (SP), SP(SP)-1,注意,累加器的栈操作指令,例】利用堆栈操作将R3和R4的内容互换(当前寄存器组是第0组,PUSH 03H;R3内容入栈,03H是R3的地址 PUSH 04H;R4内容入栈,04H是R4的地址 POP 03H;弹出R4的内容送入R3中 POP 04H;弹出R3内容送入R4中,47,PUSH A PUSH DPL POP ACC POP DPL,若(SP)=26H,(A)=37H,(DPTR

23、)=0CFA8H;执行以下指令后,试指出SP、A、DPTR的数值,SP)=26H,(A)=37H,(DPTR)=0CF37H,48,算术运算类指令,加法指令组 带进位加法指令组 带借位减法指令组 加1指令组 减1指令组 乘除指令组 十进制调整指令,49,有符号数和无符号数,对指令使用者来说,8为二进制数可以当作无符号数(0255),也可以当作带符号数,即补码数(-128127)。 例如:8位二进制数11010011,用户可以认为它是无符号数,即为十进制数211,也可以认为它是带符号数,即为十进制负数-45,50,加法指令组,加法指令的一个加数是A,另一个源操作数可以是立即数、寄存器、直接、间接

24、等寻址方式,相加结果送回A。 影响标志位Cy、AC、OV、P,51,带进位加法指令组,进位标志位参加运算,52,作加法的注意事项,在求和时,总是把操作数直接相加,而无须任何变换,例】若A=11010011,R1=11101000,执行指令ADD A,R1时,求其和,11010011 + 11101000 1 10111011,即相加后A=10111011,最前面的1丢失。若认为是无符号数相加,则A的值代表十进制数187,若认为是带符号数相加,则A的值为十进制负数-69,53,例】若A=01001001,求执行指令ADD A,#6BH的结果,由于两个正数相加结果为负数,表示出现了溢出,故OV=1

25、,但进位标志Cy=0,01001001 +01101011 10110100,在确定溢出标志OV的值时,计算机总是把操作数当作带符号数来对待,54,加法指令还会影响辅助进位标志AC和奇偶标志P,第3位对于第4位有进位时,AC=1。 相加后A中的1的数目为偶数,故P=0,01001001 +01101011 10110100,55,加法对溢出标志的影响,例设(A)=53H,(R0)=0FCH,执行指令ADD A,R0后, (A)=,CY=,AC=,OV=,P,例设(A)=85H,(R0)=20H,(20H)=0AFH,执行指令ADD A,R0后,(A)=,CY=,AC=,OV=,P,A)=4FH

26、,CY=1,AC=0,OV=0,P=1,A)=34H,CY=1,AC=1,OV=1,P=1,01010011 + 11111100 (1) 01001111,10000101 + 10101111 (1)00110100,56,解题思路】由于加法运算前的一个操作数必须存放在累加器A,因此40H单元中的被加数应送入累加器A中,而A与50H单元相加的和又存放累加器A中,所以应将和从累加器A传送到60H单元中。故程序应由2条传送指令与1条加法指令组成,将存储单元40H与50H内容相加的和存入60H单元,即:(40H) + (50H)(60H,例,MOVA,40H ;A(40H),取第1个操作数到A

27、ADDA,50H ;A(A)+(50H),两个操作数和送A MOV60H,A ;60H(A),将运算和送60H单元,57,例】双字节无符号数相加。假设两个双字节无符号数,分别存放在R1、R0和R3、R2中,高字节在前,低字节在后。编程使两数相加,用R2、R1、R0存放和,此程序较简单,求和的方法与笔算雷同,先加低位,后加高位,无需画流程图,R1R0 +R3R2 R2 R1R0,对多字节的加法,存在最高位的进位问题。如果高位有进位,则和的字节数要比加数或被加数的字节数多一个,58,ORG 1000H CLR C MOV A,R0;A取被加数低字节 ADD A,R2;与加数低字节相加 MOV R0

28、,A;存和数低字节 MOV A,R1;A取被加数高字节 ADDC A,R3;与加数高字节相加 MOV R1,A;存和数高字节 MOV A,#0 ADDC A,#0;加进位位 MOV R2,A;存和数进位位 SJMP $;原地踏步 END,59,例】假设X =2288H已存入41H与40H单元,而Y=4488H已存入51H与50H单元。编写X+Y的程序,并将X+Y的和存入61H与60H单元中,MOVA,40H ;(A)(40H)=88H ADDA,50H ;(A)(A)+(50H)=88H+88H=110H MOV60H,A ;(60H)(A)=10H MOVA,41H ;(A)(41H)=22

29、H ADDCA,51H ;(A)(A)+(51H)=22H+44H=66H MOV61H,A ;(61H)(A)=66H,分成两个字节加,先加40H和50H,再加41H、51H和Cy。 (41H)(40H) + (51H) (50H) Cy+(41H) +(51H) (40H) +(50H,60,假设X =2288H已存入41H与40H单元,而Y=4488H已存入51H与50H单元。求X+Y =,例,分成两个字节加,先加40H和50H,再加41H和51H。 运算结果为X+Y=6610H,而正确运算结果为: X= 2288H + Y = 4488H X+Y = 67 10H,多字节加操作,MOV

30、A,40H ;(A)(40H)=88H ADDA,50H ;(A)(A)+(50H)=88H+88H=110H MOV60H,A ;(60H)(A)=10H MOVA,41H ;(A)(41H)=22H ADDA,51H ;(A)(A)+(51H)=22H+44H=66H MOV61H,A ;(61H)(A)=66H,61,例】3字节无符号数相加,被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、54H和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的20H位中,50H) (51H) (52H) (53H) (54H) (55H)

31、(50H)+(53H) (51H)+(54H) (52H) +(55H) (53H) (54H) (55H) 52H(52H)+(55H) 54H(51H)+(54H)+CY0,62,63,例】试将数138和(A)=156的内容相加,并将结果存储到35H,36H单元中,编写程序并译成机器码,并指出每条指令执行后Cy、AC、OV、P标志各是什么,MOV A,#156;749CH, Cy=0、AC=0、OV=0、P=0 ADD A,#138; 248AH, Cy=1、AC=1、OV=1、P=1 MOV 35H,A;F535H Cy、AC、OV、P不变 CLR A ;E4H Cy、AC、OV不变,

32、P=0 ADDC A,#00H;3400H Cy=0、AC=0、OV=0、P=1 MOV 36H,A;F536H Cy、AC、OV、P不变,64,带借位的减法指令组,从累加器A中减去不同寻址方式的操作数以及进位标志位CY,其差再送回累加器A。没有不带借位的减法指令,65,例】将存储单元40H与50H内容相减,减得的差存入60H单元中,40H)-(50H)(60H) 求解此题,只需要将例3-8中的加法指令改成减法指令即可。由于只有带借位的减法指令,所以做减法之前必须将借位位CY清零,CLRC;(CY)0 MOVA,40H;(A)(40H) SUBBA,50H;(A)(A)-(50H)-(CY)

33、MOV60H,A;(60H)(A,66,例】X=2288H,Y=4488H,X、Y已分别存入41H、40H、51H与50H中,编写程序,将X-Y存入61H与60H中,解 求解此题,只需要将例3-9中的加法指令改成减法指令即可。做减法之前应将CY清零,CLRC ;(CY)0 MOVA,40H ;(A)(40H) SUBBA,50H ;(A)(A)-(50H)-(CY) MOV60H,A ;(60H)(A) MOVA,41H ;(A)(41H) SUBBA,51H ;(A)(A)-(51H)-(CY) MOV61H,A ;(61H)(A,67,例】双字节求补。设两个字节原码数存在R1、R0中,求补

34、后结果存在R3、R2中,求补采用“模-原码”的方法,因为补码是原码相当于模而言的,对于双字节数来说其模为10000H,ORG 1000H CLR C; Cy0 CLR A; A0 SUBB A,R0;低字节求补 MOV R2,A;送R2 CLR A; 0A SUBB A,R1;高字节求补 MOV R3,A;送R3 SJMP $ END,68,加1指令组,按无符号二进制数进行。 当有A参与时,只影响P,其余不影响。 用来修改操作数的地址,以便使用间接寻址的指令,69,减1指令组,加1指令的操作不影响PSW的状态。 当有A参与时,只影响P,其余不影响,70,DPTR减1,对DPTR没有减1操作的指

35、令。如果要使DPTR完成减1操作,则需要几条指令来完成,PUSH ACC;保护ACC CLR C ;Cy=0 准备作减法 MOV A,DPL ;取DPTR低8位 SUBB A,#1 ;减1,MOV DPL,A ;保存结果 MOV A,DPH ;DPTR高8位 SUBB A,#0 ;减可能产生的借位 MOV DPH,A ;DPTR-1 POP ACC ;恢复ACC,71,十进制调整指令,DA A 专门用于实现BCD码加法的调整指令,对累加器A作BCD码加法后,进行“加6调整”,调整方法: 若(A)039或(AC)=1, 则(A)03(A)03+6。 若(A)479或(CY)=1, 则(A)47(

36、A)47+6,123456 H + 567890 H 68ACE6 H + 006 660 H 691 246 H,72,很大的两个十进制数相加时,可以按照两种思路来编程。 1、手工将十进制数换算成二进制数,再用多字节相加的方法。123456=1E240H,567890=8AA52H,例】编程实现123456+567890。结果存于30H、31H、32H中,高位存于大地址,低位存于小地址,MOV A,#40H ADD A,#52H MOV 30H,A MOV A,#E2H ADDC A,#AAH MOV 31H,A MOV A,#01H ADDC A,#08H MOV 32H,A,73,采用B

37、CD码,123456的BCD码是123456H,567890的BCD码是567890H,计算过程: 123456 H + 567890 H 68ACE6 H,期望的结果为: 123456 + 567890 691346,2、采用编码的方法,即将十进制数用BCD码表示,然后用多字节加法,最后再把结果调整为十进制编码,MOV A,#56H ADD A,#90H DA A MOV 30H,A MOV A,#34H ADDC A,#78H,DA A MOV 31H,A MOV A,#12H ADDC A,#56H DA A MOV 32H,A,如何修正,74,十进制数减法,十进制数减法运算可以用加上减

38、数的补数来进行。两位十进制数是对100取补的,如减法60-30,也可以改为补数相加:60+(100-30)=130,丢掉进位位后,得到正确的结果。 100采用8位二进制数10011010(9AH)来代替,因为这个十进制数经过十进制调整后为1 0000 0000B。 无符号数的减法运算: (1)求减数的补数(9AH-减数) (2)被减数与减数的补数相加 (3)经十进制加法调整后就得到所求的十进制减法运算结果。 差在A中,75,CLR C;清进位位 MOV A,#9AH; SUBB A,#36H;求减数的补数 ADD A,91H;加补数完成减法 DA A;十进制调整 CLR C;舍弃进位,1001

39、1010 -00110110 01100100 +10010001 11110101 +01100000 101010101 舍弃进位后,差为十进制数55,例】完成十进制数91减36的运算,76,例】用补码进行30-20的十进制运算,解: 由于十进制数30的BCD码00110000与十六进制数30H=00110000在存储单元中的存放方式是一样的,所以任何一个十进数BCD码在计算机内的运算都是以十六进制方式进行的,只有在经过十进制调整后,才能得到运算结果的BCD码值。所以下面将用十六进制运算来表示十进制30-20的运算。 由于MCS-51单片机没有十进制减法调整指令,所以只能用十进制加法调整指

40、令来完成十进制减法运算。而加法调整指令DAA只能用在加法指令后面,因此必须将减法运算变为加法运算来做,即采用补码运算。现将方法叙述如下:因为2位十制数从0099共100个,所以2位十进制数的模M=100,2位十进数x的补码x补 = x + M = x + 100 = x + 99 + 1。下面例题来说明十进制减法的运算方法,77,30H-20H=30H+-20H补=30H+(-20H)+99H+1H=9AH-20H+30H 由上式可得出2位十进制数减法运算的方法如下: 先将2位十进数的模M=99H+1=9AH送入累加器A。 用累加器A中的9AH减去减数(如20H)。 再加上被减数(如30H)。

41、 最后用DAA指令调整A中的值,即得到十进制减法运算的差,78,乘除指令组,A、B中为两个无符号数,乘、除指令都为一字节指令,需四个机器周期,Cy 总是被清0; OV 若乘积大于255,则OV=0,表明乘机在B和A中; 若乘机小于或等于255,则OV=1,表明乘积在A中,而B为0,Cy 总是被清0; OV 除数为0,则OV=1,表明除法无意义;否则OV=0,79,若被乘数为16位无符号数,乘数为8位无符号数,编制乘法程序。被乘数的地址为M(低8位)和M+1(高8位),乘数地址为N,积存入R2、R3和R4三个寄存器中,例,2)再用16位被乘数的高8位乘以乘数,所得积的低8位应与R3中的暂存的内容

42、相加,存入R3的结果的一部分,而积的高8位还要与进位Cy相加才能存入R2,作为积的高8位。最后的积存于R2、R3、R4,共为24位二进制数,分析思路,1)将16位被乘数分为高8位和低8位,首先由低8位与8位乘数相乘,积的低8位存入R4,积的高8位暂存于R3,80,MOV R0,#M MOV A,R0 MOV B,N MUL AB MOV R4,A MOV R3,B,INC R0 MOV A,R0 MOV B,N MUL AB ADD A,R3 MOV R3,A MOV A,B ADDC A,#00H MOV R2,A,81,例】将内部RAM的20H单元中的8位无符号二进制数转换为3位BCD码,

43、并将结果存放在FIRST(百位)和SECOND(十位、个位)两单元中,8位无符号二进制数表示的数据范围为0-255,所以用BCD码,最多3位。可将被转换的数除以100,得到百位数;余数再除以10得十位数;最后余数即为个位数,设(20H)=0FFH,先用100除,商(A)=02H FIRST;余数(B)=37H,再用10除,商(A)=05H,余数(B)=05H;十位BCD数送A高四位后,与个位BCD数相减,得到压缩的BCD码55H SECOND,82,FIRST DATA 22H SECOND DATA 21H ORG 1000H HBCD:MOV A,20H;取数 MOV B,#100;B除数

44、100 DIV AB;除100 MOV FIRST,A;百位BCD MOV A,B MOV B,#10;B除数10 DIV AB ;除10 SWAP A;十位数送高位 ORL A,B;A为(十位、个位)BCD MOV SECOND,A;存十位、个位数 SJMP $ END,以上几例都是简单程序,可以完成一些特定的功能,若在程序的第一条指令加上标号,程序结尾改用一条子程序返回RET指令,则这些可完成某种特定功能的程序段,均可当作子程序调用,83,注意,址大于或等于80H的存储单元为特殊功能寄存器,如地址0F0H表示B寄存器。 特殊功能寄存器只能用直接地址才能翻译成机器码。如:MOVPSW,10H

45、,必须用PSW的地址0D0H才能翻译成机器码。 对寄存器Rn既可以用其名也可以用其地址。如:MOV 00H,#60H中00H号单元实际上就是0区中寄存器R0,因此这条指令所执行的操作与指令MOVR0,#60H所执行的操作是相同的。 寄存器与寄存器之间不能直接传送,如MOVR0,R1是错误的。但可用其地址进行直接寻址方式的传送。若R0、R1在0区,则上条指令可写为:MOV00H,01H,84,例】设(R0)=10H,(10H)=15H,(90H)=55H,(B)=33H,(R5)=57H,试分析下列指令执行后各寄存器与存储单元的内容,MOVA,#30H ;(A)30H MOVA,R0 ;(A)(

46、R0)=10H MOVA,90H ;(A)(90H)=55H MOVA,R0 ;(A)(R0)=(10H)=15H MOVR1,#40H ;(R1)40H MOVR2,A ;(R2)(A)=15H MOVR3,0F0H ;(R3)(0F0H)=(B)=33H,85,MOV30H,#50H ;(30H)50H MOV00H,#10H ;(00H)=(R0)10H MOV0B0H,A ;(0B0H)=(P3)(A)=15H MOVPSW,10H ;(PSW)=(0D0H)(10H)=15 MOV40H,R5 ;(40H)(R5)=57 MOV7FH,R0 ;(7FH)(R0)=(10H)=15H

47、MOV R0,#70H ;(R0)=(10H)70H MOV R1,A ;(R1)=(40H)(A)=15H MOV R0,90H ;(R0)=(60H)(90H)=55H MOVDPTR,#2000H ;(DPTR)2000H,86,常见指令错误,1MOV A,#1000H;A1000H,MOV DPTR,#1000H MOV A,#10H,2MOVX A,1000H;A(1000H)片外RAM,MOV DPTR,#1000H MOVX A,DPTR,MOV P2,#10H MOV R0,#00H MOVX A,R0,或,3MOVC A,1000H;A(1000H) ROM,MOV A,#0

48、0H MOV DPTR,#1000H MOVC A,A+DPTR,4MOVX 60H,A;片外RAM(60H)A,MOV DPTR,#0060H MOVX DPTR,A,MOV P2,#00H MOV R1,#60H MOVX R1,A,或,87,5MOV R0,60H;片内RAM:61H(60H) MOV 61H,R0,MOV DPTR,#0060H MOV A,DPTR INC DPTR MOV DPTR,A,6. XCH R1,R2;R1R2,MOV A,R1 XCH A,R2 MOV R1,A,7. MOVX DPTR,#2000H;DPTR2000H,MOV DPTR,#2000H,

49、8. MOVX 60H,DPTR;片内RAM片外RAM,MOVX A,DPTR MOV 60H,A,MOV P2,#00H MOV R0,#60H MOVX A,R0 INC R0 MOV R0,A,或,88,例】编写程序,把A中的高低半字节分别转换为ASCII码,并高位存入R1,低位存入R2。如:若(A)=4AH,则(R1)=34H,(R2)=41H,RESULT EQU 20h ORG 0 SJMP START ORG 0030H START:MOV A,#1AH MOV DPTR,#ASCIITAB mov b,a ;暂存A swap a anl a,#0fh ;取高四位 movc a,

50、a+dptr ;查ASCII表 mov Result,a,mov a,b ;恢复A anl a,#0fh ;取低四位 movc a,a+dptr ;查ASCII表 mov Result+1,a sjmp $ ASCIITAB: ;定义数字对应的ASCII表 DB 0123456789ABCDEF END,89,逻辑运算及移位类指令,逻辑运算都是按位进行的. 逻辑运算指令,对Cy AC OV标志都没有影响,只在涉及到累加器A时,才会对奇偶标志P产生影响。 这条指令用来修改一个输出口时,作为原始口数据的值将从输出口数据锁存器(P0-P3)读入,而不是读引脚状态,90,逻辑“与”“或”“异或”运算指

51、令组,91,ANL A,R1; A(A)(R1) ANL A,70H;A(A)(70H) ANL A,R0;A(A)(R0) ANL A,#07H; A(A)07H ANL 70H,A;(70H)(70H)(A) ANL P1,#0F0H;(P1)(P1)0F0H,例,ORL A,R7; A(A)(R7) ORL A,70H; A(A)(70H) ORL A,R1; A(A)(R1) ORL A,#03H; A(A)03H ORL 78H,A; (78H)(78H)(A) ORL 70H,#07FH;(70H)(70H)07FH,XRL A,R4; A(A)+(R4) XRL A,50H; A

52、(A)+(50H) XRL A,R0; A(A)+(R0) XRL A,#00H; A(A)+00H XRL 30H,A;(30H)(30H)+(A) XRL 40H,#0F0H;(40H)(40H)+0F0H,92,例】设(A)=07H,(R0)=0FDH,执行指令 ANL A,R0 后,结果:(A)= ,(R0)=,A)=05h,(R0)=0FDH,例】设(P1)=05H,(A)=33H,执行指令 ORL P1,A,结果:(A)= ,(P1)=,A)=33H,(P1)=37H,例】设(A)=90H,(R3)=73H,执行指令 XRL A,R3,结果:(A)= ,(R3)=,A)=E3H,(

53、R3)=73H,0000 0111 1111 1101 0000 0101,0000 0101 0011 0011 0011 0111,1001 0000 0111 0011 1110 0011,93,例】将片内RAM中20H存放的压缩BCD码变成正常BCD码,并存放于21H、22H中,高位存于大地址,低位存于小地址。如,56的压缩BCD码表示为56H,正常BCD码表示为05H和06H,MOV R0,#22H;地址送R0 MOV A,20H;压缩BCD码送A中 MOV B,A;暂存于B中 ANL A,#0F0H;屏蔽低4位为0,保留高4位 SWAP A;交换高低4位,则原来的低4位0移到高位,

54、原来的高4位移到低位 MOV R0,A;保存这个结果到22H DEC R0;地址减1 MOV A,B;将原来的BCD压缩码再放入A中 ANL A,#0FH;屏蔽高4位为0,保留低4位 MOV R0,A;保存结果到21H单元,94,将累加器A的低4位送到P1口的低4位,而P1口的高4位保持不变,解题思路,这种操作不便用简单的MOV指令来实现,而可以借助与、或逻辑运算,MOV R0,A;A内容暂存R0 ANL A,#0FH;屏蔽A的高4位为0,保留低4位 ANL P1,#0F0H屏蔽P1口的低4位为0,保留高4位 ORL P1,A;完成所需操作 MOV A,R0;恢复A的内容,95,将P1口的中间

55、两位的状态反转,程序为,MOV A,P1 ANL A,#00011000B CPL A ANL A,#00011000B ANL P1,#11100111B ORL P1,A,MOV A,P1 XRL A,#00011000B MOV P1,A,或,位对1作异或操作运算,可取反,96,异或指令可对如何一个内部RAM单元取反,异或运算有一个特性,即只要使某一单元的每一位都对1作异或运算,就可对这个单元的内容求反,XRL direct,#0FFH ;direct/(direct),/表示取反操作,97,累加器清0和取反指令组,MCS-51中只有对A的取反指令,没有求补指令。若要进行求补操作,可按“

56、求反加1”来进行,机器码:1111 0100,机器码:1110 0100,例】设(A)=10101010B,执行指令CPL A之后,(A)=01010101B,机器码:1100 0100,SWAP A(高低半字节交换,例】设(A)=0C5H,执行指令SWAP A之后,(A)=5CH,对于Cy AC OV标志没有影响,只有涉及A时,才对奇偶标志位P产生影响,CLR A(清0)CPL A(取反,98,移位指令组,指令: RL A ;RLC A ;RR A ;RRC A,A,机器码: 0010 0011 0011 0011 0000 0011 0001 0011,图示,移位只能对于A进行,99,例在

57、30H和31H单元有两个BCD码,现要将它们合并放到30H单元,以节省内存空间。编写相应的程序,程序,MOV R1,#31H;一个BCD码的地址31H送R1 MOV A,R1;A(31H) SWAP A;一个BCD码移到高4位,低4位为0 DEC R1;指向另一个BCD码的地址 ORL A,R1;另一个BCD码合并到低4位 MOV 30H,A;送回30H,100,计算机共有3类移位:逻辑移位,算术移位和循环移位。80C51只有循环移位,而没有逻辑移位和算术移位指令。 若要进行逻辑移位和算术移位,则可通过借用循环移位指令间接实现,逻辑右移: CLR C RRC A,算术右移: MOV C,ACC

58、.7 RRC A,101,例 】 用循环移位指令编写程序实现下列要求。 (30H) 2(41H,40H),注:(30H)中是无符号数,汇编程序如下,MOVA,30H ;将无符号数x由30H单元传送到累加器A中 CLR C ;进位位CY清0 RLC A ;将累加器A与CY左移一位,即进行A2的操作 MOV40H,A ;将乘积的低8位送入40H单元 ;累加器高位送入41H单元 CLR A RLC A ;累加器A与CY左移一位,将CY移入A的最低位A0中 MOV41H,A ;将乘积的高位送入41H单元,102,例16位数的算术左移。16位数在内存中存放在30H和31H单元,低8位在小地址,CLR C

59、;进位Cy=0 MOV R1,#30H;操作数地址送R1 MOV A,R1;低8位送A RLC A;低8位左移,最低位添0,CyA7 MOV R1,A;送回 INC R1;指向高8位 MOV A,R1;高8位送A RLC A;A7移入,高8位左移 MOV R1,A;送回,103,利用为置位指令,可以完成16位数的循环移位,例】16位二进制数存于30H和31H单元,低8位先存,试编写完成一次循环移位的程序,MOV A,31H;取出高8位到A MOV C,ACC.7;最高位送Cy MOV R1,#30H;R1为地址指针 MOV A,R1;低8位送A RLC A;低8位移位 MOV R1,A;送回

60、INC R1;修改地址指针 MOV A,R1;取出高8位 RLC A;高8位移位 MOV R1,A;送回,图,104,将DPTR的内容循环左移4位,程序,PUSH ACC;保存ACC PUSH R0;保存R0 MOV R0,#4;移位次数 AGAIN:MOV A,DPH;取高字节 MOV C,ACC.7;取DPTR的最高位 MOV A,DPL;取低字节 RLC A;循环左移,原DPTR最高位移入最低位 MOV DPL,A;存低字节 MOV A,DPH;取高字节 RLC A;循环左移 MOV DPH,A;存高字节 DJNZ R0,AGAIN;循环,作下一次移位 POP R0;恢复R0 POP A

温馨提示

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

评论

0/150

提交评论