收藏 分享(赏)

第3章单片机指令系统.ppt

上传人:hwpkd79526 文档编号:8339518 上传时间:2019-06-21 格式:PPT 页数:131 大小:2.74MB
下载 相关 举报
第3章单片机指令系统.ppt_第1页
第1页 / 共131页
第3章单片机指令系统.ppt_第2页
第2页 / 共131页
第3章单片机指令系统.ppt_第3页
第3页 / 共131页
第3章单片机指令系统.ppt_第4页
第4页 / 共131页
第3章单片机指令系统.ppt_第5页
第5页 / 共131页
点击查看更多>>
资源描述

1、单片机原理与应用 Principle & Application of MCU,南方医科大学 生物医学工程学院 2013.9,郭淑艳 15112138325 QQ18036174 生命科学大楼6-3-17,第3章 80C51单片机指令系统,1,教学内容和要求,教学内容 80C51单片机指令格式、操作数的寻址方式 按功能分类介绍80C51单片机指令 数据传送类指令、算术运算类指令、逻辑运算及移位类指令、控制转移类指令和位操作类指令 教学要求 掌握数据传送类指令、算术运算类指令、逻辑运算及移位类指令、控制转移类指令和位操作类指令等。 熟悉80C51单片机指令寻址方式。 了解80C51单片机指令的字

2、节数、指令周期、对于标志位的影响。,2,80C51单片机汇编语言指令的格式,由四部分组成:,标号: 操作码 操作数1, 操作数2, 操作数3 ;注释,中的内容不是必须的, 指令格式的顺序是不能更改的。,LOOP_1: MOV A, R0 ;将R0的内容送到累加器A中,3,标号,对指令做标记,等于指令在存储空间的实际地址,具有唯一性,便于编程时找到该条指令. 用于分支程序和循环程序的跳转、子程序调用。标号必须以字母开头,后跟1-8个数字、字母、下划线等,以冒号“:”结尾。 不能与系统保留字(指令助记符如mov、汇编伪指令如org、寄存器名dptr)相同。 在其它指令中可把标号作为操作数进行引用。

3、,4,LJMP LOOP_1,MOV A,#LOOP_1,操作码,用于规定指令进行什么操作 用英文缩写表示,如加法ADD、减法SUBB、传送MOV等 操作码与操作数之间用空格分隔,操作数与操作数之间用“,”隔开 在指令中不能缺少操作码 操作码是给定的,不能自创,5,注释,对语句或程序简要说明,帮助阅读、理解源程序 该部分内容不会被编译成为目标代码,不影响程序的执行。 可有可无,不是必备的。 以分号“;”开始,多行注释时每行都要有“;”。,6,【例】下面哪些符号是合法的标号?,(1) A_1: (2) 1A: (3) A: (4) A+1: (5) _A1: (6) mov: (7) mov1,

4、7,合法的标号有:(1)(3),【例】根据指令的格式要求,说出下面哪些指令是合乎语法的?,(1)LOOP:MOV A R0 (2)LOOP MOV A,R0 (3)LOOP:MOV A,R0 (4)MOV A,R0 (5)MOV A,R0 ;THIS IS MOV A,R0 (6);THIS IS MOV A,R0 (7)LJMP LOOP (8)MOV A,#LOOP,合乎语法的有:(3)(4)(5)(6),8,80C51单片机指令寻址方式,操作数是指令操作的对象,寻找操作数的方法称为指令寻址方式。 80C51单片机指令系统共有7种寻址方式。 立即寻址方式 寄存器寻址方式 直接寻址方式 寄存

5、器间接寻址方式 变址寻址方式 相对寻址方式 位寻址方式,9,立即寻址方式,指令的操作数直接在指令中给出,称为立即数,“#”前缀。 #data8 #data16 立即数可以多种进制表达 十六进制后缀H、二进制后缀B、十进制带后缀D或省略。,MOV A,#20H ;(A)20H,MOV DPTR,#3456H ;(DPH)34H ;(DPL)56H,MOV A,#0BH MOV A,#1011B MOV A,#11D MOV A,#11,10,寄存器寻址方式,操作数在寄存器中,以符号名称来表示。 主要对象是通用寄存器R0-R7、特殊功能寄存器。,INC R3 ;(R3)(R3)+1,11,直接寻址

6、方式,操作数直接以存储单元地址的形式给出。 主要对象是内部数据存储器。 注意与立即寻址方式的区别。,ROM,MOV A,70H ;(A)(70H),12,地址大于或等于80H的存储单元为特殊功能寄存器,如地址0F0H表示B寄存器。 对寄存器Rn既可以用其名也可以用其地址,寄存器间接寻址方式,寄存器中是操作数的地址,而不是操作数本身。与寄存器寻址方式的不同。 内部RAM Ri 外部RAM Ri或DPTR i=0/1,MOV A,R0 ;(A)(R0),13,MOV R0, #30H MOV A, R0 MOV R1, A MOV B, R1 MOV R1, P1 MOV A, R0 MOV 10

7、H, #20H MOV 30H, 10H,【例】已知(30H)=40H,(40H)=10H,(10H)=00H,P1=0CAH,请指出寻址方式,并写出执行以下程序段后有关单元的内容。,14,(R0)=30H (A)=40H (R1)=40H (B)=10H (40H)=0CAH (A)=40H (10H)=20H (30H)=00H,变址寻址方式,以程序计数器PC或数据指示器DPTR中的内容为基地址,加上累加器A(变址寄存器)中的内容作为操作数的地址。,MOVC A,A+DPTR ;(A)(A)+(DPTR),15,MOVC A,A+PC;(A)(A)+(PC) JMP A+DPTR,!变址寻

8、址方式只能对程序存储器ROM进行寻址, 是一字节指令。,相对寻址方式,目的地址=转移指令地址+转移指令字节数+rel 通常采用标号(如:LOOP),不需计算。,SJMP 35H ; 835AH ;835AH + 02H + 35H = 8391H,SJMP E7H ; 835AH ;E7H是负数19H的补码 ;835AH + 02H - 19H = 8343H,16,位寻址方式,位寻址范围 内部RAM中的位寻址区(20H-2FH),位地址范围00H-7FH。 专用寄存器中的可寻址位(特殊功能寄存器的单元地址能被8整除可位寻址80H 90H)。 【例】 对于PSW(D0H)的第3位是RS0(D3

9、H)进行清零操作。,直接使用位地址: CLR D3H 位名称表示: CLR RS0 单元地址加位数: CLR D0H.3 专用寄存器名称加位数:CLR PSW.3,17,寻址方式对应的存储空间,18,80C51单片机的指令系统 -111条指令,按功能分: 数据传送类指令 29条 算术运算类指令 24条 逻辑运算类指令 24条 控制转移类指令 17条 位操作类指令 17条 按字节数分:单字节 49条双字节 45条三字节 17条 按周期数分: 单周期 64条 双周期 45条 四周期 2条,19,80C51指令中使用的符号的意义I,20,80C51指令中使用的符号的意义II,另,指行指令对标志位影响

10、的表示符号为:“”有影响,“”无影响,21,内部RAM数据传送类指令,指令格式: 作用:将数据从存储器的某个地址单元传送到另一个地址单元。 内部RAM数据传送指令组 外部数据存储器读/写指令 程序存储器读指令组 数据交换指令组 堆栈操作指令组,MOV ,,22,立即数传送指令,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)d

11、ata ;机器码:0111 1rrr data MOV DPTR,#data16;(DPTR)#data16;机器码:1001 0000 data158 data70,23,内部RAM单元之间的数据传送指令,注意:不影响标志位,MOV direct,Rn ;(direct)(Rn ) ;机器码:1000 1rrr direct MOV Rn,direct ;(Rn)(direct);机器码:1010 1rrr direct MOV direct,Ri ;(direct)(Ri) ;机器码:1000 011i direct MOV Ri,direct ;(Ri)(direct) ;机器码:101

12、0 011i direct MOV direct,direct ;(direct)(direct) ;机器码:1000 0101 direct direct,24,通过累加器A的数据传送指令,MOV A,direct ;(A)(direct) ;机器码:1110 0101 direct MOV A,Ri ;(A)(Ri) ;机器码:1110 011i MOV A,Rn ;(A)(Rn) ;机器码:1110 1rrr MOV direct,A ;(direct)(A) ;机器码:1111 0101 direct MOV Ri,A ;(Ri)(A) 机器码:1111 011i MOV Rn,A ;

13、(Rn)(A) 机器码:1111 1rrr,25,【例】设(R0)=10H,(10H)=15H,(90H)=55H,(B)=33H,(R5)=57H,试分析下列指令执行后各寄存器与存储单元的内容。, MOV A,#30H MOV A,R0 MOV A,90H MOV A,R0 MOV R1,#40H MOV R2,A MOV R3,0F0H,26,;(A)30H ;(A)(R0)=10H ;(A)(90H)=55H ;(A)(R0)=(10H)=15H ;(R1)40H ;(R2)(A)=15H ;(R3)(0F0H)=(B)=33H, MOV 30H,#50H MOV 00H,#10H MO

14、V 0B0H,A MOV PSW,10H MOV 40H,R5 MOV 7FH,R0 MOV R0,#70H MOV R1,A MOV R0,90H MOV DPTR,#2000H,27,;(30H)50H ;(00H)=(R0)10H ;(0B0H)=(P3)(A)=15H ;(PSW)=(0D0H)(10H)=15 ;(40H)(R5)=57 ;(7FH)(R0)=(10H)=15H ;(R0)=(10H)70H ;(R1)=(40H)(A)=15H ;(R0)=(60H)(90H)=55H ; (DPTR)2000H,外部数据存储器读/写指令,(P2)(Ri)表示以(P2)为高8位地址,

15、以(Ri)为低8位地址的片外数据存储器单元。 P2为MCS-51单片机的P2口,其第二功能为传送地址的高8位。 注意:R0、R1作为间址寻址寄存器操作外部RAM时,需预先对改变P2口锁存器的值。,MOVX A,DPTR MOVX DPTR,A MOVX A,Ri ;(A)(P2)(Ri) MOVX Ri,A ;(P2)(Ri)(A),28,【例】 将片外数据存储单元3000H的内容传送到片内数据存储单元30H中。 将寄存器R5中的内容32H传送到片外地址为3010H的数据存储器单元中。, MOV DPTR,#3000H ;(DPTR)3000HMOVX A,DPTR ;A)(DPTR)=(30

16、00H)=21HMOV 30H,A ;(30H)(A)=21H MOV A,R5 ;(A)(R5)=32HMOV DPTR,#3010H ;(DPTR)3010HMOVX DPTR,A ;(DPTR)=(3010H)(A)=32H,29,用Ri传送指令完成上述功能:, MOV P2,#30H ;(P2)30H MOV R0,#00H ;(R0)00H MOVX A,R0 ;(A)(P2)(R0)=(3000H)=21H MOV 30H,A ;(30H)(A)=21H MOV A,R5 ;(A)(R5)=32H MOV P2,#30H ;(P2)30H MOV R1,#10H ;(R1)10H

17、MOVX R1,A ;(P2)(R1)=(3010H)(A)=32H,30,程序存储器读指令组,对程序存储器只能读不能写。 程序存储器读指令,只能通过累加器A进行 :包括内部程序存储器和外部程序存储器,MOVC A,A+DPTR MOVC A,A+PC,31,【例】 查表程序将A低半字节中的BCD数转转换为ASCII码,32,常见指令错误,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

18、 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,或,33,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

19、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,或,34,整字节、半字节、高低半字节交换,在内部RAM与A之间进行半字节交换高低半字节交换,XCH A,Rn ;(A) (Rn) XCH A,direct ;(A) (direct) XCH A,Ri ;(A) (Ri),35,XCHD A,Ri ;(A)3-0 (Ri)3-0,SWAP A

20、; (A)3-0 (A)7-4,机器码:1100 0100,对于Cy AC OV标志没有影响,只有涉及A时,才对奇偶标志位P产生影响。,【例】已知:(R0)=20H,(20H)=75H,(A)=3FH 。执行下列指令后R0、A、20H单元内容为多少?,XCH A,R0 XCHD A,R0 SWAP A,;(A)(R0)=(20H),(A)=75H,(20H)=3FH ;(A)03 (R0)03,(A)=7FH,(20H)=35H ;(A)03 (A)47,(A)=F7H,上述分析可知,运行程序后,(R0)=20H,(A)=F7H,(20H)=35H,36,堆栈操作指令组,进栈、出栈,PUSH

21、direct ;SP(SP)+1,(SP) (direct),POP direct ; direct (SP), SP(SP)-1,37,【例】若(SP)=26H,(A)=37H,(DPTR)=0CFA8H;执行以下指令后,试指出SP、A、DPTR数值.,(SP)=26H,(A)=0A8H,(DPTR)=0CF37H,【例】利用堆栈操作将R3和R4的内容互换(当前寄存器组是第0组),38,PUSH ACC POP ACC,注意,累加器的栈操作指令:,PUSH 03H ;R3内容入栈,03H是R3的地址 PUSH 04H ;R4内容入栈,04H是R4的地址 POP 03H ;弹出R4的内容送入R

22、3中 POP 04H ;弹出R3内容送入R4中,算术运算类指令,加法指令组 带进位加法指令组 带借位减法指令组 加1指令组 减1指令组 十进制调整指令 乘除指令组,39,加法指令组、带进位加法、减法指令组,一个操作数是A,另一个操作数的寻址方式可以是寄存器、直接、间接、立即数,结果送回A。 影响标志位Cy、AC、OV、P。 没有不带借位的减法指令,40,【例】单字节相加。试将数138和156的内容相加,并将结果存储到35H,36H单元中,编写程序并译成机器码,并指出每条指令执行后Cy、AC、OV、P标志各是什么?,MOV A,#156 ;749CH, Cy=0、AC=0、OV=0、P=0 AD

23、D A,#138 ;248AH, Cy=1、AC=1、OV=1、P=1 MOV 35H,A ;F535H Cy、AC、OV、P不变 MOV A,#00H ;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不变,41,【例】双字节相加。假设X =2288H已存入41H与40H单元,而Y=4488H已存入51H与50H单元。编写X+Y的程序,并将X+Y的和存入61H与60H单元中。,MOV A,40H ;(A)(40H)=88H ADD A,50H ;(A)(A)+(50H)=

24、88H+88H=110H MOV 60H,A ;(60H)(A)=10H MOV A,41H ;(A)(41H)=22H ADDC A,51H ;(A)(A)+(51H)=22H+44H=66H MOV 61H,A ;(61H)(A)=66H,分成两个字节加,先加40H和50H,再加41H、51H和Cy。(41H) (40H) + (51H) (50H)Cy+(41H) +(51H) (40H) +(50H),42,【例】单字节相减。将存储单元40H与50H内容相减,减得的差存入60H单元中。,(40H)-(50H)(60H) 由于只有带借位的减法指令,所以做减法之前必须将借位位CY清零。,C

25、LR C ;(CY)0 MOV A,40H ;(A)(40H) SUBB A,50H ;(A)(A)-(50H)-(CY) MOV 60H,A ;(60H)(A),43,【例】双字节相减。X=2288H,Y=4488H,X、Y已分别存入41H、40H、51H与50H中,编写程序,将X-Y存入61H与60H中。,CLR C ;(CY)0 MOV A,40H ;(A)(40H) SUBB A,50H ;(A)(A)-(50H)-(CY) MOV 60H,A ;(60H)(A) MOV A,41H ;(A)(41H) SUBB A,51H ;(A)(A)-(51H)-(CY) MOV 61H,A ;

26、(61H)(A),44,加1、减1指令组,按无符号二进制数进行。 当有A参与时,只影响P,其余不影响。 用来修改操作数的地址,以便使用间接寻址的指令。 没有DPTR减一指令。,45,DPTR减1,对DPTR没有减1操作的指令。要使DPTR完成减1操作,进行双字节减法即可。,DPTR_1: PUSH ACC ;保护ACCCLR C ;Cy=0 准备作减法MOV A,DPL ;取DPTR低8位SUBB A,#1 ;减1MOV DPL,A ;保存结果MOV A,DPH ;DPTR高8位SUBB A,#0 ;减可能产生的借位MOV DPH,A ;DPTR-1POP ACC ;恢复ACCRET,46,双

27、字节求补子程序CPLD。,入口参数(R7R6)=16位数; 出口参数(R7R6)=求补后的16位数。 采用“变反+1”的方法,值得注意的是十六位数变反加1要考虑进位问题,不仅低字节要加1,高字节也要加低字节的进位,故采用ADD A,#1指令,而不能用INC指令,因为INC指令不影响Cy位。,47,CPLD: MOV A,R6CPL AADD A,#1MOV R6,AMOV A,R7CPL AADDC A,#0MOV R7,ARET,十进制调整指令,专门用于实现BCD码加法的调整指令,对累加器A作BCD码加法后,进行“加6调整”,调整方法: 若(A)039或(AC)=1,则(A)03(A)03+

28、6。若(A)479或(CY)=1,则(A)47(A)47+6。,65 H + 19 H7E H + 06 H84 H,48,DA A,56 H + 91 HE7 H + 60 H47 H,89 H + 99 H1 22 H + 66 H1 88 H,1、将十进制数换算成二进制数,再用多字节相加的方法。123456=1E240H,567890=8AA52H 2、采用编码的方法,将十进制数用BCD码表示,123456的BCD码是123456H,567890的BCD码是567890H。然后用多字节加法,最后再把结果调整为十进制编码。,【例】编程实现123456+567890。结果存于30H、31H、

29、32H中,高位存于大地址,低位存于小地址。,49,123456 H + 567890 H68ACE6 H + 006660 H691346 H,1E240 H + 8AA52HA8C92H,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,50,MOV A,#40H ADD A,#52H MOV 30H,A MOV A,#E2H ADDC A,#AAH MOV 31H,A MOV A,#01H ADDC A,#08H M

30、OV 32H,A,1E240 H + 8AA52HA8C92H,123456 H + 567890 H68ACE6 H + 006660 H691346 H,乘除指令组,A、B中为两个无符号数,乘、除指令都为一字节指令,需四个机器周期。,Cy 总是被清0; OV 若乘积大于255,则OV=0,表明乘机在B和A中;若乘机小于或等于255,则OV=1,表明乘积在A中,而B为0.,Cy 总是被清0; OV 除数为0,则OV=1,表明除法无意义;否则OV=0.,51,若被乘数为16位无符号数,乘数为8位无符号数,编制乘法程序。被乘数的地址为M(低8位)和M+1(高8位),乘数地址为N,积存入R2、R3

31、和R4三个寄存器中。,【例】,2)再用高8位乘以乘数,所得积的低8位应与R3中的暂存的内容相加,存入R3的结果的一部分,而积的高8位还要与进位Cy相加才能存入R2,作为积的高8位。最后的积存于R2、R3、R4,共为24位二进制数。,【分析思路】,1)首先由低8位与8位乘数相乘,积的低8位存入R4,积的高8位暂存于R3。,52,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,53,逻辑运

32、算及移位类指令,逻辑“与”、 “或”、 “异或”运算指令组 累加器清0和取反指令组 移位指令组,54,逻辑“与”“或”“异或”运算指令组,逻辑运算都是按位进行的. 逻辑运算指令,对Cy AC OV标志都没有影响,只在涉及到累加器A时,才会对奇偶标志P产生影响。 用来修改一个输出口时,作为原始口数据的值将从输出口数据锁存器(P0-P3)读入,而不是读引脚状态。,55,55,【例】将累加器A的低4位送到P1口的低4位,而P1口的高4位保持不变。,解题思路:,这种操作不便用简单的MOV指令来实现,而可以借助与、或逻辑运算。,ANL A,#0FH;屏蔽A的高4位为0,保留低4位 ANL P1,#0F0

33、H屏蔽P1口的低4位为0,保留高4位 ORL P1,A;完成所需操作,56,【例】将内部RAM的20H单元中的8位无符号数转换为3位BCD码,并将结果存放在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。,57

34、,FIRST DATA 22HSECOND DATA 21HORG 1000H HBCD:MOV A,20H ;取数MOV B,#100 ;B除数100DIV AB ;除100MOV FIRST,A ;百位BCDMOV A,BMOV B,#10 ;B除数10DIV AB ;除10SWAP A ;十位数送高位ORL A,B ;A为(十位、个位)BCDMOV SECOND,A;存十位、个位数SJMP $END,58,累加器清0和取反指令组,80C51中只有对A的取反指令,没有求补指令。若要进行求补操作,可按“求反加1”来进行。,机器码:1111 0100,机器码:1110 0100,【例】设(A)

35、=10101010B,执行指令CPL A之后,(A)=01010101B,CLR A(清0) CPL A(取反),59,59,【例】56的压缩BCD码表示为56H,正常BCD码为05H和06H。将片内RAM中20H存放的压缩BCD码变成正常BCD码,并存放于21H、22H中,高位存于大地址,低位存于小地址。,MOV A,20H;压缩BCD码送A中 ANL A,#0F0H;屏蔽低4位为0,保留高4位 SWAP A;交换高低4位,则原来的低4位0移到高位,原来的高4位移到低位 MOV 22H,A;保存这个结果到22H MOV A,20H;将原来的BCD压缩码再放入A中 ANL A,#0FH;屏蔽高

36、4位为0,保留低4位 MOV 21H,A;保存结果到21H单元,60,【例】在30H和31H单元有两个BCD码,将它们压缩到30H中,以节省内存空间。,MOV A,31H ;A(31H) SWAP A ;一个BCD码移到高4位,低4位为0 ORL A,30H ;另一个BCD码合并到低4位 MOV 30H,A ;送回30H,61,【例】编写程序,把A中的高低半字节分别转换为ASCII码,并高位存入R1,低位存入R2。如:若(A)=4AH,则(R1)=34H,(R2)=41H。,RESULT EQU 20hORG 0SJMP STARTORG 0030H START:MOV A,#1AHMOV D

37、PTR,#ASCIITABmov b,a ;暂存Aswap aanl a,#0fh ;取高四位movc a,a+dptr ;查ASCII表mov Result,a,mov a,b ;恢复Aanl a,#0fh ;取低四位movc a,a+dptr ;查ASCII表mov Result+1,asjmp $ASCIITAB: ;定义数字对应的ASCII表DB 0123456789ABCDEFEND,62,移位指令组,指令: RL A ; RLC A ; RR A ; RRC A ;,A,机器码: 0010 0011 0011 0011 0000 0011 0001 0011,图示:,移位只能对于A

38、进行,63,【例】 用循环移位指令编写程序实现下列要求。 (30H) 2(41H,40H),注:(30H)中是无符号数。,汇编程序如下:,MOV A,30H ;将无符号数x由30H单元传送到累加器A中 CLR C ;进位位CY清0 RLC A ;将累加器A与CY左移一位,即进行A2的操作 MOV 40H,A ;将乘积的低8位送入40H单元 ;累加器高位送入41H单元 CLR A RLC A ;累加器A与CY左移一位,将CY移入A的最低位A0中 MOV 41H,A ;将乘积的高位送入41H单元,64,利用为置位指令,可以完成16位数的循环移位。,【例】16位二进制数存于30H和31H单元,低8位

39、先存,试编写完成一次循环移位的程序。,MOV A,31H ;取出高8位到A MOV C,ACC.7 ;最高位送Cy MOV A,30H RLC A ;低8位移位 MOV 30H,A ;送回低位 MOV A,31H RLC A ;高8位移位 MOV 31H,A ;送回,65,控制转移类指令,程序的顺序执行由PC自动加1实现,要改变程序的执行顺序进行分支转向,应通过强迫修改PC值的方法来实现,这就是控制转移指令的基本功能。 转移共分为两类: 无条件转移 有条件转移。,如何指令系统都有控制转移指令,有了控制转移指令,程序就有了思考判断能力。,66,无条件长转移指令,LJMP addr16 PCadd

40、r150 长转移指令是3字节指令。指令执行后把16位地址送PC,从而实现程序转移。由于转移范围大,可达64KB,故称为“长转移”。,机器码:0000 0010 a15a14a13a12 a11a10a9 a8 a7a6a5a4 a3a2a1a0,67,无条件绝对转移 AJMP addr11,PC(PC)+2 PC=PC1511a10a9a8a7a6a5a4a3a2a1a0 以指令提供的11位地址(addr11)去替换PC的低11位内容,形成新的PC值。 请注意,被替换的PC值是本条指令地址加2以后的PC,即下一条指令的PC值。 绝对转移指令所能转移的最大范围是210=2KB。 【例】KWR:A

41、JMP 00100000000B 如果KWR=1030H,则执行该条指令后,程序转移到1100H 如果KWR=3030H时,执行该条指令后,程序转移到3100H。,机器码:a10a9a80 0001 a7a6a5a4 a3a2a1a0,68,无条件短转移,SJMP rel PC(PC)+2, PC(PC)+rel 其中,Rel是偏移量,是二进制补码数,所能实现的程序转移是双向的。编写汇编源程序时,只需要相对转移指令中直接写上要转向的地址标号就可以了。 在80C51中没有暂停和程序结束指令,但在使用时又需要程序等待或程序结束。 HERE:SJMP HERE 或 SJMP $ 注:($代表PC的当

42、前值) KRD:SJMP 21H 如果KRD标号值为0100H,则跳转的目标地址是0123H 0100H+2=0102H 0102H+21H=0123H,机器码:1000 0000 rel,69,变址寻址转移指令,JMP A+DPTR PC(A)+(DPTR) 以DPTR为基址,以A为变址。转移的目的地址由A的内容和DPTR的内容之和来确定,即目的地址=(A)+(DPTR)。 只要把DPTR的值固定,而给A赋以不同的值,即可实现程序的多分支转移。,机器码:0111 0011,70,【例】如果累加器A中存放待处理命令编号(0-7),程序存储器中存放着标号为PMTB的转移表,则执行下面的程序,将根

43、据A内命令编号转向相应的命令处理程序:,PM:MOV R1,A;(A)*3RL AADD A,R1MOV DPTR,#PWTB;转移表首址DPTRJMP A+DPTRPMTB:LJMP PM0;转向命令0处理入口,LJMP PM1;转向命令1处理口 LJMP PM2;转向命令2处理口 LJMP PM3;转向命令3处理口 LJMP PM4;转向命令4处理口 LJMP PM5;转向命令5处理口 LJMP PM6;转向命令6处理口 LJMP PM7;转向命令7处理口,71,条件转移指令组,所谓条件转移,就是设有条件的程序转移。 执行条件转移指令时,若指令中设定的条件满足,则进行程序转移,否则程序顺序

44、执行。 累加器判零转移指令 数值比较转移指令 减1条件转移指令,72,累加器判零转移指令,JZ rel ;当(A)=0时转移,PC(PC)+2,PC(PC)+relJNZ rel ;当(A)0时转移,PC(PC)+2,PC(PC)+rel,机器码:0110 0000 rel,机器码:0111 0000 rel,73,数值比较转移指令,CJNE A,#data,rel; CJNE A,direct,rel; CJNE Ri,#data,rel; CJNE Rn,#data,rel; 当第一操作数第二操作数时不转,(PC)(PC)+3;否则转移,(PC)(PC)+3+rel 本指令还影响Cy,当第

45、一操作数第二操作数时,Cy=0,因此可实现程序的三分支。 数值比较转移指令是80C1指令系统中仅有的4条3操作数指令。,74,首页,CJNE A,30H,NOTEQ ;(A)(30H),转 EQ: ;(A)(30H) NOTEQ: JC LITTEL ;C=1,(A)(30H),转;否则C=0,(A)(30H),顺序执行 LITTEL:,例执行下面程序后将根据A的内容大于30H、等于30H、小于30H三种情况作不同的处理,75,减1条件转移指令,DJNZ Rn, rel DJNZ direct, rel 寄存器或直接寻址单元内容减1时,若所得结果为0,则程序顺序执行;若结果不为0,则程序转移。

46、 这组指令允许程序员把内部RAM单元用作程序循环计算器。,76,【例】通过延时程序在P1.1输出一个方波脉冲,可以通过修改30H和31H初值,改变延时时间,从而改变方波频率。,START:SETB P1.1 ;1P1.1 DL: MOV 30H,#03H ;03H30H,置初值 DL0: MOV 31H,#0F0H ;0F0H31H,置初值 DL1: DJNZ 31H,DL1 ;(31H)-131H,(31H)不为0重复执行DJNZ 30H,DL0 ;(30H)-1(30H),(30H)不为0转DL0CPL P1.1 ;P1.1求反AJMP DL ;转DL,77,子程序调用与返回指令组,ACA

47、LL、LCALL、RET 、RETI 调用指令在主程序中使用,而返回指令则是子程序的最后一条指令。 1)绝对调用ACALL addr11 该指令把加2以后的PC值自动送堆栈保存起来,待子程序返回时再出栈送回PC。子程序调用范围是2KB。 PC(PC)+2, SP(SP)+1,(SP)(PC70) SP(SP)+1,(SP)(PC158) PC=PC1511a10a9a0,机器码2字节格式:,78,若(SP)=60H,标号MA值为0123H,子程序SUB位于0345H,则执行指令 MA:ACALL SUB 后, (SP)= ,内部RAM中堆栈区内(61H)= ,(62H)= ,(PC)= 。,(SP)=62H,(61H)=25H, (62H)=01H,(PC)=0345H,79,长调调用LCALL addr16,该指令把加3以后的PC值自动送堆栈保存起来,待子程序返回时再出栈送回PC。 子程序调用范围是64KB。,80,【例】若(SP)=60H,标号STRT值为0100H,标号DIR值为8100H,则执行指令 STRT:LCALL DIR 后,(SP)=,(61H)=,(62H)=,(PC)=,(SP)=62H,(61H)=03H,(62H)=01H,(PC)=8100H,返回指令,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报