单片机及接口技术:第2章51系列单片机的指令系统_第1页
单片机及接口技术:第2章51系列单片机的指令系统_第2页
单片机及接口技术:第2章51系列单片机的指令系统_第3页
单片机及接口技术:第2章51系列单片机的指令系统_第4页
单片机及接口技术:第2章51系列单片机的指令系统_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

1、单片微型计算机与接口技术(第4版) 第2章 51系列单片机的指令系统 2.1寻址方式2.2数据传送与交换指令2.3算术运算和逻辑运算指令2.4控制转移指令2.5位操作指令学习内容 51单片机指令可分为6个类型,其特点:(1)指令执行时间快(2)指令短(3)具有丰富的位操作类指令指令的格式: LOOP: MOV A, R0 ;将R0的内容送A 标号 操作符 目的操作数, 源操作数 ;注释注:括号的内容不是必须的 符号的约定意义: Rn:当前工作寄存器组中的R0R7(n=0,1,7)Ri: 当前工作寄存器组中的R0,R1 (i=0,1)dir: 8位直接字节地址(片内RAM和SFR地址)#data

2、: 8位立即数#data16:16位立即数addr16:16位地址值addr11:11位地址值bit: 位地址rel: 相对偏移量( ): 表示存储单元的内容2.1 寻址方式 寻址方式:指令中提供(寻找)操作数的方式说明:针对源操作数 (7种) 针对目的操作数 (4种) 2.1 1 立即寻址(源) 指令中直接给出操作数该操作数称为立即数, 冠以”“号作前缀, 表示并非地址 MOV A, 80H MOV DPTR, 0DFFFH 目的操作数没有立即寻址 2.1.2 直接寻址(源,目) 操作数直接以单元地址(8位)形式给出直接寻址方式可访问 2 种存储器空间: (1) 内部RAM低 128 字节单

3、元(00H7FH) (2) SFR (用SFR寄存器名称表示) 例: MOV A, 40H ; A(40H) 该指令的机器码为E5H 40H MOV P0, #45H ; P045H P0地址为80H,机器码为758045,P0为直接寻址 MOV 30H, 20H ; (30H)(20H) 机器码为852030 (特殊) *MOV DPTR,2000H ?2.1.3.寄存器寻址(源,目) 操作数在通用寄存器中 (R0R7, A, B,DPTR) B仅在乘除法指令中为寄存器寻址,其他指令中为直接寻址A既可直接寻址(此时写作ACC,为SFR),又可寄存器寻址 INC A 寄存器寻址 ,机器码04H

4、 INC ACC 直接寻址,机器码05E0H 其余的特殊功能寄存器一律为直接寻址例2-3 MUL AB ; A*BBA,A、B为寄存器寻址,机器码A4MOV B, R0 ; R0B,R0为寄存器寻址,B为直接寻 址,机器码为88F0,其中F0为B的字节地址 PUSH ACC ; A的内容压入堆栈,机器码为C0E0,其 中E0为A的字节地址,此处A为直接寻址 ADD A, ACC ;A*2A,(ADD A,dir形式无ADD dir,A形式) 2.1.4. 寄存器间接寻址(二次寻址,与RAM有关) (源,目) 以寄存器中的内容为地址,该地址中的内容为操作数 1, 使用R0、R1及DPTR,前缀“

5、” 2, 存储器空间包括 内RAM (MOV指令) 外RAM (MOVX指令) 对于外RAM最大寻址可达64KB1),由P2提供高8位地址,由R0或R1提供低 8位地址 (高8位,低8位)2),由DPTR作寄存器间接寻址 (16位)区别:寄存器寻址:寄存器内容为操作数 寄存器间接寻址:寄存器内容为操作 数所在存储单元地址例2-4 MOV R0, A ; A以R0内容 为地址的内部RAM片内RAMR0A图2-1 MOV R0, A MOVX A, R1 ; 外部RAM(地址为P2R1)的内容A MOVX DPTR, A ; A以DPTR内容为地址的外部RAM片外RAMR1AxxxxP2图2-2

6、MOVX A, R1片外RAMDPTRAxx图2-3 MOVX DPTR, Axx 2.1.5 变址寻址 (与ROM有关,2条) (源)以DPTR或PC的内容加上A的内容之和作为操作数的地址1) 只有读操作,无写操作2) 指令采用MOVC,操作数A例2-5: MOVC A, A+DPTR ; A(A+DPTR) MOVC A, A+PC ;(A+PC) A注意:目的操作数无变址寻址(无MOVC A+DPTR, A ) 2.1.6. 相对寻址(修改PC 转移) (源) 以当前PC的内容为基址, 加上指令中给定的偏移量作为转移地址 如 SJMP 08H(机器码80H,08H ) 指令执行后,转移到

7、地址为当前PC08H处执行程序 当前PC:转移指令紧相邻的下一条指令的PC值(动态) 1) 源地址(转移指令所在地址) 即: 当前PC值 = 源地址 + 转移指令字节数 2) 偏移量rel是以补码表示的单字节数, 取值范围 -128+127(即80H7FH), 负数表示从当前地址向上转移, 正数表示从当前地址向下转移 3)目的地址 = 当前PC值 + rel2.1.7. 位寻址 (内RAM , SFR)(源,目) 对位地址中的内容作位操作 位操作:位传送及逻辑操作 (无算术运算) 例如: SETB PSW.3 ; (PSW.3)1位地址表示?内RAM: 00H7FH (128位,直接位地址)

8、SFR: PSW.5 (符号位地址)例: MOV C,20H ;20H位内容CY (位寻址) MOV A,20H ;内RAM中20H单元内容A(字节寻址) 位寻址?字节寻址?根据两操作数类型一致的原则,由另一个操作数决定 指令对哪个存储器空间进行操作是由指令 操作码和寻址方式确定的 源目2.2 数据传送与交换指令2.2.1 传送类指令 1. 传送指令MOV(内RAM,拷贝) 图26示意了MOV的操作,图中表示单向传送,表示相互传送,箭头指向目的操作数dirRnRi#dataA图26 MOV指令(1)以A为目的操作数 Rn ;RnA dir ;(dir)A Ri ;(Ri) A #data ;#

9、dataAMOV A,例27 R1=20H,(20H)=55H,指令MOV A, R1 执行后,A=55H。 (2) 以Rn为目的操作数 A ; A Rn MOV Rn, dir ;(dir) Rn #data ;#data Rn例28 (40H)30H,指令MOV R7,40H执行后,R7=30H。(3) 以DPTR为目的操作数 MOV DPTR, #data16 ;#data16DPTR例: MOV DPTR, #2010H ;#2010HDPTR相当于:MOV DPH, #20H MOV DPL, #10H以直接地址为目的操作数 A ;A (dir) Rn ;Rn (dir) MOV d

10、ir, dir1 ;(dir1)(dir) Ri ;(Ri) (dir) #data ;#data(dir) 例210 R0 = 50H,(50H)=10H,指令MOV 35H,R0执行后,(35H)10H。这一操作也可以用指令MOV 35H, 50H来完成。 (5)以间接地址为目的操作数 A ;A (Ri) MOV Ri, dir ;(dir) (Ri) #data ; # data (Ri) 2. 非内RAM和A之间的传送A 外部数据存储器程序存储器 Ri , A DPTR , A A , Ri A , DPTRMOVXMOVCA , A+PCA , A+DPTRMOVXMOVC(1)访问

11、外RAM指令 (读/写,4条)i) MOVX Ri, A ;A(P2 Ri )ii) MOVX DPTR, A ; A(DPTR ) iii) MOVX A, Ri ; (P2 Ri ) A iv) MOVX A, DPTR ;(DPTR) A这组指令:在A与外RAM单元或I/O口之间进行数据传送(2)访问程序存储器指令 (只读不写 2条) MOVC A, A+PC ;(A+PC) A MOVC A, A+DPTR ;(A+DPTR)A 例213 执行下列程序后A=? (DB为字节定义伪指令) MOV A, #02H ;A=02 MOVC A, A+PC ;取完该指令, PC=M1,A+PC=

12、2+M1 M1: RET M2: DB 66H,77H,88H,99H 执行MOVC指令后A=77H 例 : MOV A, R0 ;以R0的内容为地址 ,把该地址中的内容 送到 A中去 A (R0) MOV A, R0 ;将R0的内容送到A去 A R0 MOV A, #20H ;A = 20H A的内容为20H MOV A, 20H ;A = (20H) A的内容为20H中的内容 注意以上两组指令的不同点 传送类指令 MOV :内RAM,SFR MOVX :外RAM,I/O口 MOVC :ROM(内,外) 3. 堆栈操作 (内RAM ,SFR) PUSH dir ;入栈操作,SP+1SP,(d

13、ir)(SP) POP dir ;出栈操作,(SP)(dir),SP-1SP * 1) 堆栈在内部RAM中 2) 先进后出,字节操作 3) 初始化SP=07H 4) 直接寻址 例: 进入中断服务子程序时, 把程序状态寄存器PSW、 累加器A、数据指针DPTR进栈保护。则程序段 MOV SP,#60H PUSH PSW PUSH ACC PUSH DPL PUSH DPH 执行后, SP=? SP=64H2.2.2 交换指令 1.字节交换指令 XCH A , Rn ; A Rn XCH A , dir ; A (dir) XCH A , Ri ; A (Ri) 将A的内容和源操作数内容相互交换(

14、字节)例 A=FFH ,R1=30H,(30H)=87H 执行XCH A, R1 后 A=87H,(30H)=FFH, R1=?例:将片内RAM 60H单元与61H单元的数据交换。 XCH 60H,61H 对吗? 2. 低半字节交换 XCHD A, Ri ;A0-3 (Ri)0-33. A的高、低半字节交换 SWAP A ;A0-3 A4-7 思考:把内RAM50H地址单元中的内容与40H地址单元的内容互换。 (可用多种方法:堆栈法,字节交换法,直接地址法等) PSW寄存器注意 1) 当A中1的个数为奇数,P=1,否则 P=0 2) MOV类,INC,DEC,逻辑运算类不影响 CY,OV,AC

15、 3) 加减运算影响 P,CY,OV,AC 乘除后 CY=0 乘积255OV=1 除数=0 OV=12.3 算术运算和逻辑运算指令2.3.1 对标志位的影响2.3.2 以A为目的操作数的算术运算和逻辑运算指令 共24条指令加: ADD进位加: ADDC借位减: SUBB与: ANL或: ORL异或: XRLA,RidirRn#data 带进位加法指令 ADDC A, Rn ; AA+Rn+Cy * 对标志位的影响与ADD相同; Cy:上一次进位标志; 用于多字节加法运算 带借位减法指令 SUBB A, Rn ;AA-Rn-Cy SUBB A, Ri ;AA-(Ri)-Cy SUBB A, di

16、r ;AA-(dir)-Cy SUBB A, data ;AA-#dataCy * 要进行不带借位的减法, 先将Cy清“0” CLR C ; 0CY 2.3.3 以dir为目的操作数的逻辑运算指令与: ANL 或: ORL dir, 异或:XRLA#data : “与” “有0即0,全1为1” : “或” “有1即1,全0为0” : “异或” “相异为1,相同为0” 2.3.4 加1, 减1指令 加1指令 INC A ;AA+1 INC Rn ;Rn Rn +1 INC dir ;(dir)(dir)+1 INC Ri ;(Ri) (Ri) +1 INC DPTR ;DPTRDPTR+1 (唯

17、一16位运算指令) 对标志位Cy不产生影响 若: A0FFH , Cy=0 执行: INC A 结果: A00H , Cy=0 减1指令DEC A ;AA1DEC Rn ; Rn Rn 1DEC dir ;(dir)(dir)1DEC Ri ;(Ri)(Ri)1对标志位Cy不产生影响无 DEC DPTR 指令 2.3.5 十进制调整指令 DA A用途:紧跟在加法指令(BCD码加,不包括减法)之 后,进行十进制调整如两BCD码加: MOV A, #35H ADD A, #46H ; A=7BH DA A ; A=81H 2.3.6 专对A的指令 CLR A ; 对A清“0”(MOV A,#0)

18、CPL A ; 对A按位取反 RL A ; A的内容向左环移1位 RLC A ; A的内容带进位标志位向左环移1位 RR A ; A的内容向右环移1位 RRC A ; A的内容带进位标志位向右环移1位 除了RLC A和RRC A影响CY, 其它都不影响Cy, AC, OV等标志2.3.7 乘、除法指令1.乘法指令 MUL AB ; ABBA)A、B中都是无符号整数)如果积大于255,OV1,否则OV0;)乘法后 Cy0 2. 除法指令 DIV AB ; AB 商 A 余数B)A、B中都是无符号整数)如果除数B为“0”,OV1,否则OV0;)除法后 Cy0例215 编程将21H单元的低三位和20

19、H单元中的低五位合并为一个字送30H单元,要求(21H)的低三位放在高位上。MOV 30H,20H ;(30H)=(20H)ANL 30H,#1FH ;保留低5位MOV A,21H ;A=(21H)SWAP A ;高低4位交换RL A ;低3位变到高3位ANL A,#0E0H ;保留高3位ORL 30H,A ;与(30H)的低5位合并SJMP $ ;动态暂停例216 把在R4和R5中的两字节数 取补(高位在R4中)CRL C ;Cy清零MOV A, R5CPL AADD A, #01H ;低位取反加1 (INC A ?) MOV R5, A MOV A, R4 CPL A ;高位取反 ADDC

20、 A, #00H ;加低位的进位 MOV R4, A SJMP $ 例 217 把R7中的无符号数扩大10倍 MOV A, R7 MOV B, #0AH MUL AB MOV R7, A ;R7存积的低位 MOV R6, B ;R6存积的高位(去掉?) SJMP $例218 把R1R0和R3R2中的两个4位BCD数相加,结果送R5R4中,如有进位则存于进位位C中。 CLR C ;清进位 MOV A, R0 ADD A, R2 ;低字节相加(CY=?) DA A ;BCD调整 MOV R4, A MOV A, R1 ADDC A, R3 ;高字节相加 DA A ;BCD调整 MOV R5, A

21、SJMP $2.4 控制转移指令 (强迫改变PC值) 2.4.1 调用子程序及返回指令 主程序需要使用子程序时用调用指令 子程序的最后安排一条返回指令 子程序调用:长调用指令LCALL 短调用指令ACALL1. 长调用指令 LCALL addr16 ; addr16 PC0-15,三字节 addr16:子程序地址 (目的地址,子程序名) 操作:断点地址(当前PC)计算, PC+3PC 断点地址(当前PC)入栈,SP+1SP,PC0-7(SP) SP+1SP,PC8-15(SP) 子程序地址PC , 即addr16PC0-151) LCALL可调用64KB范围内的子程序2) 指令执行后不影响任何

22、标志3) 机器码:12, addr16H, addr16L2. 短调用指令 (绝对调用指令) ACALL addr11 ; addr11PC0-10,二字节 addr11:子程序地址(目的地址,子程序名) 操作: 当前PC计算, PC+2PC 断点地址(当前PC)入栈, SP+1SP,PC0-7(SP) SP+1SP,PC8-15(SP) 子程序地址PC , 即addr11PC0-10,PC11-15不变 当前PC 与子程序入口同在一基本2KB地址范围内2) 指令执行后不影响任何标志3) 机器码:a10a9a810001a7a6a5a4a3a2a1a0(二字节)ROM空间32个基本2K地址(P

23、C11-PC15同)范围 0000H-07FFH,0800H-0FFFH,1000H-17FFH,1800H-1FFFH 2000H-27FFH,2800H-2FFFH,F800H-FFFFH 例:1) 知MA=07FFH,执行指令MA:ACALL 0810H正确否? 知MA=07F0H,执行指令MA:ACALL 0810H正确否? 2)知MA=0500H,执行指令 MOV SP,#30H MA:LCALL 8192H 堆栈中数据如何变化? SP=? PC=?答案:1) , 2)SP=32H,PC=8192H,(31H)=03H,(32H)=05H 3. 子程序返回指令 (程序末尾) RET;

24、(SP)PC8-15,SP-1SP (SP)PC0-7, SP-1SP 恢复断点, 返回主程序 4. 中断返回指令 (程序末尾) RETI ;(SP)PC8-15,SP-1SP (SP)PC0-7, SP-1SP 恢复断点, 返回主程序,清除中断状态标志2.4.2 转移指令1、 无条件转移指令(1) 短转移指令 (绝对转移) AJMP addr11; addr11 PC0-10,二字节 addr11:目的地址(标号) 操作:当前PC计算, PC+2PC 目的地址PC ,即addr11PC0-10 (PC11-15不变)注意:当前PC 与目的地址同在一基本2KB地址范围(转移) 2) 指令执行后

25、不影响任何标志3) 机器码:a10a9a800001a7a6a5a4a3a2a1a0(二字节) (2) 长转移指令 LJMP addr16 ;PCaddr16 (64K范围,3字节)注意:1) 指令执行后不影响任何标志机器码:02, addr16H, addr16L(三字节)例如: 在程序存储器0000H单元存放一条指令: LJMP 3000H; PC3000H,机器码 02 30 00 则上电复位后程序将跳到3000H 单元去执行用户程序(3) 间接转移指令 JMP A+DPTR ; PCA+DPTR目的地址送入PC不改变A和DPTR的内容 (无符号数)不影响标志例2-22: 根据累加器A的

26、数值, 转不同处理程序的入口 MOV DPTR, TABLE ; 表首址送DPTR JMP A+DPTR ; 依据A值转移 TABLE: AJMP PROC0 ; 当A=0时转PROC0执行 AJMP PROC1 ; 当A=2时转PROC1执行 AJMP PROC2 ; 当A=4时转PROC2执行注意:A内容为偶数 将AJMP换为LJMP,A=? (A=0,1,2,3.必须有A*3)(4)无条件相对转移(2字节) SJMP rel; As+2PC当前 (当前PC) PC当前+relPC目的(目的地址) rel:相对偏移量,为8位补码 机器码:80,rel rel PC目的PC当前 (目的地址当

27、前PC)补码 原地踏步指令(动态暂停):HE: SJMP HE 常写成: SJMP $ (机器码80H,FEH)80HrelXXXX SJMP当前PC(下一指令)-128+127当前PC为基准特点:两字节指令本指令PC+2当前PC转移范围: -128+127( -126+129 ) SJMP 转移范围 XX XX当前PC为基准2. 条件转移指令 (转移范围有限)累加器判0 转移 (2条,2字节)JZ rel; A=0 转移,去As+2+relPC目的,否则As+2PC当前JNZ rel; A0 转移,去As+2+relPC目的,否则As+2PC当前 转移范围:PC当前为中心的 256 个字节

28、(128 +127)注意: 长转移: 64KB范围 短转移: 同一基本2KB范围 相对转移:256B范围 (2) 减 1不为0转移指令 (2条) DJNZRn, rel;2字节指令,Rn-1Rn, 若Rn0, 转移去As+2+rel PC目的; 若Rn=0,顺序执行As+2PC当前 DJNZ dir, rel;3字节指令 转移地址的计算方法同前共性:减1后结果回传 例2-23 说明程序运行后A=? MOV 23H,#0AH ;(23H)#0AH CLR A ;A0 LOOP: ADD A,23H ;AA+(23H) DJNZ 23H,LOOP ;(23H)-10,转移去LOOP SJMP $

29、;否则顺序执行 答案:A=10+9+8+7+6+5+4+3+2+1=55=37H DJNZ A,rel ? (3) 比较转移指令 (4条,3字节) CJNE A, dir, rel ;A-(dir )0CY=0 A-(dir )0CY=1 A(dir),转移(As+3+relPC目的) A=(dir ),顺序执行(As+3PC当前)CJNE A, data, relCJNE Rn, data, relCJNE Ri, data, rel 功能:比大小,判相等,定转移?(相减结果不回传,影响CY,不影响操作数) 例2-24:R756H,指令CJNE R7, #34H, $+08H执行后,程序转移

30、到放本条CJNE指令的首地址($)加08H后的地址单元去执行。 rel=? rel=($+08H)-($+03H)=05H ? rel=($+08H)-($)=08H ? rel PC目的PC当前 (目的地址当前PC)补码2.4.3 空操作指令 NOP ;PCPC+1 , 机器码 00 单字节指令 消耗一个MC的时间 不影响标志位 2.4.4 指令应用举例例2-28 将累加器的低4位取反4次,高4位不变。每变换一次,从P1输出。 分析:异或运算的规则是一个数与0异或,该数不变;与1异或,该数取反;高4位不变,高4位与0异或;低4位取反,低4位与1异或,因此A和0FH异或方法一 加1计数: MO

31、V R0, #0 LL: XRL A, #0FH INC R0 MOV P1, A CJNE R0, #04, LL RET 方法二 减1计数: MOV R0, #04H LL: XRL A, #0FH MOV P1, A DJNZ R0, LL RET例2-29 在内部RAM 的40H地址单元中,有1字节符号数,编写求其绝对值后放回原单元的程序。MOV A, 40H ;A(40H)ANL A, #80H ;判断A中数为正负?JNZ NEG ;A0,为负数转移SJMP $ ;A=0,为正数,不操作 NEG: MOV A, 40H ;求补,取绝对值CPL A ;取反 INC A ;加1 MOV 40H, A ;(40H)绝对值 SJMP $ ;暂停 2.5 位操作指令 表 1 位 操 作 指 令 指令中位地址表达: (1) 直接地址方式: 如 D4H; (2) . 操作符方式: 如PSW.4; (3)

温馨提示

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

最新文档

评论

0/150

提交评论