[工学]第三章 指令系统.ppt_第1页
[工学]第三章 指令系统.ppt_第2页
[工学]第三章 指令系统.ppt_第3页
[工学]第三章 指令系统.ppt_第4页
[工学]第三章 指令系统.ppt_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

第3章 指令系统,3.1单片机指令系统概述,指令是指挥计算机工作的命令,一种计算机所能执行的指令集合称之为该种计算机的指令系统。,3.1.1汇编语言,3.1.2 指令格式,指令的表示形式称指令格式。编写程序时必须严格按指令格式书写。 MCS-51指令由操作码和操作数组成。汇编语言指令格式如下: 操作码助记符 操作数1,操作数2,操作数3,1.操作码助记符 2.操作数,3.2 寻址方式,指令中,操作数可能是具体的数据,也可能是具体的存放数据的地址或符号,无论何种情况,都可由操作数取得参与指令运行的二进制数据。这个过程叫作寻址。,3.2.1 立即寻址方式,所谓立即寻址就是操作数在指令中直接给出。立即寻址方式的操作数称立即数,立即数只能是源操作数,不能作为目的操作数。立即数有8位立即数和16位立即数。使用时在立即数前加“#”标志。,例:MOV A, #20H MOV DPTR, #20D8H,3.2.2 直接寻址方式,直接寻址就是操作数直接以单元地址的形式给出。直接地址以存贮单元形式出现。 例如指令: MOV A, 20H,3.2.3 寄存器寻址方式,寄存器寻址就是操作数在寄存器中。 例如指令:MOV A, R2,3.2.4 寄存器间接寻址方式,寄存器间接寻址使用的寄存器为Ri和DPTR,使用时寄存器前面加“标志。 MOV A,Ri ;MOVX A,DPTR 例如:(R1)80H、(80H)=33H,则执行指令MOV A,Ri后,累加器A的内容为33H而不是80H。,寄存器间接寻址是以寄存器中的内容为地址取得操作数的方法。和寄存器寻址相比,寄存器寻址时,寄存器中存放的是操作数,而寄存器间接寻址中时,寄存器中存放的是操作数的地址。,3.2.5 基址加变址寻址方式,基址加变址寻址就是以DPTR或PC为基址寄存器,以A为变址寄存器,以两者内容相加形成16位地址作为操作数地址。 例如指令: MOVC A,A+DPTR,3.2.6 位寻址方式,位寻址方式就是以位为操作数。MCS-51单片机有相当强的位处理功能,可以对位进行直接操作。 例如指令: MOV C, 4AH,位寻址范围: 1)内部RAM的位寻址区 2)可供位寻址的11个专用寄存器,3.2.7 相对寻址方式,相对寻址是在相对转移指令中,根据地址相对当前 PC的偏移量得到操作数的方式。如: JZ rel,偏移量rel是一带符号8位二进数的补码数,范围为-128+127。实际书写程序时往往先用地址标号代替,在汇编为机器指令时再计算出来。,例3-1 指出下列每一条指令的寻址方式。 MOV 2FH,#40H MOV A,R0 MOV DPTR,#2020H MOV 45H,P0 MOV A,R1 MOVC A,A+PC JC LOOP,中的源操作数为立即寻址,目的操作数为直接寻址。 中的源操作数为寄存器间接寻址,目的操作数为寄存器寻址。 中的源操作数为16位立即寻址,目的操作数为寄存器寻址。 中的源操作数和目的操作数都是直接寻址。 中的源操作数和目的操作数都为寄存器寻址。 中的源操作数为基址加变址寻址,目的操作数为寄存器寻址。 中的操作数为相对寻址。,例3-2 判断下列指令是否正确,若不正确请指出错误: MOV A ,DPTR MOV DPTR,#03H MOV #80H,R7 MOV B,C,解不正确。A是8位寄存器,DPTR为16位寄存器,不匹配。 正确。 不正确。#80H为立即数,不能作为目的地址。 不正确。B为8位字节寄存器,C为1位位累加器,不匹配。,3.3 数据传送指令,1. 通用传送指令MOV,指令格式:MOV , 功能:把源操作数所表示的数据传送到目的地址指定的存贮单元之中,而不改变源操作数。即该指令是“复制”,不是“搬家”。,3.3.1内部RAM数据传送指令,2) 以Rn为目的地址的指令 MOV Rn,A ;Rn (A) MOV Rn,direct ;Rn (direct) MOV Rn,#data ;Rn data,1) 以累加器A为目的地址的指令 MOV A,Rn ;A (Rn) MOV A,direct ;A (direct) MOV A,Ri ;A (Ri) MOV A,#data ;A data,4) 以寄存器间接地址为目的的地址的指令 MOV Ri,A ;(Ri)(A) MOV Ri,direct ;(Ri)(direct) MOV Ri,#data ;(Ri)data,3) 以直接地址为目的地址的指令 MOV direct,A ;direct (A) MOV direct,Rn ;direct (Rn) MOV direct,direct ;direct (direct) MOV direct ,Ri ;direct (Ri) MOV direct ,#data ;direct data,5)16位数据传送指令 MOV DPTR,#data16 ;DPTR data16 ;DPL data70 ;DPH data158,例3-3 设RAM 40H单元的内容为80H,80H单元内容为47H,P1口的输入状态为0FFH,试判断下列程序执行结果。 MOV R0, #40H MOV A, R0 MOV R1, A MOV B, R1 MOV R1,P1 MOV P2, P1,解执行结果为:(A)80H, (B)47H, (R0)40H, (R1)80H, (P1)0FFH, (P2)0FFH, (80H)0FFH。,; R0 40H ; A ( 40H)80H ; R1 80H ; B ( 80H)47H ;( 80H) 0FFH ; P2 0FFH,1) 字节交换指令XCH XCH A,Rn ;(A) (Rn) XCH A,direct ;(A) (direct) XCH A,Ri ;(A)( (Ri),2. 数据交换指令,例:设(A)=08H,(R7)=0DCH, 执行指令 XCH A, R7 结果为:(A)=0DCH, (R7)=08H,功能:将累加器A中内容与源操作数互换。,例:(A)=80H,(R0)=30H,(30H)=0FH,执行指令 XCHD A, R 结果为:(A)=8FH, (30H)=00H,2) 半字节交换XCHD,XCHD A, Ri ;(A)低4位( (Ri)低4位 功能:累加器A中内容与源操作数低4位交换,高4位不变。,3) 累加器高低数字节交换指令SWAP A SWAP A ;(A)低4位 (A)高4位 功能:A中高4位与低4位互换。,例:(A)=80H ,执行SWAP A结果为:(A)08H.,解 XCH A,20H SWAP A MOV R1,21H XCHD A,R1 SWAP A XCH A,20H,例3-4试用交换指令使片内20H单元的高4位与21H 单元的低4位交换。,数据写入堆栈称入栈,数据从堆栈中读出称出栈。,3. 栈操作指令,PUSH direct ;SP (SP)+1, (SP) (direct) 功能:将堆栈指针加1后,片内RAM单元内容送进栈顶单元,原RAM单元内容不变。 说明: PUSH指令常用于保护CPU现场。 栈操作是字节指令,每次只能压入或弹出1个字节的内容。 如PUSH DPTR是错误的,但可以用以下两条指令完成DPTR的入栈。 PUSH DPH PUSH DPL,1) 入栈指令PUSH,例:设(A)=30H,(B)=80H ,(SP)=50H .则执行指令: PUSH A PUSH B,结果为:(51H)=30H,(52H)=80H,(SP)=52H,POP direct ; direct (SP), SP (SP)-1 功能:将(SP)内容传送给片内RAM单元,SP内容减1。 说明: 栈操作要注意先入后出的原则。 POP指令常用于恢复CPU现场。,2)出栈指令POP,例3-5 试用栈操作指令完成P0和P1内容的互换。 解 PUSH P0 PUSH P1 POP P0 POP P1,3.3.2 片外数据存贮器与累加器A之间的 传送指令,MOVX A, DPTR ;A (DPTR) MOVX A, Ri ;A (Ri) MOVX DPTR, A ;(DPTR) (A) MOVX Ri , A ;(Ri) (A),说明: 片外数据存贮单元与片内RAM之间的数据传送以及片外数据存贮单元之间的数据传送不能直接进行,必须通过累加器A中转。MOVX 20H, 2000H及MOVX 3000H, 2000H等都是错误的。 寻址方式只能是寄存器间接寻址。参与间接寻址的寄存器只有Ri和DPTR两种(3个)。 DPTR为16位寄数器,寻址范围为000H0FFFFH共64KB空间。而Ri是8位寄数器,只能寻址000FFH低256单元。,解 MOV DPTR ,#2000H MOVX A,DPTR MOV 20H, A MOV DPTR ,#2000H MOVX A,DPTR MOV R0,#0FAH MOVX R0,A,例3-6 将片外数据存贮器2000H单元的内容传送到片内的20H单元中;将片外数据存贮器2000H单元的内容传送到片外0FAH单元。,3.3.3 程序存贮器向累加器A传送指令,MOVC A,A+PC ;A (A)+(PC) MOVC A,A+DPTR ;A (A)+(DPTR),说明: 程序存贮器只能读出,不能写入,所以其数据传送都是单 向的,即从程序存贮器读出数据,且只能向累加器A传送。 ROM片内、片外是统一编址,该指令既可访问片内,又可 访问片外程序存贮器。 该类指令主要用于查表,又称查表指令。应用时,一般以 PC或DPTR确定表格的首址,查表时,根据A中不同的内 容查找到表格中的相应项,故此时称PC或DPTR为基址寄 存器,A为变址寄存器,寻址方式为基址加变址寻址。 使用DPTR作基址寄存器比较灵活,且不易出错。建议尽 可能使用MOVC A,A+DPTR指令。,解法一 以DPTR为基址寄存器,平方表首址可灵活安排在适当的位置如2000H,即平方表的内容从2000H单元放起。 程序如下: ORG 1800H MOV DPTR ,#2000H MOV A,20H MOVC A,A+DPTR MOV 21H,A ORG 2000H DB 00H, 01H , 04H , 10H, 19H , 24H DB 31H, 40H , 51H ,64H,,例3-7 以查表方式求出片内RAM中20H单元数的平方值,存入片内21H单元中。,ORG 1000H 1000 MOV A,20H 1001 ADD A,#03H 1003 MOVC A,A+PC 1004 MOV 21H,A 1006 RET 1007 DB 00H, 01H, 04H ,解法二 以PC为基址寄存器,此时表格须紧跟程序之后,且要计算好表格首址位置。,XCH A,20H XCH A,30H XCH A,20H,例3-8 改正下列指令中的错误,完成其功能: MOV A,2000H ;片外RAM 2000H单元内容送入A。 MOVX 20H,2000H ;片外RAM 2000H单元内容送入片内20H单元。 MOVC A,2000H ;将ROM 2000H单元内容送入A。 MOVX A,A+DPTR ;以查表方式将片外RAM单元的内容送入A。 XCH 40H,30H ;交换片内RAM 30H和40H单元的内容. PUSH AB ;将寄存器对AB的内容压入堆栈。,解 MOV DPTR,#2000H MOVX A,DPTR, MOV DPTR,#2000H MOVX A,DPTR MOV 20H,A, MOV DPTR,#2000H MOV A,#0 MOVC A,A+DPTR,无法以查表方式将片外RAM 存贮单元的内容送入A。,PUSH A PUSH B,3.4 算术运算类指令,1.不带进位加 法指令ADD,ADD A,Rn ;A (A)+(Rn) ADD A,direct ;A (A)+(direct) ADD A,#data ;A (A)+ data ADD A,Ri ;A (A)+(Ri),3.4.1 加法指令,功能:ADD指令把源操作数与累加器A内容相加,结果存在累加器中。该操作不改变源操作数,影响PSW中的C、AC、OV和P位。 说明:ADD指令的目的操作数只能是累加器A,且只有以上4种形式。如ADD B,40H或ADD A,203AH都是不存在,非法的。 指令中,参加运算的两个8位二进制数,即可看作是8位无符号数(0255),也可以看作是7位带符号数的补码数(-128+127)。,例3-9 试编程计算40H和41H两单元字节数的和,并存放在42H单元。若(40H)=0B3H,(41H)=79H,给出计算结果并判断PSW受影响的位。,解程序如下: MOV A,40H ADD A,41H MOV 42H,A,若(40H)=0B3H,(41H)=79H,则运算结果:若是无符号数,和为12CH; 若是有符号数,和为+2CH。 (42H)=2CH, (C)=1,(AC)=0,(OV)=0,(P)=1。,2.带进位加法指令ADCC,ADDC A,Rn ;A (A)+(Rn)+(C) ADDC A,direct ;A (A)+( direct)+(C) ADDC A,#data ;A (A)+data+(C) ADDC A,Ri ;A (A)+(Ri)+(C),功能:该操作与ADD类似,只是PSW中的进位位C参与运算。带进位加法指令通常用于多字节或多个数加法运算。,解当(C)0时,两指令运行结果一样,为(A) 0A4H。 当(C)1时,两指令运行的结果不同,相差1。 即ADD A,30H的结果为(A)0A4H,而ADDC A,30H 的结果是(A)0A5H。 显然,ADD指令与C值无关,而ADDC的运行结果与C值有关。,例3-10已知(A)=26H,(30H)=7EH,比较在(C)0、 (C)1两种情况下执行 ADD A ,30H 和 ADDC A ,30H指令的结果。,解 MOV A,30H ADD A,40H ;低字节相加 MOV 50H,A MOV A,31H ADDC A,41H ;高字节相加 MOV 51H,A ADDC A,#00H ;取高相加产生的进位 MOV 52H,A 说明:多字节数求和,从低字节开始,最低字节相加用 ADD指令,高字节相加用ADDC指令。 N字节数相加,结果可能为N+1字节数。 为单独取得进位的值,可参考例311。,例3-11 两字节无符号数相加,被加数放在内部RAM30H,31H单元(低位放在前),加数放在内部RAM40H、41H单元。计算两数的和,放在50H52H单元中。,3. 增量指令INC,INC A ; A (A)+1 INC Rn ; Rn (Rn)+1 INC direct ;direct (direct)+1 INC Ri ;(R)i ( (Ri)+1 INC DPTR ; DPTR (DPTR)+1,功能:对A,Rn,内部RAM单元及数据指针DPTR进行加1操作,除INC A影响P外,不影响任何标志位。 说明:若原为0FFH,执行该指令后,将变为00H,但不影响进位位C。,其结果为: (A)=00H, (R2)=10H, (R0)=40H,(40H)=01H, (DPTR)=1B00H, PSW中,(P)=0,C及其它位不变。,例3-12(A)=0FFH, (R2)=0FH, (R0)=40H, (40H)=00H, (DPTR)=1AFFH执行下列指令: INC A INC R2 INC R0 INC DPTR,4.十进制调整指令DA A,DA A,例3-13 在20H、21H中分别存放压缩BCD码55和72,试将两数相加,并计算出结果。,解 MOV A,20H ADD A,21H DA A, 结果 (A)=27, C=1 如果不使用DA A指令,则结果为0C7H,是错误的。,例3-14 设两个4位BCD码分别存放在30H(十位、个位)和31H(百位、千位)、40H(十位、个位)和41H(百位、千位)。试编程求这两个数的和,结果存放在30H、31H、32H中。,解程序如下: MOV R0,#30H MOV R1,#40H MOV A,R0 ;取十位、个位 ADD A,R1 ;两数十位、个位相加 DA A ;调整为BCD码 MOV R0,A ;存十位、个位 INC R0 INC R1 MOV A,R0 ;取千位、百位 ADDC A,R1 ;两数千位、百位和进位位相加 DA A ;调整为BCD码 MOV R0,A ;存千位、百位 MOV A,#0 ADDC A,#0 INC R0 MOV R0,A ;存万位,3.4.2 减法指令,1.带进位减法指令SUBB,SUBB A,Rn ;A (A) (Rn)(C) SUBB A,direct ;A (A) (direct)(C) SUBB A,Ri ;A (A) (Ri)(C) SUBB A,#data ;A (A) data (C),功能:指令功能是以A中数为被减数,减去操作数,再减去进位,差存在A中。影响PSW中的C,AC,OV,和P位。 说明:MCS-51指令系统中,无不带进位(实为借位)的减法指令。若进行不带借的减法运算,要在运算前使用ADD A,#00H或CLR C等指令将进位标志清0。 减法指令中,无BCD码调整。,例3-15 两个双字节数相减,被减数放在30H,31H,减数放在40H,41H中,差放入50H、51H。,解 ADD A,#00H ;将进位位清0 MOV A,30H SUBB A,40H ;低字节相减 MOV 50H,A MOV A,31H SUBB A,41H ;高字节相减 MOV 51H,A 说明:多字节相减,从低字节开始,最低字节相减时,应先将进位位清0。,2. 减1指令DEC,DEC A ;A (A)-1 DEC Rn ;Rn (Rn)-1 DEC direct ;direct (direct)-1 DEC Ri ;(Ri) (Ri)-1,功能:减1运算 说明:与INC命令类似,但无DPTR减1指令。 若原为00H,执行该指令后,将变为0FFH 。 例如(A)=10H, (R5)=00H, (30H)=2FH, (R0)=40H, (40H)=0FFH。 则执行以下指令: DEC A; DEC R5; DEC 30H; DEC R0 结果为:(A)0FH, (R5)=0FFH, (30H)=2EH, (40H)=0FEH, (P)=0,3.4.3 乘法指令MUL,MUL AB,功能:累加器A和寄存器B中的两个无符号8位数相乘,所得16位乘积的低8位放在A中,高8位入在B中。 说明:乘法指令影响PSW的状态。执行MUL指令后,C被清0,OV与结果有关,若OV=0,表示乘积小于255(0FFH),只在A中,(B)0;若OV=1,则乘积大于255,(B)0。 例如:(A)=20H, (B)=0A0H, 执行指令 MUL AB 结果:(A)00H,(B)=14H,即积为1400H, (C)=0,(OV)=1,3.4.4 除法指令DIV,DIV AB,功能:两8位无符号数相除,被除数置于累加器A中,除数置于寄存器B中。指令执行后,商存于A中,余数存于B中。 说明:该指令执行后,C清0,若除数为0(即寄存器B内数据为0),(OV)=1,表明除0没有意义;若除数不为0,则(OV)=0。 例:(A)=0FBH,(B)=12H ,则DIV AB 结果:(A)=0DH,(B)=11H,(C)=0,(OV)=0,例3-16 编程实现下列运算:FD1D2+D3/D4 ,其中D1、D2、D3、D4都为非0的8位二进制无符号数。,解 MOV A,#D1 MOV B, #D2 MUL AB ;计算D1D2 MOV R2,A ;暂存D1D2的结果 MOV R3,B MOV A,#D3 MOV B,#D4 DIV AB ;计算D3/D4 ADD A,R2 ;乘积的低位与商相加 MOV R2,A ;存F低位 MOV A,R3 ADDC A,#0 ;乘积的高位与低位和的进位相加 MOV R3,A ;存F高位在R3中,3.5 逻辑运算及移位指令,1.逻辑与指令ANL,ANL A,Rn ;A (A)(Rn) ANL A,direct ;A (A)(direct) ANL A,Ri ;A (A)(Ri) ANL A,#data ;A (A)data ANL direct,A ;direct (A)(direct) ANL direct,#data ;direct (direct)data,3.5.1 逻辑运算指令,说明:逻辑运算是按位进行的,只影响标志位P。 该指令用于屏蔽某些位。,例3-17 将R1中的低4位清0,高4位不变。 解 MOV A,#11110000B ANL A, R1 MOV R1,A,结果为:(A)=62H,例:设(A)=7AH, (20H )=0E6H,执行指令 ANL A, 20H,2.逻辑或指令ORL,ORL A,Rn ;A (A)(Rn) ORL A,direct ;A (A) (direct) ORL A,Ri ;A (A) (Ri) ORL A,#data ;A (A) data ORL direct, A ;direct (A) (direct) ORL direct, #data ;direct (direct) data,例3-18 将片外RAM 2000H单元的0、1位置1,2、3位清0,其它位不变。 解 MOV DPTR, # 2000H MOVX A,DPTR ORL A,#00000011B ANL A,#11110011B MOV DPTR,A,3.逻辑异或指令XRL,XRL A,Rn ;A (A) (Rn) XRL A,direct ;A (A) (direct) XRL A,Ri ;A (A) (Ri) XRL A,#data ;A (A) data XRL direct,A, ;direct (direct) (A) XRL direct,#data ;direct (direct) data,说明:若与0进行异或运算,结果保持不变; 若与1进行异或运算,结果取反; 自身异或等效于清0。 例 XRL A, A 结果为:(A)0,例3-19 将20H单元内容1、3、5、7位保持不变,0、2、4、6位取反。,解XRL 20H, #01010101B 若 (20H)=11110110 则执行指令:,结果为(20H)=10100011B,4.累加器清0指令 CLR,CLR A,CPL A,5.累加器取反指令 CPL,例如(A)0E6H执行CPL A ,结果为:(A)=19H 说明:1)取反即为逻辑非运算。 2)MCS-51单片机没有求补指令,若对累加器A中数求补,则程序如下: CPL A INC A,3.5.2 移位指令,循环左移 RL A ;An+1An, A0 A7 循环右移 RR A ;An An+1,A7 A0 进位循环左移 RLC A ;An+1 An ,A0 C,C A7 带进位循环右移 RRC A ;An An+1,A7 C,C A0,例3-21 分析下列程序段实现的功能: MOV A, direct RL A MOV R1,A RL A RL A ADD A,R1 MOV direct,A,解各指令实现的功能依次如程序右边注译,可知该程序实现的功能是将存贮单元的数乘以10。,;取数设为D0 ;D02 ;(R1)2D0 ;2D02 ;4D02 ;8D0+2D0 ;存数10D0,例3-20 将20H单元存放的无符号数除2。 解 ADD A,#0 ;C清零 MOV A,20H RRC A MOV 20H,A,3.6 位操作指令,MOV C,bit ;C (bit) MOV bit,C ;bit (C),例3-22 将20H位的内容送至50H位,并要求不改变C的状态。 解 MOV 10H,C ;保护C内容 MOV C,20H MOV 50H,C MOV C,10H ;恢复C内容,3.6.1 位传送指令MOV,说明:多数位操作指令由C参与,C称位累加器。 位操作指令寻址方式为位寻址。,3.6.2 位置位/复位指令,1. 位置位(置1)命令SETB SETB C ;C 1 SETB bit ;bit 1 2. 位复位(清0)命令 CLR C ;C 0 CLR bit ;bit 0,说明:位置位/复位命令可以方便改变位空间的单个位 的内容,十分灵活。 例如许多运算要先将C清零,我们用以用ADD A,#0来清零,也可以直接用CLR C指令。,3.6.3 位运算指令,1. 逻辑与指令ANL ANL C,bit ;C (C)(bit) ANL C,/bit ;C (C)(/bit) 2. 逻辑或指令ORL ORL C,bit ;C (C)(bit) ORL C,/bit ;C (C)(/bit) 3. 逻辑非(求反)指令CPL CPL bit ; bit (/bit),解 MOV C,bit1 ANL C,/bit2 ;C (bit1).(/bit2) MOV bit0,C MOV C,bit2 ANL C,/bit1 ;C (/bit1).(bit2) ORL C,bit0 MOV bit0,C,例3-23 设bit0,bit1,bit2为三个位地址,试编程实现异或运算 bit0=bit1bit2=(bit1) (/bit2)+(/bit1) (bit2),程序如下: MOV C, P0.1 ANL C, / P0.0 ORL C, / P0.2 MOV P1.7,C,例3-24 编程实现图3-9的逻辑功能。,3.7 控制转移类指令,程序的顺序执行是由PC自动加1实现的,要改变程序的执行顺序,实现分支转向,必须通过强迫改变PC值的方法来实现,这就是控制转移类指令的基本功能。控制转移类指令可以控制程序根据不同情况执行不同的程序段,令单片机应用系统做出相应的动作。控制转移类指令使单片机具有“智能化”功能。 控制类指令的掌握使用较复杂,包括无条件转移指令、条件转移指令及子程序调用返回指令。,3.7.1 无条件转移指令,1.长转移指令LJMP LJMP addr16 ;PC addr16 功能:指令执行后将16位地址(addr16)传送给PC,从而 实现程序转移到新的地址开始运行。 说明:该指令可实现64KB范围的任意转移。,2. 短转移指令SJMP,SJMP rel ;PC (PC)+2+rel,功能:执行指令后,程序从当前位置向前或向后跳转rel个 单元运行。 说明:该指令中寻址方式称相对寻址。 rel为8位带符号补码数,因此所能实现的程序转移 是双向的,若rel为正数,则向前转移,若rel为负 数向后转移。转移相对范围图是-128127H共 256个单元; 注译中的“PC (PC)+2+rel”是这样得来的:注 译中 “(PC)”是该指令执行前的值,前 面的“PC”是指指令执行后的值。因“SJMP rel” 指令存放在ROM中占用2个字节单元(为双字节 指令),故程序从指令执行后“当前位置”向 前或向后跳转rel个单元,也就是从指令执行前 的位置向前或向后跳转2rel个单元。,AJMP addr11 ;PC (PC)+2,PC100 addr11 功能:addr11的11位数取代该指令执行后程序指针PC的低11位PC100,程序根据PC值转移运行。 说明: addr11为11位无符号数,程序转移最大范围为2KB。 LJMP, STMP, AJMP功能相同,只是转移范围不同。,3. 绝对转移指令AJMP,JMP A+DPTR ;PC (A)+(DPTR) 功能:由A及DPTR的内容决定程序转移的目的地址。 说明: DPTR为基址寄存器,A为变址寄存器,为基址加变址寻 址方式。 把DPTR值固定,赋与A不同的值,则可实现程序的多分 支转移。,4.变址转移指令JMP,3.7.2 条件转移指令,测试转移指令 1)累加器A判0转移指令 JZ rel ;若(A)=0,转移,PC (PC)+2rel ;若(A)0,顺序执行。 JNZ rel ;若(A)0,转移,PC (PC)+2rel 2)进位位测试转移指令 JC rel ;若(C)=1,转移,PC (PC)+2rel JNC rel ;若(C)=0,转移,PC (PC)+2rel,所谓条件转移就是程序的转移是有条件的,当指令中规定的条则满足时,程序转移,否则程序不转移,仍顺序执行。,3) 位单元测试转移指令 JB bit,rel ;若(bit)=1,转移,PC (PC)+3rel JNB bit,rel ;若(bit)=0,转移,PC (PC)+3rel JBC bit,rel ;若(bit)=1,转移,PC (PC)+3rel ;同时将bit位清零。 功能:根据测试条件决定程序是否转移执行。 说明:若条件满足程序转移执行;若条件不满足,顺序执行。 位单元测试转移指令为三字节指令,故执行该类指令 ,若条件满足转移时,PC(PC)+3+rel。其它测试转 移指令为双字节指令,条件满足转移时, PC(PC)+2+rel。,解 MOV R0,#DATA2 ;赋首址 MOV DPTR,#DATA1 LOOP1:MOVX A,DPTR ;取数 JZ LOOP2 ;判断是否为0 MOV R0,A ;不为0存数 INC R0 ;准备取下一个数 INC DPTR SJMP LOOP1 ;重复取数过程 LOOP2:RET,例3-25 将外部RAM的一个数据块(首址为DATA1)传送到内部RAM(首址DATA2),遇到传送的数据为零时停止。,格式为:CJNE , rel CJNE A,direct,rel ;累加器A与内部RAM的direct 单元不等转移。 CJNE A,#data,rel ;累加器A与立即数data不等转移 CJNE Rn,#data,rel ;寄存器Rn与立即数data不等转移 CJNE Ri,#data,rel ;间接寻址的片内RAM单元 与立即数data不等转移,2. 比较不相等转移指令CJNE,说明:数据比较转移指令多位三字节指令。 利用该类指令不但可以实现程序的转移功能,也可以用 以比较两数值的大小。 指令执行后进位位C的状态相当反映了被比较数与比较 数相减有无借位。,解 MOV R0,#DATA LOOP1: CJNE R0,#64H,LOOP2 SJMP LOOP3 LOOP2: INC R0 SJMP LOOP1 LOOP3: MOV A,R0,例3-26 找出片内RAM的DATA为首址的数据块中第一个等于100的数,并将其地址存入A中。,DJNZ Rn,rel DJNZ direct,rel,功能:寄存器Rn或direct单元内容减1,如果结果为零,则程序顺序执行;如果还没有减到0,则程序转移。 说明:这两条指令主要用于控制程序循环,又称循环指令。预先赋值Rn或RAM单元,以控制循环次数。,3. 减1不为0转移指令DJNZ,解分析:这是一个重复操作过程,可以使用循环指令。30H7FH共50H个单元 ,循环次数为50H。 程序如下: MOV R7,#50H MOV R0,#30H NEXT:MOV R0,#0 INC R0 DJNZ R7,NEXT,例2-27 将内部RAM的30H7FH单元清0。,解 MOV DPTR,#2000H ;数据传送的源地址 PUSH DPL ;保存源地址 PUSH DPH MOV DPTR,#3000H ;数据传送的目的地址 MOV R2,DPL ;保存目的地址 MOV R3,DPH LOOP: POP DPH ;取源地址 POP DPL MOVX A,DPTR ;从源地址单元取数 INL DPTR ;下一个单元源地址 PUSH DPL ;保存源地址 PUSH DPH MOV DPL,R2 ;取目的地址 MOV DPH,R3 MOVX DPTR,A ;将数据存入目的地址 INC DPTR ;下一个目的地址 MOV R2 ,DPL ;保存目的地址 MOV R3,DPH DJNZ 30H,LOOP ;判断数据传送是否结束,例3-28 把从2000H开始的片外RAM单元中的数据传送到从3000H开始单元中,数据个数存放在片内RAM30H单元中。,3.7.3 子程序调用返回指令,1.长调用指令LCALL LCALL addr16 2.绝对调用指令ACALL ACALL addr11 3.返回指令 RET RETI ;中断服务子程序返回指令,3.7.4 空操作指令NOP NOP ;PC (PC)+1,3.8 MCS-51指令机器代码,指令的存贮和运行是以二进制代码的形式进行的,这 些代码称机器指令或机器码。机器指令中的代码长度各 有不同,有单字节、双字节和三字节3种,对应指令分别 称为单字节指令,双字节指令和三字节指令。,3.8.1 机器代码及其存贮,3000H E8 MOV A,R0 3001H 24 0F ADD A,#0FH 3003H 90 20 00 MOV DPTR,#2000H 3006H F0 MOV DPTR,A,3.8.2 机器码的查表计算,1. 指令中带有立即数、直接地址、 工作寄存器的机器码,每条汇编指令都有与之一一对应的机器指令,亦即机器码,可由MCS-51指令表(附录6)中查出。某些指令码由表中直接给出,还有一些须经过简单的推算方能得出。,指令中的立即数、直接地址直接参与编码。,解查表,指令PUSH 80H 属PUSH direct 形式,PUSH direct的代码项为: C0 direct, 所以PUSH 80H的代码为: C0 80 表中指令MOV DPTR,#data16代码项为: 90 data158 data70 , 故MOV DPTR, #2000H的代码为: 90 20 00 表中指令ADD A, R5的代码项为 282F, 则可知ADD A, R5的代码为 2D,例3-29 分别给出PUSH 80H 、MOV DPTR,#2000H 、ADD A, R5的代码。,2. 非相对址控制转移类指令的机器码,1)长转移及长调用指令 在LJMP addr16及LCALL addr16中,16位地址往往是用地址标号表示的,这时须将地址标号所在指令的首址计算出。 例:标号地址START为0100H,标号LOOP为8100H,则 START: LCALL

温馨提示

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

评论

0/150

提交评论