第3章-80C51单片机指令系统PPT课件.ppt

上传人:rrsccc 文档编号:9492830 上传时间:2021-02-28 格式:PPT 页数:164 大小:866.50KB
返回 下载 相关 举报
第3章-80C51单片机指令系统PPT课件.ppt_第1页
第1页 / 共164页
第3章-80C51单片机指令系统PPT课件.ppt_第2页
第2页 / 共164页
第3章-80C51单片机指令系统PPT课件.ppt_第3页
第3页 / 共164页
第3章-80C51单片机指令系统PPT课件.ppt_第4页
第4页 / 共164页
第3章-80C51单片机指令系统PPT课件.ppt_第5页
第5页 / 共164页
点击查看更多>>
资源描述

《第3章-80C51单片机指令系统PPT课件.ppt》由会员分享,可在线阅读,更多相关《第3章-80C51单片机指令系统PPT课件.ppt(164页珍藏版)》请在三一文库上搜索。

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

2、123 (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 S

3、P,#30H (2)CJNE 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)

6、为高8位地址,以(Ri)为低8位地址的片外数据存储器单元。 (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 通

7、常采用标号:JMP LOOP,不需计算。,835AH SJMP 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 位名称表示

8、: CLR RS0 单元地址加位数: CLR D0H.3 专用寄存器加位数: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,#da

10、ta16;(DPTR)#data16 ;机器码:1001 0000 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)(di

11、rect) ;机器码:10000101 direct direct,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指令来实现?

12、 R7内容传送到R4 外部RAM 20H单元内容送R0 ROM 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)=4

13、0H, (B)=10H,31,外部数据存储器读/写指令,DPTR作为间址寄存器的外部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 ;将外存储区地址给寄存器DP

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

15、00H ;(DPTR)3000H MOVXA,DPTR ;(A)(DPTR)=(3000H)=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)(

16、R5)=32H MOVP2,#30H ;(P2)30H MOVR1,#10H ;(R1)10H 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,#0051

17、H MOVX A,DPTR MOV P3,A,或,36,程序存储器读指令组,对程序存储器只能读不能写。 程序存储器读指令,只能通过累加器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单元中存放变量

18、X,任给X的值,求出Y=X2,并将Y存入40H单元中。,采用变址寻址的方式求X的平方,首先将DPTR指向平方表的首地址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+1000

19、H)=(1002H)=04H MOV40H,A;(40H)(A)=04H,存Y到40H单元 ORG 1000H TAB: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

20、,9,16,25,36,49,64,81,或,42,整字节交换,在内部RAM与A之间进行,XCH A,Rn ;(A) (Rn) 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

21、(A)7-4,【例】使用SWAP指令将内存33H中的两个BCD码交换位置。,MOV A,33H ;将33H中内容送入A中 SWAP A ;A的高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, (2

22、0H)=35H SWAPA;(A)03 (A)47,(A)=F7H,上述分析可知,运行程序后,(R0)=20H,(A)=F7H,(20H)=35H,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中 P

23、OP 04H;弹出R3内容送入R4中,47,PUSH A PUSH DPL POP ACC POP DPL,若(SP)=26H,(A)=37H,(DPTR)=0CFA8H;执行以下指令后,试指出SP、A、DPTR的数值。,(SP)=26H,(A)=37H,(DPTR)=0CF37H,48,算术运算类指令,加法指令组 带进位加法指令组 带借位减法指令组 加1指令组 减1指令组 乘除指令组 十进制调整指令,49,有符号数和无符号数,对指令使用者来说,8为二进制数可以当作无符号数(0255),也可以当作带符号数,即补码数(-128127)。 例如:8位二进制数11010011,用户可以认为它是无符号

24、数,即为十进制数211,也可以认为它是带符号数,即为十进制负数-45。,50,加法指令组,加法指令的一个加数是A,另一个源操作数可以是立即数、寄存器、直接、间接等寻址方式,相加结果送回A。 影响标志位Cy、AC、OV、P。,51,带进位加法指令组,进位标志位参加运算。,52,作加法的注意事项,在求和时,总是把操作数直接相加,而无须任何变换。,【例】若A=11010011,R1=11101000,执行指令ADD A,R1时,求其和。,11010011 + 11101000 1 10111011,即相加后A=10111011,最前面的1丢失。若认为是无符号数相加,则A的值代表十进制数187,若认为

25、是带符号数相加,则A的值为十进制负数-69。,53,【例】若A=01001001,求执行指令ADD A,#6BH的结果。,由于两个正数相加结果为负数,表示出现了溢出,故OV=1,但进位标志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

26、后, (A)=,CY=,AC=,OV=,P=,例设(A)=85H,(R0)=20H,(20H)=0AFH,执行指令ADD A,R0后,(A)=,CY=,AC=,OV=,P=,(A)=4FH,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单元中。

27、故程序应由2条传送指令与1条加法指令组成。,将存储单元40H与50H内容相加的和存入60H单元,即:(40H) + (50H)(60H)。,【例】,MOVA,40H ;A(40H),取第1个操作数到A ADDA,50H ;A(A)+(50H),两个操作数和送A MOV60H,A ;60H(A),将运算和送60H单元,57,【例】双字节无符号数相加。假设两个双字节无符号数,分别存放在R1、R0和R3、R2中,高字节在前,低字节在后。编程使两数相加,用R2、R1、R0存放和。,此程序较简单,求和的方法与笔算雷同,先加低位,后加高位,无需画流程图。,R1R0 +R3R2 R2 R1R0,对多字节的加

28、法,存在最高位的进位问题。如果高位有进位,则和的字节数要比加数或被加数的字节数多一个。,58,ORG 1000H CLR C MOV A,R0;A取被加数低字节 ADD A,R2;与加数低字节相加 MOV R0,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单

29、元中。,MOVA,40H ;(A)(40H)=88H ADDA,50H ;(A)(A)+(50H)=88H+88H=110H MOV60H,A ;(60H)(A)=10H MOVA,41H ;(A)(41H)=22H 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单元

30、。求X+Y =?,【例】,分成两个字节加,先加40H和50H,再加41H和51H。 运算结果为X+Y=6610H,而正确运算结果为: X= 2288H + Y = 4488H X+Y = 67 10H,多字节加操作,?,MOVA,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的5

31、0H、51H和52H单元中;加数在内部RAM的53H、54H和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的20H位中。,(50H) (51H) (52H) (53H) (54H) (55H) (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,#15

32、6;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不变, 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)(6

33、0H) 求解此题,只需要将例3-8中的加法指令改成减法指令即可。由于只有带借位的减法指令,所以做减法之前必须将借位位CY清零。,CLRC;(CY)0 MOVA,40H;(A)(40H) SUBBA,50H;(A)(A)-(50H)-(CY) 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)-(

34、50H)-(CY) MOV60H,A ;(60H)(A) MOVA,41H ;(A)(41H) SUBBA,51H ;(A)(A)-(51H)-(CY) MOV61H,A ;(61H)(A),67,【例】双字节求补。设两个字节原码数存在R1、R0中,求补后结果存在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

35、,加1指令组,按无符号二进制数进行。 当有A参与时,只影响P,其余不影响。 用来修改操作数的地址,以便使用间接寻址的指令。,69,减1指令组,加1指令的操作不影响PSW的状态。 当有A参与时,只影响P,其余不影响。,70,DPTR减1,对DPTR没有减1操作的指令。如果要使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

36、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(A)47+6。,123456 H + 567890 H 68ACE6 H + 006 660 H 691 246 H,72,很大的两个十进制数相加时,可以按照两种思路来编程。 1、手工将十进制数换算成二进制数,再用多字节相加的方法。123456=1E240H,567890=8AA52H,【例】编程实现123456+567890。结果存

37、于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,采用BCD码,123456的BCD码是123456H,567890的BCD码是567890H。,计算过程: 123456 H + 567890 H 68ACE6 H,期望的结果为: 123456 + 567890 691346,2、采用编码的方法,即将十进制数用BCD码表示,然后用多字节加法,最后再把结果调整为十进制编码。,MOV A

38、,#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,十进制数减法,十进制数减法运算可以用加上减数的补数来进行。两位十进制数是对100取补的,如减法60-30,也可以改为补数相加:60+(100-30)=130,丢掉进位位后,得到正确的结果。 100采用8位二进制数10011010(9AH)来代替,因为这个十进制数经过十进制调整后为1 0000 0000B。 无符号数的减法运算: (1)求减数的补数(9AH-减数)

39、(2)被减数与减数的补数相加 (3)经十进制加法调整后就得到所求的十进制减法运算结果。 差在A中。,75,CLR C;清进位位 MOV A,#9AH; SUBB A,#36H;求减数的补数 ADD A,91H;加补数完成减法 DA A;十进制调整 CLR C;舍弃进位,10011010 -00110110 01100100 +10010001 11110101 +01100000 101010101 舍弃进位后,差为十进制数55.,【例】完成十进制数91减36的运算。,76,【例】用补码进行30-20的十进制运算,解: 由于十进制数30的BCD码00110000与十六进制数30H=001100

40、00在存储单元中的存放方式是一样的,所以任何一个十进数BCD码在计算机内的运算都是以十六进制方式进行的,只有在经过十进制调整后,才能得到运算结果的BCD码值。所以下面将用十六进制运算来表示十进制30-20的运算。 由于MCS-51单片机没有十进制减法调整指令,所以只能用十进制加法调整指令来完成十进制减法运算。而加法调整指令DAA只能用在加法指令后面,因此必须将减法运算变为加法运算来做,即采用补码运算。现将方法叙述如下:因为2位十制数从0099共100个,所以2位十进制数的模M=100,2位十进数x的补码x补 = x + M = x + 100 = x + 99 + 1。下面例题来说明十进制减法

41、的运算方法。,77,30H-20H=30H+-20H补=30H+(-20H)+99H+1H=9AH-20H+30H 由上式可得出2位十进制数减法运算的方法如下: 先将2位十进数的模M=99H+1=9AH送入累加器A。 用累加器A中的9AH减去减数(如20H)。 再加上被减数(如30H)。 最后用DAA指令调整A中的值,即得到十进制减法运算的差,78,乘除指令组,A、B中为两个无符号数,乘、除指令都为一字节指令,需四个机器周期。,Cy 总是被清0; OV 若乘积大于255,则OV=0,表明乘机在B和A中; 若乘机小于或等于255,则OV=1,表明乘积在A中,而B为0.,Cy 总是被清0; OV

42、除数为0,则OV=1,表明除法无意义;否则OV=0.,79,若被乘数为16位无符号数,乘数为8位无符号数,编制乘法程序。被乘数的地址为M(低8位)和M+1(高8位),乘数地址为N,积存入R2、R3和R4三个寄存器中。,【例】,2)再用16位被乘数的高8位乘以乘数,所得积的低8位应与R3中的暂存的内容相加,存入R3的结果的一部分,而积的高8位还要与进位Cy相加才能存入R2,作为积的高8位。最后的积存于R2、R3、R4,共为24位二进制数。,【分析思路】,1)将16位被乘数分为高8位和低8位,首先由低8位与8位乘数相乘,积的低8位存入R4,积的高8位暂存于R3。,80,MOV R0,#M MOV

43、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码,并将结果存放在FIRST(百位)和SECOND(十位、个位)两单元中。,8位无符号二进制数表示的数据范围为0-255,所以用BCD码,最多3位。可将被转换的数除以100,得到百位数;余数再除以10得十位数;最后余数即为个位数。,设(20H)=0FFH,先用100除,商(A)=02H FIR

44、ST;余数(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除数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,以上几例都

45、是简单程序,可以完成一些特定的功能,若在程序的第一条指令加上标号,程序结尾改用一条子程序返回RET指令,则这些可完成某种特定功能的程序段,均可当作子程序调用。,83,注意, 址大于或等于80H的存储单元为特殊功能寄存器,如地址0F0H表示B寄存器。 特殊功能寄存器只能用直接地址才能翻译成机器码。如:MOVPSW,10H,必须用PSW的地址0D0H才能翻译成机器码。 对寄存器Rn既可以用其名也可以用其地址。如:MOV 00H,#60H中00H号单元实际上就是0区中寄存器R0,因此这条指令所执行的操作与指令MOVR0,#60H所执行的操作是相同的。 寄存器与寄存器之间不能直接传送,如MOVR0,R

46、1是错误的。但可用其地址进行直接寻址方式的传送。若R0、R1在0区,则上条指令可写为:MOV00H,01H。,84,【例】设(R0)=10H,(10H)=15H,(90H)=55H,(B)=33H,(R5)=57H,试分析下列指令执行后各寄存器与存储单元的内容。, MOVA,#30H ;(A)30H MOVA,R0 ;(A)(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, MO

47、V30H,#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 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,#10

48、00H;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,#00H 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

49、;片内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,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 E

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1