第四章 指令系统及汇编语言程序设计_第1页
第四章 指令系统及汇编语言程序设计_第2页
第四章 指令系统及汇编语言程序设计_第3页
第四章 指令系统及汇编语言程序设计_第4页
第四章 指令系统及汇编语言程序设计_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章 指令系统及汇编语言程序设计任课教师:刘忠国山东大学课程中心网站:/G2S/Template/View.aspx?action=view&courseType=0&courseId=5819网站: / keil vision软件下载及指导手册(Helpvision Help) /STC15系列单片机器件手册-1473页 (2015/6/29更新)2第四章 指令系统及汇编语言程序设计 本章学习目标了解助记符、指令格式掌握单片机寻址方式 掌握单片机指令系统掌握单片机汇编语言程序设计及开发环境3*第四章 指令系统及汇编语言程序设计语言4.1 编程语言简介 4.2 指令和伪指令 4.3 汇编语言

2、程序调试4.4 利用STC-ISP工具将程序下载到单片机中验证程序4.5各类指令详解4.5.1 数据传送类指令4.5.2 逻辑操作类指令4.5.3 算术运算类指令4.5.4 位操作指令4.5.5 控制类转移指令4.6 汇编语言程序设计4*具体指令系统介绍4.5 各类指令详解(111条)功能:主要给单片机的内部和外部资源赋值、进行堆栈的存取操作等。对程序状态字PSW一般不产生影响。 (注: 当A为目的操作数时, 影响PSW的奇偶标志位P。)分类:分为三种:数据传送(22条)数据交换(5条)栈操作(2条)5*8个助记符例: MOV A, #13H;例:XCHD A, R0; PUSH addr8

3、; SPSP+1, (SP)(addr8)POP addr8 ; (addr8) (SP) , SPSP- 14.5.1 数据传送类指令(29条)指令列表见附录E例: MOVX A, DPTR;或R0, R1例: MOVC A, A+DPTR;SWAP A; 4.5.1 数据传送类指令(29条)-数据传送(22条)数据传送(22条)数据交换(5条)栈操作(2条)6*见附录 E附表 E-14.5.1 数据传送类指令(29条)-数据传送(22条)数据传送(22条)数据交换(5条)栈操作(2条)7*见附录 E附表 E-14.5.1 数据传送类指令(29条) -栈操作(2条) -数据交换(5条) 数据

4、传送(22条)数据交换(5条)栈操作(2条)8*SWAP A 也可分类到“对累加 器A进行的逻辑操作”数据传送类指令共 8个助记符逻辑操作类见附录 E附表 E-1 数据传送指令(22条)1、MOV指令(16条) 2、MOVX指令(4条) 3、MOVC指令 (2条) 9*1、MOV指令MOV指令作用区间: 内部数据存储器和特殊功能寄存器使用方法利用Rn可直接访问某工作寄存器;利用Ri可间接寻址内部数据RAM的某一字节单元;直接寻址则可遍访问内部数据RAM(00H7FH)和特殊功能寄存器空间。1、MOV指令(16条) 双操作数的数据传送指令允许在工作寄存器、内部数据RAM、累加器A和特殊功能寄存器

5、(SFR)任意两个之间传送一个字节的数据,而且立即操作数能送入上述任何单元中。10*(2)Rn、内部RAM、SFR与累加器A传送数据送 (6条)(1) 立即数送累加器A和Rn、内部RAM、SFR送 (4条)(3)Rn、SFR和内部数据RAM之间的数据传送送 (5条)(4)目标地址传送 (1条): MOV DPTR , #data16附录 E指令列表按目的操作数分类(1) 立即数送累加器A和Rn、内部RAM、SFRMOV A, #data8 ;A #data8MOV addr8,#data8 ;(addr8) #data8MOV Ri, #data8 ;(Ri) #data811*例:MOV R

6、0, #60H ;将立即数60H送到寄存器R0中 MOV R0, #56H;将56H送到R0间接寻址的单元(地址60H) MOV 20H, #56H ;将立即数56H送入20H单元中 MOV P1, #80H ;把80H直接送入P1口(口地址为90H)中MOV Rn, #data8 ;Rn #data8direct:addr8直接寻址(2)Rn、内部RAM、SFR与累加器A传送数据(6条)12* MOV A, addr8 ;A(addr8) MOV A, Ri ;A (Ri) MOV A, Rn ;A Rn MOV addr8, A ;(addr8) A MOV Ri, A ;(Ri) A M

7、OV Rn, A ;RnA欲从DPL取数到累加器A, 用直接寻址方式: MOV A, 82H; DPL地址为82H MOV A, DPL间接寻址Ri寻址范围可为00HFFH(不含SFR): MOV R1, #82H MOV A, R1 ;寻址内部RAM地址82H (3)Rn、SFR和内部数据RAM之间的数据传送(5条) MOV addr8, addr8 ;(addr8目)(addr8源) MOV addr8, Ri ;(addr8)(Ri) MOV addr8, Rn ;(addr8)Rn MOV Ri, addr8 ;(Ri)(addr8) MOV Rn, addr8 ;Rn(addr8)1

8、3*例: MOV 60H, 50H ; 把50H单元内容送到60H单元 MOV P1, R0 ; R0P1(地址90H)1、MOV指令(16条) (4)目标地址传送(1条) 功能:把16位常数装入数据指针DPTR 。只有一条指令:MOV DPTR , #data16 例如: MOV DPTR , #0150H表示把16位常数装入数据指针。执行后,DPTR=0150H,其中DPH=01H,DPL=50H14*2、MOVX指令(4条) 15*功能: 用于累加器A和外部RAM或扩展并行I/O口进行数据传送。这种传送只一种寻址方式, 即寄存器间接寻址。 MOVX A, DPTR ;A(DPTR) MO

9、VX A, Ri ;A(Ri) MOVX DPTR, A ;(DPTR)A MOVX Ri, A ;(Ri)A注意:由于使用R1或R0寄存器间接寻址方式访问外部数据存储器时,寻址范围受到256字节限制,因此,在实际应用中,一般使用DPTR寄存器间接寻址方式访问外部数据存储器。2、MOVX指令(4条) 16*用R1或R0进行寄存器间接寻址。该方式能访问外部数据存储器(或扩展并行I/O口)256个字节中一个字节。若要访问更大片外空间, 需用P2口输出高8位地址。需先给P2和Ri赋值, 然后执行MOVX指令。(访问片内扩展XRAM时, Ri只能访问其000FF空间, 与P2口无关)用16位数据存储器

10、地址指针DPTR进行寄存器间接寻址 : 该法能遍访64KB外部数据存储器 (或扩展并行I/O口)的任何单元。 (访问片内扩展XRAM时, DPTR 与P2口无关)2、MOVX指令(4条) 例如:若外部数据存储器单元中:(0100H)=60H,(0101H)=2FH 则下列程序执行后的结果: MOV DPTR , #0100H; DPTR = 0100H MOVX A, DPTR ;执行后, 累加器A=60H MOV B, A ; B=A=60H, 不能MOVX B, DPTR INC DPTR ; DPTR = 0101H MOVX A, DPTR ;执行后, 累加器A=2FH17*3、程序存

11、储器向累加器A传送指令MOVC查表:单片机提供2条查表指令,访问程序存储器。指令采用变址寻址, 以PC或DPTR为基址寄存器, 以累加器A为变址寄存器, 基址寄存器与变址寄存器内容相加得到程序存储器某单元的地址值; MOVC指令把该存储单元的内容传送到累加器A中。18*格式: MOVC A, A+PC ;PCPC+, A(A+PC) MOVC A, A+DPTR ;A(A+DPTR)功能: 把A中内容与基址寄存器(PC, DPTR)内容相加, 求得程序存储器单元地址, 再把该地址单元内容A。指令执行后不改变基址寄存器内容, 因执行16位加法, 从低8位产生的进位将传送到高位去, 不影响任何标志

12、。3、程序存储器向累加器A传送指令MOVC查表:单片机提供2条查表指令,访问程序存储器。19*格式: MOVC A, A+PC ;PCPC+, A(A+PC) MOVC A, A+DPTR ;A(A+DPTR)功能: 把A中内容与基址寄存器(PC, DPTR)内容相加, 求得程序存储器单元地址, 再把该地址单元内容A。3、程序存储器向累加器A传送指令MOVC【例4-2】试编制根据累加器A中数(09)查其平方表的子程序。解:程序代码如下: COUNT: PUSH DPH ;保护现场 PUSH DPL ;保护DPTR内容 MOVDPTR , #TABLE ;赋表首址DPTR MOVC A , A+

13、DPTR ;据A中内容查表 POP DPL ;恢复现场 POP DPH ;恢复DPTR原内容 RET ;返回TABLE: DB 00, 01, 04, 09, 16, 25, 36, 49, 64, 8120* 数据交换指令 (5条)21*例如,设R0=20H,A=3FH,(20H)=75H,若 XCH A, 20H ;执行结果A=75H, (20H)=3FH 若 XCH A, R0 ;执行结果A=75H, (20H)=3FH若 XCH A, R0 ;执行结果A=20H, R0=3FH 包括字节交换指令和半字节交换指令。1、字节交换指令 (3条) XCH A, addr8 ;A (addr8)

14、 XCH A, Ri ;A (Ri) XCH A, Rn ;A Rn 数据交换指令2、半字节交换指令 (2条) XCHD A, Ri ;A30 (Ri) 30指令把累加器A的低4位和寄存器间接寻址的内部RAM单元的低4位交换, 高4位内容不变, 不影响标志位。例如: 设A=69H (0110 1001B), R1=30H, 内部RAM中30H的内容: (30H) =87H (1000 0111B), XCHD A, R1;执行结果:A=67H,(30H)=89H22*SWAP A ; A03 A47(高低两半字节交换)A若A=67H, 执行指令后A=76H 栈操作指令 (2条)堆栈的作用保护断

15、点, 保护现场主程序调用子程序或中断处理程序时, 需保存返回地址(断点地址)和保护现场,以便返回时能回到调用前的程序段,继续运行原来的程序。23*保存断点地址方法: 将断点地址保存到堆栈中(入栈或压栈), 返回主程序前从堆栈中取出上述地址放回到指令计数器PC中(出栈或弹栈); 例:LCALL COUNT ;表示调用COUNT子程序 MOV A, DPTR断点保存与恢复的堆栈操作由CPU自动完成。 栈操作指令 (2条)24*现场保护和恢复保护现场: 进入子程序或中断处理程序后要保护所用到的通用寄存器的值:将寄存器值压栈 (PUSH) 保存。恢复现场: 子程序返回或中断处理返回前,还要能够恢复这些

16、寄存器的值:将寄存器值(POP)弹栈到寄存器。例: MOV A, #8H MOV DPTR, #1234H; LCALL COUNT ;表示调用COUNT子程序 MOV A, DPTR【例4-2】根据累加器A中数(09)查其平方值的子程序。COUNT: PUSH DPH ;保护现场 PUSH DPL ;保护DPTR内容 MOVDPTR , #TABLE;赋表首址DPTR MOVC A , A+DPTR ;据A中内容查表 POP DPL ;恢复现场 POP DPH ;恢复DPTR原内容 RET ;返回TABLE:DB 00, 01, 04, 09, 16, 25, 36, 49, 64, 81保

17、护断点保存返回地址的方法: 将返回地址(断点地址)保存到堆栈中(入栈或压栈), 返回主程序前从堆栈中取出上述地址放回到指令计数器PC中(出栈或弹栈); 25*例:LCALL COUNT ;表示调用COUNT子程序 MOV A, DPTR断点保存与恢复的堆栈操作由CPU自动完成, 不需用户用指令进行堆栈操作。堆栈区26*图4-36 堆栈示意图入栈操作: 先SP+1SP, 指向栈顶上一个空单元, 然后把进栈内容压入SP所指单元中。出栈操作: 先弹出栈顶内容到直接寻址单元,然后SP-1SP,形成新的堆栈指针。位置:内部存储器的一部分区域专门用于堆栈数据存取规则:后进先出, 即最后存入的数据将被最先取

18、出。堆栈指针: SP始终指向栈顶。 SP-1SPESP指向栈顶SP+1SP 出栈后入栈后DPUSH addr8; POP addr8 ;栈操作指令 (2条) PUSH addr8; SPSP+1, 目的(SP)源(addr8) POP addr8;目的(addr8)源(SP), SPSP- 1分别完成两种堆栈操作: 入栈 (PUSH), 出栈(POP) 。注意:PUSH和POP成对出现,并注意顺序:后进先出。27*例: PUSH ACC ;保护累加器ACC中内容 PUSH PSW ;保护标志寄存器内容 ;执行其他程序 POP PSW ;恢复标志寄存器内容 POP ACC ;恢复累加器ACC中内

19、容 该程序执行后,累加器ACC和PSW寄存器中的内容可得到保护和正确的恢复。只能直接寻址间接寻址方式入栈出栈顺序错误会导致现场恢复错误若为: PUSH ACC PUSH PSW ;其他程序 POP ACC POP PSW 则执行后,将使得ACC和PSW中的内容互换。28*正确: PUSH ACC ;保护累加器ACC中内容 PUSH PSW ;保护标志寄存器内容 ;执行其他程序 POP PSW ;恢复标志寄存器内容 POP ACC ;恢复累加器ACC中内容出入栈规则:后进先出逻辑操作类29*堆栈用于保存临时数据、局部变量、中断或子程序的返回地址,关于堆栈的说法正确的是()堆栈设在内部RAM中。堆

20、栈可设在内部扩展RAM,即XRAM中。按照“先进后出”规律存放数据。按照“先进先出”规律存放数据ABCD提交理论上可将堆栈区域设置在内部RAM的00H FFH之间。E多选题1分30选择下面关于单片机的正确表述:单片机内部高128位数据RAM亦可作为堆栈区使用;单片机的堆栈区可以设置在内部RAM地址的30H7FH范围;特殊功能寄存器的值可压入堆栈;特殊功能寄存器都可以位寻址。ABCD提交逻辑操作类多选题1分保护断点, 保护现场 举例假设长调用指令LCALL Delay (机器码: 12H, 11H, 00H)在1000H存储器单元,如图所示。31*保护断点, 保护现场的执行过程示意图1000H1

21、2H1001H11H1002H00H1003H返回后执行代码1100H0C0H1101H0D0H1102H0C0H1103H0E0H1104H0D0H1105H0E0H1106H0D0H1107H0D0H1108H22H1109H地址 程序存储器PC现行PC即下一指令地址新PC07HR708H09H0AH0BHSP+1SPPSWACCSP+2SP+3SP+4PUSH ACCPUSH PSWRET地址 内部RAMLCALL DelayDelay地址POP ACCPOP PSW(ACC)=70H(PSW)=80HPC+1PC+2保护断点保护现场保护现场恢复现场10H03H80H70H堆栈区设执行d

22、elay前被调用子程略延迟程序保护断点, 保护现场 举例假设长调用指令LCALL Delay (机器码: 12H, 11H, 00H)在1000H存储器单元,如图所示。32*保护断点, 保护现场的执行过程示意图1000H12H1001H11H1002H00H1003H返回后执行代码1100H0C0H1101H0D0H1102H0C0H1103H0E0H1104H0D0H1105H0E0H1106H0D0H1107H0D0H1108H22H1109H地址 程序存储器PC现行PC即下一指令地址新PC07HR708H09H0AH0BHSP-3SP-4PSWACCSP-2SP-1SPPUSH ACCP

23、USH PSWRET地址 内部RAMLCALL DelayDelay地址POP ACCPOP PSW(ACC)=70H(PSW)=80HPC+1PC+2保护断点保护现场保护现场恢复现场10H03H80H70H恢复现场恢复断点返回堆栈区设执行delay前被调用子程省略程序返回PC数据传送类操作注意事项:除POP, MOV指令将数据送到PSW外, 传送操作一般不影响标志位。向A传送数据时, 会影响PSW的P标志。把源地址单元内容送到目的地址单元后,源地址单元中的内容不变。对特殊功能寄存器SFR操作必须用直接寻址(位寻址)。33*对STC15F2K60S2单片机内部RAM的80HFFH单元只能使用R

24、i间接寻址方式访问。将累加器A压入堆栈或弹出堆栈时, 应用PUSH ACC和POP ACC指令, 不能用PUSH A和POP A指令。否则, 程序编译会出错。因累加器写成A或ACC在汇编语言指令中有区别, 使用A, 表示使用寄存器寻址方式; 而使用ACC时, 表示使用直接寻址方式。4.5.2逻辑操作类指令(24条)逻辑操作类指令完成与、或、异或、清“0”、求反、左右移位等逻辑操作,共有24条。分类:单操作数和双操作数单操作数: 专对累加器A进行的逻辑操作, 包括: 清“0”、求反、左右移位等,操作结果保存在累加器A中。双操作数: 累加器A或直接寻址单元作为第一操作数和第二操作数之间的逻辑与、或

25、和异或操作,结果保存在A中或直接寻址单元中。第二操作数可以是立即数、寄存器Rn、内部数据RAM单元或者SFR。34*CLR A; CPL A; RL(C) A; RR(C) A9个助记符功能指令形式执行结果单操作数清0CLR A A0取反CPL A4位环移SWAP A带进位循环右移RRC A4.5.2逻辑操作类指令(24条)35*循环左移RL A带进位循环左移RLC A循环右移RR AAAAAA9个助记符数据传送类指令(数据交换指令)4.5.2逻辑操作类指令(24条)功能指令形式执行结果双操作数与()ANLORL A, XRL或()异或()36*#dataaddr8RiRnA#dataANLO

26、RL addr8, XRL addr8addr8 Y addr8addr8 Y addr8addr8 YY代表格式中第二操作数 AAX AAX AAXX代表格式中第二操作数9个助记符4.5.2逻辑操作类指令(24条)功能指令形式执行结果双操作数与()ANLORL A, XRL或()异或()37*#dataaddr8RiRnA#dataANLORL addr8, XRL addr8addr8Y addr8addr8 Y addr8addr8 YY代表格式中第二操作数 AAX AAX AAXX代表格式中第二操作数9个助记符见附录 E附表 E-34.5.2逻辑操作类指令(24条)功能指令形式执行结果

27、双操作数与()ANLORL A, XRL或()异或()38*#dataaddr8RiRnA#dataANLORL addr8, XRL addr8addr8Y addr8addr8 Y addr8addr8 YY代表格式中第二操作数 AAX AAX AAXX代表格式中第二操作数9个助记符数据传送类指令(数据交换指令)算术运算类*见附录 E附表 E-34.5.2逻辑操作类指令 对累加 器A进行的逻辑操作 对累加器A进行的逻辑操作包括清“0” 、求反和移位:1、累加器A清“0” CLR A ;A0,把00H送入累加器A中2、累加器A求反 CPL A ;A ,把累加器内容按位求反后送入累加器A中39

28、*例如,设累加器A原来内容为67H执行“CLR A”后将变成00H,再执行“CPL A”后将变为0FFH3、累加器A左右移位 RL A;累加器左循环移位 RLC A;累加器通过CY左循环移位 RR A;累加器右循环移位 RRC A;累加器通过CY右循环移位 SWAP A ;累加器高低半字节互换 左移一位相当于乘以2,右移一位相当于除以240*例 MOV A ,#01H;A01H RL A ;A02H RL A ;A04H RL A ; A08H 若继续执行下面指令: RR A ;A04H RR A ;A02H RR A ;A01H,累加器内容又变为1。 通过进位标志CY的移位可用于检查一个字节

29、中各位的状态或用于逐位输出的情况,也可构成多个字节的移位操作。,数据传送类指令(数据交换指令)3、累加器A左右移位【例4-3】 在40H和41H中存放一个双字节数据(即16位数据), 高位字节数据在41H中, 低位字节数据在40H中,试将其除以2。解: 利用循环右移指令可以将一个字节的数据除以2。如果将双字节数据除以2,可以考虑使用带进位标志CY的循环右移指令。程序代码如下: CLR C ;先将进位标志清零, 为第一次移位做准备 MOV A, 41H RRC A MOV 41H, A ;高位字节 MOV A, 40H RRC A MOV 40H, A41*A (41H)A (40H)D0(41

30、H)001H02HD000H81H假设(41H)= 01H, (40H)= 02H : 258D0081H:129111 双操作数逻辑操作指令42*逻辑操作是按位进行的。“ANL”指令常用来屏蔽字节中的某些位, “某位 ANL 0 ” 则该位清0; “某位 ANL 1 ”则该位值不变;“ORL”指令常用来使字节中的某些位置1, “某位 ORL 1 ”则该位置1, “某位 ORL 0 ”则该位值不变;“XRL”指令用来对字节中某些位取反, 某位 “异或” 1则该位取反,某位 “异或” 0保留该位不变 0110 0011 1111 0000 0110 0000 0110 0011 1111 000

31、0 1111 0011 0110 0011 1111 0000 1001 0011 双操作数逻辑操作指令例如,设A的内容为63H,R2为0AAH,分别执行命令(ANL、ORL、XRL)后,结果如下: ANL A, R2 ;结果A=22H ORL A, R2 ;结果A=0EBH XRL A, R2 ;结果A=0C9H43*A=0C9H 0110 0011 1010 1010 0010 0010 0110 0011 1010 1010 1110 1011 0110 0011 1010 1010 1100 1001A=22HA=0EBH 双操作数逻辑操作指令例如,设50H单元的内容为0AAH, A中

32、内容为15H, 则分别执行下面指令时的结果如下: ANL 50H, #0F0H ; (50H)0F0H=0AAH 0F0H;结果(50H)=0A0H, 屏蔽50H单元的低4位(清零) ORL 50H, #0FH ; (50H) 0F0H=0AAH 0FH ;结果(50H)= 0AFH,将50H单元的低4位置1 XRL 50H, A ;(50H)(A),结果(50H)=0BFH 44* 1010 1010 0001 0101 1011 1111 双操作数逻辑操作指令当用逻辑与、或、异或指令修改一个并行I/O口输出内容时,则原始值将从该输出口的锁存器中读取,而不是从该输出口的引脚上读取。45*OR

33、L P0, #0FH 例:若原(P0输出锁存器)=32H, (P0引脚状态)=0C2H, 则执行下面指令后(P0输出锁存器)=3FH , (P0引脚状态)=0C2H(不变)。运算输入是(P0输出锁存器)=32H或80H然而执行:ORL A, P0 若 (A)=0FH, 则执行上面指令后(P0输出锁存器)=32H (不变), (P0引脚状态)=0C2H (不变), (A)= 0CFH 。运算输入是(P0引脚状态)=0C2H准双向口工作模式的结构准双向口有3个上拉场效应管T1,T2,T3, 以适应不同需要。其中,T1称为强上拉, 上拉能力可达20mA; T2称为极弱上拉, 上拉能力一般为30A;

34、T3称为弱上拉, 一般上拉能力为150A250A, 典型值为200A。输出低电平时,最大灌电流可达20mA。*46强极弱弱P0P5【例4-4】 设两位用ASCII码表示的数分别保存在40H、41H单元中, 编程把其转换成两位BCD数, 并以压缩形式存入40H单元中。 解: 方法一: ANL 40H, #0FH ;40H的ASC码变成BCD码 ANL 41H, #0FH ; 41H的ASC码变成BCD码 MOV A, 41H;在A中将(41H)左移4位后与(40H)组合 RL A ;该行起A左移4位 RL A RL A RL A ORL 40H, A ;合并结果存40H单元中 双操作数逻辑操作指

35、令47*数字09的ASCII: 30H39HSWAP A假设: (40H)=32H, (41H)=39H,方法二(40H)=02H(A)=09H(41H)=09H(A)=90H(40H)=92H压缩BCD码(92H)BCD 双操作数逻辑操作指令【例4-4】方法二:使用SWAP指令会使程序更简炼。 ANL 40H, #0FH ;40H的ASC码变成BCD码 MOV A, 41H ; ANL A, #0FH ;41H的ASC码变成BCD码 SWAP A ;高、低4位交换 ORL 40H, A ;结果存40H单元中48*4.5.3算术运算类指令 (24条)指令助记符影响标志备注CYOVACADD(加

36、) “”表示可置1或清“0”,“0”表示总清“0”空表示不构成影响ADDC(带进位加)SUBB(带借位减)MUL(乘)0DIV(除)0DA(二十进制调整)49* 该类指令主要完成加、减、乘、除四则运算,以及增量、减量和二十进制调整操作。除增量、减量指令外,大多数算术运算指令会影响到状态标志寄存器PSW。表4-3 算术运算类指令对标志的影响INCDEC8个助记符4.5.3算术运算类指令 (24条)50*8个助记符 该类指令主要完成加、减、乘、除四则运算,以及增量、减量和二十进制调整操作。除增量、减量指令外,大多数算术运算指令会影响到状态标志寄存器PSW。见附录 E附表 E-24.5.3算术运算类

37、指令 (24条)51*8个助记符 该类指令主要完成加、减、乘、除四则运算,以及增量、减量和二十进制调整操作。除增量、减量指令外,大多数算术运算指令会影响到状态标志寄存器PSW。位操作*见附录 E附表 E-2 加减运算指令 (12条)52*1、加法指令:(4条) ADD A, #data8 ;AA+#data8 ADD A, addr8 ;AA+(addr8) ADD A, Ri ;AA+(Ri) ADD A, Rn ;AA+Rn把源字节变量与累加器相加, 结果保存在累加器中。在加减运算指令中,以累加器A为第一操作数,并存放操作后的结果。第二操作数可以是立即数、工作寄存器、寄存器间接寻址字节或直

38、接寻址字节。运算结果会影响溢出标志OV、进位CY、辅助进位AC和奇偶标志P。1、加法指令:(4条)例, MOV A, #0C3H ; -61的补码送A ADD A, #0AAH; 加-86的补码运算后,CY=1, OV=1, AC=0, A=6DH, PSW=85H 溢出标志OV取决于带符号数运算,和的第6、7位中有一位产生进位而另一位不产生进位,则使OV置1,否则OV被清0。OV=1产生溢出。53* 1100 0011+ 1010 1010 10110 1101位号D7D6D5D4D3D2D1D0符号CYACF0RS1RS0OVF1P1 0 0 0 0 1 0 1执行指令: ADDC A,

39、R0 运行结果: A=0000 0000B, AC=1,CY=1,OV=02、带进位加法指令 (4条) ADDC A, #data8 ;AA+#data 8 +CY ADDC A, addr8 ;AA+(addr8) +CY ADDC A, Ri ;AA+(Ri) +CY ADDC A, Rn ;AA+Rn +CY 除了相加时把进位位也加上外,其他与一般加法指令完全相同。54*例, 设累加器A内容为0AAH(-86补码), R0内容为55H, C内容为1, 1010 1010+ 0101 0101 1111 1111+ 1 10000 0000 2、带进位加法指令(4条)【例4-5】设双字节加

40、法中,被加数放20H、21H单元,加数放30H、31H单元,和存放在40H、41H单元,若高字节相加有进位则转OVER处执行。试编程实现之。 解:程序代码如下:55*ADDM: MOV A, 20H;取低字节被加数ADD A, 30H;低位字节相加,进位C MOV 40H, A;结果送40H单元 MOV A, 21H;取高字节被加数 ADDC A, 31H;加高字节和低位来的进位 MOV 41H, A ;结果送41H单元, 高位字节进位C JC OVER ;若有进位,则转OVER处执行 OVER: 低字节高字节 (21H) (20H) +(31H) (30H) (41H) (40H) 3、带借

41、位减指令(4条) SUBB A, #data8 ;AA #data8 CY SUBB A, addr8 ;AA(addr8) CY SUBB A, Ri ;AA (Ri) CY SUBB A, Rn ;AA Rn CY 在加法中,CY=1表示有进位,CY=0表示无进位; 在减法中,CY=1则表示有借位,CY=0表示无借位。56*OV=1表示带符号数相减时, 从一个正数中减去一个负数得出了一个负数(如3H-80H)或从一个负数中减去一个正数时得出一个正数的错误情况(如80H-2H) 。和加法类似, 该标志也是由运算时,差的第6、7位两者借位状态经异或操作而得。因减法只有带借位减一条指令, 所以在

42、首次进行单字节相减时, 须先清借位位CY, 以免相减后结果出错。结果超出了符号数的表示范围 0000 0011- 1000 0000 1000 00113、带借位减指令(4条)例如,设累加器A的内容为D9H,R0的内容为87H,求两者相减结果。 CLR C SUBB A, R0执行结果:A=52H,CY=0,OV=0 若运算两数为无符号数,则其溢出与否和OV状态无关,而靠CY是否为1予以判别,OV仅表明带符号数运算时是否溢出。57* 1101 1001 1000 0111 0101 0010若是带符号数-27H-79H52HD9H- 87H3、带借位减指令(4条)【例4-6】 两字节数相减,

43、设被减数放在20H、21H单元,减数放在30H、31H单元, 差放在40H、41H单元。若高字节相减有借位则转OVER处执行, 试编程实现之。解:程序代码如下:58*SUBM: CLR C ;低字节减之前借位CY清0 MOV A, 20H ;被减数送A SUBB A, 30H ;低位字节相减 MOV 40H, A ;结果送40H单元 MOV A, 21H ;被减数高字节送A SUBB A, 31H ;高字节相减 MOV 41H, A ;结果送41H单元 JC OVER ;若有借位, 则转OVER处执行 OVER: 低字节高字节 (21H) (20H) - (31H) (30H) (41H) (

44、40H) 乘除运算指令(2条)乘除运算指令在累加器A 和寄存器B之间进行,运算结果保存在累加器A和寄存器B中。59*1、乘法指令(1条)乘法指令: MUL AB把累加器A 和寄存器B中的8位无符号整数相乘;16位乘积低字节在累加器A中,高字节在寄存器B中;若乘积大于255 (0FFH), 则溢出标志位置 “1”, 否则清 “0”, 运算结果总使进位标志CY清“0” 。乘法指令可以竖式表示:1、乘法指令(1条)例如,设A=82H(130),B=38H(56),执行指令: MUL AB结果: 乘积为1C70H (7280), A=70H, B=1CH,OV=1, CY=060*例4-7 用单字节乘

45、法指令进行多字节乘法运算。设双字节数低8位存放在30H, 高8位存放在31H单元, 单字节数存放在40H单元, 编程实现双字节乘以单字节的运算, 乘积按由低位到高位依次存放在50H, 51H, 52H单元中。 解:双字节数乘以单字节数, 设双字节数用X2X1表示, 单字节数用Y表示, 则其乘法可表示为: ( X228+X1 )Y=X2Y28+X1Y (31H) (30H) (40H) (52H)(51H)(50H) 最终结果在:若乘积大于255 (0FFH), 则溢出标志位置 “1”。( X228+X1 ) Y=X2Y28+X1Y利用MUL指令分别进行X2Y和X1Y的乘法运算,然后把等号右边两

46、项移位相加即得其积。可以使用下面的竖式表示:61*其中, “(X1Y)低” 表示的是X1和Y乘积的低8位, 其他符号代表的含义类似。RES0就是“(X1Y)低” , 即最后结果的最低位;RES1是“(X1Y)高 + (X2Y)低”(的结果;RES2是“(X2Y)高” 和由“(X1Y)高 + (X2Y)低” 产生的进位相加的结果。例4-7程序代码 MOV A, 30H MOV B, 40H MUL AB ;X1Y MOV 50H, A ;积低字节存50H MOV 51H, B ;积高字节存51H MOV A, 31H MOV B, 40H MUL AB ;X2Y ADD A, 51H ;X2Y低

47、8位与X1Y高8位相加作为积的第二字节 MOV 51H, A MOV A, B ;乘积最高字节送A以便与低位进位C相加 ADDC A, #00H ;作用:将C与A相加,最高字节加低位进位C MOV 52H, A ;最高字节存52H单元62*(X228+X1)Y=X2Y28+X1Y52H, 51H, 50H (31H) (30H) (40H) (52H)(51H)(50H) BABAABAB可能向高位产生进位C2、除法指令(1条)除法指令: DIV AB 该指令把累加器A中的8位无符号整数除以寄存器B中8位无符号整数, 所得结果的商放在累加器A中,余数在寄存器B中, 63*注意: 若除数(B中内

48、容)为0H, 则执行后结果为不定值, 并置位溢出标志OV。例, 设A内容为147(93H), B内容为13(0DH), 则执行命令: DIV AB 执行结果:A=0BH,B=04H,OV=0,CY=0若除数(B中内容)不为0标志位CY和OV均清“0” 。 增量、减量指令(9条)增量指令完成加1运算,减量运算完成减1运算。这两条指令均不影响标志位(INC A, DEC A 影响标志P)。1、增量指令(5条) INCA;A A+1 INCaddr8;(addr8) (addr8) +1 INCRi ;(Ri) (Ri) +1 INCRn;Rn Rn+1 INCDPTR;DPTR DPTR+164*

49、1、增量指令(5条)注意: INC指令将指定变量加1,结果送回原地址单元,原来内容若为0FFH,加1后将变成00H,运算结果不影响任何标志位(INC A 影响奇偶标志位P)。例如,设R0=7EH,内部数据RAM中 (7EH) =0FFH, (7FH) =40H,则执行指令: INC R0 ; (7EH) 00H INC R0 ;R0 R0+1,执行后,R0=7FH INC R0 ; (7FH) 41H65*2、减量指令(4条) DECA;A A - 1 DECaddr8;(addr8) (addr8) - 1 DECRi;(Ri) (Ri) - 1 DECRn;Rn Rn - 1注意: DEC

50、指令将指定变量减1, 结果送回原地址单元, 不影响任何标志位, 原内容若为00H, 减1后变成0FFH。66*例如程序:MOV 7EH, #00H ; (7EH) 00H DEC 7EH ; (7EH) 0FFH 00H -1DEC 7EH ; (7EH) 0FFH -1(DEC A 影响奇偶标志位P)2、减量指令(4条) DECA;A A - 1 DECaddr8;(addr8) (addr8) - 1 DECRi;(Ri) (Ri) - 1 DECRn;Rn Rn - 1注意: DEC指令将指定变量减1, 结果送回原地址单元, 不影响任何标志位, 原内容若为00H, 减1后变成0FFH。6

51、7*例如程序:MOV R1, #7FH ; (R1) 7FH MOV 7EH, #00H ; (7EH) 00H MOV 7FH, #40H ; (7FH) 40H DEC R1 ; (7FH) 3FH 40H -1DEC R1 ; (R1) 7EH 7FH -1DEC R1 ; (7EH) 0FFH 00H -1(DEC A 影响奇偶标志位P)(若A=0, DEC A 后, A中还是偶数个1, 不影响P) 二十进制的加法的调整指令(1条)指令如下: DA A该指令的调整条件和方法:若A3-09或AC=1, 则A3-0A3-006H;若A7-49或CY=1, 则A7-4A7-46H(A7-0A

52、7-060H)。若两个条件同时满足或者A7-4=9且低4位修正有进位,则A7-0A7-066H。68*DA指令使用说明是对二十进制加法进行调整的指令。两个压缩型BCD码按二进制数规则相加, 须经本条指令调整后才能得到压缩型的BCD码和数。 1000 0111+ 0110 1000 1110 1111+ 0110 0110 10101 01018768CY原因:压缩BCD码要求按照十进制规则运算、进位, 但计算机只能按照16(二)进制规则运算、进位。EF66155MOV A, 68HADD A, 87HDA A DA指令使用说明因指令要用AC、CY等标志位才能起到正确的调整作用, 因此它需跟在加

53、法(ADD, ADDC)指令后面使用。若该指令前无加法指令, (不)能用DA A完成累加器A内容的二十进制转换。对用户而言,只要保证参加运算的两数为BCD码, 并先对BCD码执行二进制加法运算(用ADD, ADDC指令), 然后紧跟一条DA A指令即可。DA A指令不能对减法进行十进制调整。DA指令不清除标志位C, 若高4位有进位, 则置C为1,否则, 不改变进位标志C。69* 二十进制调整指令70*例4-8 设计6位BCD码加法程序。设被加数在内部RAM中32H, 31H, 30H单元, 加数在42H, 41H,40H单元, 相加和放在52H, 51H, 50H单元, 忽略加后最高位进位(溢

54、出)。解:程序代码如下:BCDADD:MOV A, 30H ;第一字节加 ADD A, 40H DA A MOV 50H,A ;存第一字节和(BCD码) MOV A, 31H ;第二字节加 ADDC A, 41H DA A MOV 51H, A ;存第二字节和(BCD码) MOV A, 32H ;第三字节加 ADDC A, 42H DA A MOV 52H,A ;存第三字节和(BCD码)低字节 (32H)(31H)(30H) +(42H)(41H)(40H) (52H)(51H)(50H) 二十进制调整指令【例4-9】假设有两个十进制数,被减数保存在30H单元,减数保存在40H单元。编程实现二

55、者的减法运算, 结果存50H单元中。解: 利用十进制加法调整指令进行十进制减法调整, 必须采用补码相加的方法, 用9AH(即十进制100)减去减数即得以10(每位, 两位为100)为模的减数补码。程序代码如下:BCDSUB:CLR C ;清进位位MOV A, #9AH ;求减数补码SUBB A, 40H ;(40H)中是减数 ADD A, 30H ;进行补码相加DA AMOV 50H, A ;结果(差)存50H单元71*讨论: 被减数大于减数时, 结果容易理解;被减数小于减数时, 结果可看成向百位借位而得到的结果; 或将A再求补码即得绝对值: (9AH-(A);再处理符号位(见下页)参见4.9

56、 节 “多字节十进制BCD码减法”无十进制减法调整指令设(30H)=67H, (40H)=56H设(30H)=56H, (40H)=67H4-6-4 二十进制调整指令【例4-9】编程实现两个十进制数减法运算,被减数存在30H单元,减数存在40H,结果存50H, 符号位标志存49H。72*解: 程序代码如下:BCDSUB:CLR C ;清进位位MOV A, #9AH ;求减数补码SUBB A, 40H ADD A, 30H ;进行补码相加DA AMOV 50H, A ;结果(差)的绝对值存50H单元 MOV 49H, #0H ;结果(差)的正符号位存50H单元 JNC BCDCPL ;减法化为补

57、码加法无进位则结果为负 LJMP BCDEXITBCDCPL:MOV A, #9AH ;求减数补码, 对负结果求补 SUBB A, 51H; 对负结果求补: 9AH-(A) MOV 49H, #01H ;结果(差)的符号位存49H单元 MOV 50H, A ;结果(差)的绝对值存50H单元BCDEXIT:RET设(30H)=67H, (40H)=56H设(30H)=56H, (40H)=67H4.5.4 位操作指令(17条) 位操作指令以位作为处理对象,共17条。 位地址表示方式有:直接用位地址(例20H)表示;字节地址加位号表示,如0B8H.0 (IP.0),20H.1等。对位寻址寄存器,

58、可用字节寄存器名加位号来表示, 例如P1.0,PSW.4等。位寄存器的定义名称(见附录B: STC15.INC,图3-10可位寻址的SFR中的位地址), 如C (PSW.7)、EA (IE.7)等。用户使用伪指令事先定义过的符号地址。73*6个助记符, 另5个与字节操作相同位寻址区-图3-10特殊功能寄存器SFR中位地址*特殊功能寄存器SFR中位地址范围: 80H0FFH。图3-10 可位寻址的特殊功能寄存器中的位地址74字节地址能被8整除的特殊功能寄存器SFR,其各位都可按位寻址。80HF8H88H90H98HA0HA8HB0HB8HC0HC8HD0HD8HE0HE8HF0H表4-4 位操作

59、指令的操作码助记符及对应的操作数4.5.4 位操作指令(17条)75*操 作功 能操作码操作数备注位传送MOVC, bit 或bit, C源地址和目的地址可互换位状态控制位清零CLRC或 bitbit表示直接寻址位位取反CPL位置位SETB位逻辑操作与ANLC, bit CC, /bit CCbitC; C/bitCCbitC; C/bitC或ORL位跳转判C判移JCrelrel为相对偏移量JNC判直接寻址位转移JBbit,relJNB为“0”转移,JB为“1”转移JNBJBCJBC寻址位为1转移并清“0”该位6个助记符, 另5个与字节操作相同4.5.4 位操作指令(17条)76*6个助记符,

60、 另5个与字节操作相同见附录 E附表 E-54.5.4 位操作指令(17条)77*6个助记符, 另5个与字节操作相同转移类*见附录 E附表 E-5*图3-10 内部RAM中的位地址20H2FH之间单元既可按字节存取, 也可按位存取,共128位, 位地址范围: 00H7FH。位寻址区78位寻址 : MOV C, 20H直接寻址 : MOV A, 20H字节地址: 20H位寻址区-图3-11特殊功能寄存器SFR中位地址:*特殊功能寄存器SFR中位地址范围: 80H0FFH。图3-11 可位寻址的特殊功能寄存器中的位地址79字节地址能被8整除的特殊功能寄存器SFR,其各位都可按位寻址。 位传送指令(

温馨提示

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

评论

0/150

提交评论