系列单片机指令系统和汇编语言程序示例.ppt_第1页
系列单片机指令系统和汇编语言程序示例.ppt_第2页
系列单片机指令系统和汇编语言程序示例.ppt_第3页
系列单片机指令系统和汇编语言程序示例.ppt_第4页
系列单片机指令系统和汇编语言程序示例.ppt_第5页
已阅读5页,还剩118页未读 继续免费阅读

下载本文档

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

文档简介

单片微机原理及应用教学课件,第三章 51系列单片机指令系统和汇编语言程序示例,本重点: 寻址方式; MCS-51指令集; 伪指令; 汇编语言与简单程序设计.,它通过单片机的内部总线,将单片机内部的各个部分:程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等联系在一起 。,内部总线有三种,数据总线:专门用来传送数据信息 。,地址总线:专门用来传送地址信息,选中各操作单元。,控制总线:专门用来传送CPU各种控制命令,以便CPU统一指挥协调工作。完成程序所要执行的各种功能。,程序计数器PC(program Counter),程序计数器在物理上是独立的,它不属于特殊内部数据存储器块中。 PC是一个16位的计数器,由两个八位寄存器PCH和PCL组成,用于存放一条要执行的指令地址,寻址范围为64kB(ROM),PC有自动加1功能,即完成了一条指令的执行后,其内容自动加1。 PC本身并没有地址,因而不可寻址,用户无法对它进行读写,但是可以通过转移、调用、返回等指令改变其内容,以控制程序的执行顺序。,CPU执行程序一般包括两个主要过程,第一,就是从程序存储器中取出指令,指令的地址由PC指针提供。,第二,就是执行指令过程,取出的指令代码首先被送到CPU中控制器中的指令寄存器,再通过指令译码器译码变成各种电信号,从而实现指令的各种功能。,执行,取指令,分析,3.1 51系列单片机指令系统概述,3.1.1指令与指令系统的概念,汇编语言:由于机器语言不便被人们识别、记忆、理解和使用,因此给每条机器语言指令赋予助记符号来表示,这就形成了汇编语言。,指令:是使计算机内部执行的一种操作,提供给用户编程使用的一种命令。,机器语言:由构成计算机的电子器件特性所决定,计算机只能识别二进制代码。以二进制代码来描述指令功能的语言,称之为机器语言。,也就是说,汇编语言是便于人们识别、记忆、理解和使用的一种指令形式,它和机器语言指令一一对应,也是由计算机的硬件特性所决定的。,指令系统:计算机能够执行的全部操作所对应的指令集合,称为这种计算机的指令系统。,指令系统全面展示出了计算机的操作功能,也就是它的工作原理;从用户使用的角度来看,指令系统是提供给用户使用计算机功能的软件资源。要让计算机处理问题,首先要编写程序。编写程序实际上是从指令系统中挑选一个指令子集的过程。,单片微机原理及应用教学课件,指令一般有功能、时间和空间三种属性。,51系列单片机指令集含有111条指令,每条指令在执行时要花去一定的时间,以机器周期为单位。按指令执行时间分类: 单周期(64条);双周期(45条);4周期(2条),按指令的功能分类,可分为5大类: 数据传送类(29条);算术运算类(24条) 逻辑运算及移位类(24);控制转移类(17条) 位操作类(17条),每条指令在程序存储器ROM中占据一定的空间,以字节为单位。按指令所占字节数分类: 单字节(49条);双字节(46条);3字节(16条),指令的描述形式有两种:机器语言形式和汇编语言形式。现在描述计算机指令系统及实际应用中主要采用汇编语言形式。,目标程序:采用机器语言编写的程序称之为目标程序。,源程序:采用汇编语言编写的程序称之为源程序。,汇编有两种方式:机器汇编和手工汇编。机器汇编是用专门的汇编程序,在计算机上进行翻译;手工汇编是编程员把汇编语言指令逐条翻译成机器语言指令。现在主要使用机器汇编。,汇编:计算机能够直接识别并执行的只有机器语言。汇编语言程序不能被计算机直接识别并执行,必须经过一个中间环节把它翻译成机器语言程序,这个中间过程叫做汇编。,目前,比较流行C语言单片机。C语言具有移植性强,具有通用性,阅读性好等特点,因此得到广泛应用。用C语言编写单片机程序,编译软件是先把C程序编译成汇编语言,在把汇编语言翻译成机器语言。 汇编的特点:简洁,准确,生成代码质量高。我们学习以汇编为主,今后应用,鼓励大家用C。,单片微机原理及应用教学课件,ASM-51指令的格式,方括符 表示可选项 标号代表指令所在的首地址,在跳转、调用时常常用到,1-8个字母/数字,“:”结尾 操作码就是指令功能助记符,指令实体 目的操作数 源操作数(无操作数,单操作数,双操作数) 注释,以“;”开头,标号:操作码 目的操作数,源操作数;注释,3.1.2 MCS-51单片机指令系统及其指令格式,指令描述符号介绍,Rn当前选中的寄存器区中的8个工作寄存器R0R7(n=07)。 Ri当前选中的寄存器区中的2个工作寄存器R0、R1(i=0,1)。 direct 表示直接寻址的地址,一般指片内低128字节RAM或SFR。 #data包含在指令中的8位常数。 #data16包含在指令中的16位常数。 addr1616位直接地址,现在长以标号地址代替。 addr1111位直接地址,现在长以标号地址代替。,rel8位带符号的偏移字节,简称偏移量,现在长以标号地址代替。 DPTR数据指针,可用作16位地址寄存器。 bit内部RAM或专用寄存器中的直接寻址位。 A累加器。 B专用寄存器,用于乘法和除法指令中。 C进位标志或进位位,或布尔处理机中的累加器。,间址寄存器或基址寄存器的前缀,如Ri,DPTR。 / 位操作数的前缀,表示对该位操作数取反,如/bit。 ()片内RAM的直接地址或寄存器中的内容。 ()表示以单元的内容为地址的存储器单元中的内容,即(X)作地址,该地址单元中的内容用(X)表示。所以X只能是Ri/SP所对应的地址。 箭头左边的内容被箭头右边的内容所代替。,单片微机原理及应用教学课件,1、立即寻址 操作数直接在指令中给出。 例:MOV A,#64H ;(A) 立即数 64H ADD A,#05H ;(A)(A)+立即数 05H 注意:符号“#”表明其后跟的是立即数, 立即数就是数字量本身,存放在ROM区。,单片微机原理及应用教学课件,2、寄存器寻址 从寄存器中读取操作数或存放操作数进寄存器 例:MOV A,B ; (A) (B) MOV 30H,R0 ;(30H)(R0) MOV A,R1 ; (A) (R1),寄存器寻址方式的寻址范围: 1) 4个工作寄存器组共32个通用寄存器(在指令中只能使用当前寄存器组) 2) 部分特殊功能寄存器。如A,B,DPTR。注意: (1)寄存器B只有在执行乘除法指令时才是寄存器寻址方式; (2)累加器A有三种表示方式:A、ACC、0E0H,它们分别属于不同的寻址方式,A为寄存器寻址,ACC、0E0H属于直接寻址。 (3)DPTR:程序中写DPTR则为寄存器寻址;如果程序中写DPH(83H)和DPL(82H),则为直接寻址。,单片微机原理及应用教学课件,3、直接寻址 指令中直接给出了操作数所在单元的地址或名称 例:MOV R1,1FH ;(R1) (1FH) MOV 30H,4AH ;(30H)(4AH),在本单片机中规定:访问特殊功能寄存器SFR只能采用直接寻址方式。例如: MOV A, SP ; (A) (SP) MOV A, 81H ; (A) (SP) MOV P1, #5AH ; (P1)(#5AH) MOV 90H,#5AH ; (P1)(#5AH) MOV B, 30H ; (B) (30H),相同,相同,直接寻址方式可访问的范围 -direct,1) 特殊功能寄存器。 这部分存储单元既可以用单元地址给出,也可以用寄存器符号的形式给出。如:MOV A, 90H 或 MOV A, P1为同一条指令的两种写法。 (A、B、DPTR除外,前面已说明) 2) 内部数据存储器的低128个字节单元。 直接以单元地址的形式给出(00H-7FH)。对于8032/8052等单片机,其内部高128字节RAM(80HFFH)不能用直接寻址方式访问。,单片微机原理及应用教学课件,4、寄存器间接寻址 寄存器中的内容是一个地址,由该地址单元 寻址到所需的操作数,注意: 1)“间接”表示某寄存器中的“内容”只是一个“单元地址”,这个地址单元中存放的数据才是要找的“操作数”。 2)符号“”表示“在”,其含义与读音皆同“at”。,例: MOV R1,#80H ;(R1) 立即数80H MOV R1,#2FH ;(80H)立即数2FH MOV A,R1 ;(A)(R1)=2FH,图3.1 寄存器间接寻址示意图,单片微机原理及应用教学课件,52系列单片机有256字节的片内RAM,其中的80H0FFH的RAM与SFR所占地址重叠。,MOV A, 90H 等效于 MOV A, P1 属直接寻址 MOV A, R0 ;事先已知 (R0) = #90H 执行的操作:A (90H) 属寄存器间接寻址, 随意写的指令如:MOV A, 85H 则是非法的!,于是规定: 80H0FFH范围内的RAM只能用寄存器间接寻址方式,而SFR只能用直接寻址方式。从而解决了地址冲突的问题。例如:,单片微机原理及应用教学课件,存储器配置(片内RAM),89C51片内RAM 128字节(00H7FH) 89C52片内RAM 256字节(00H0FFH),00H,20H,2FH,7FH,1FH,30H,80H,FFH,52子系列才有 的RAM区,普通RAM区,位寻址区,工作寄存器区,SFR分布在80H-FFH 其中92个位可位寻址,80H,FFH,89C51 128字节,89C52 256字节,只能直接寻址,那么对于这高128的RAM如何访问?(间址),可以直接寻址,小结: 1、对低128B的RAM可以采用直接寻址,或寄存器间接寻址方式进行读写。 2、对于高128B的RAM只能采用寄存器间接寻址方式进行读写。 3、对SRF只能采用直接寻址方式进行读写,常常采用助记符。,单片微机原理及应用教学课件,5、变址寻址 也称为: 基址寄存器+变址寄存器间接寻址,以16位的地址指针寄存器DPTR或PC寄存器(16位)为基址寄存器,以累加器 A 为变址寄存器,两者中的“内容”形成一个16位的“地址”,该“地址”所指的存储单元中的内容才是操作数。,例:MOV A,#0A4H MOV DPTR,#1234H MOVC A,A+DPTR;(A)(A)+(DPTR) 操作:将A4H+1234H=12D8H单元中的数放进累加器A MOVC A,A+PC;(A)(A)+(PC) 单字节指令,单片微机原理及应用教学课件,6、相对寻址(P.58) 当前PC值加上指令中规定的偏移量 rel,构成实际的操作数地址 例: JZ rel ;累加器A为零,则转移到rel 目的地址=当前PC值+rel = 指令存储地址+指令字节数(2)+rel,注意: 1)当前PC值 :指相对转移指令的存储地址加上该指令的字节数。例如:JZ rel 是一条累加器A为零就转移的双字节指令。若该指令的存储地址为2050H,则执行该指令时的当前PC值即为2052H。即当前PC值是对相对转移指令取指结束时的值。,注意: 2)符号“rel”表示“偏移量”,是一个带符号的单字 节数,范围是:-128+127(80H7FH),负数表示从当前地址向前转移,正数表示从当前地址向后转移。,在实际编程中,“rel” 通常用标号代替,单片微机原理及应用教学课件,7、位寻址 指令中直接给出了操作数所在的位地址。 例: CLR P1.0 ;(P1.0) 0 SETB ACC.7 ;(ACC.7) 1 CPL C ;( C ) NOT( C ),注意: 1)位地址里的数据只可能是一个 0 或 1 2)有的位地址十分明确,如 P1.0, ACC.7等, 有的位地址则“不太明确”,如: MOV A,17H ; (A)(17H),17H是字节地址 MOV ACC.0,17H ;(ACC.0)(17H),这里ACC.0 是位地址所以该指令中的17H是22H单元的第7位,单片微机原理及应用教学课件,片内RAM中有128个位可按位寻址的位,位地址:00H7FH分布在:20H2FH单元; 另外,在SFR中还有92个位可按位寻址,00H,20H,2FH,7FH,1FH,30H,80H,FFH,52子系列才有 的RAM区,普通RAM区,位寻址区,工作寄存器区,27H,22H,21H,20H,26H,24H,25H,23H,28H,07 06 05 04 03 02 01 00,0F 0E 0D 0C 0B 0A 09 08,17 16 15 14 13 12 11 10,1F 1E 1D 1C 1B 1A 19 18,27 26 25 24 23 22 21 20,2F 2E 2D 2C 2B 2A 29 28,37 36 35 34 33 32 31 30,3F 3E 3D 3C 3B 3A 39 38,47 46 45 44 43 42 41 40,2FH,7F 7E 7D 7C 7B 7A 79 78,位地址,总共128个可按位寻址的位,单元地址,17,D7 D6 D5 D4 D3 D2 D1 D0,单片微机原理及应用教学课件,MCS-51指令集,功能分五类,共111条指令,单片微机原理及应用教学课件,MCS-51指令集(五大类功能),数据传送类指令: (29条) 算术运算类指令: (24条) 逻辑运算及移位类指令: (24条) 控制转移类指令: (17条) 位操作(布尔操作)类指令:(17条),3.3 数据传送类指令,3.3.1 访问片内数据存储器的 一般数据传送指令,其格式如下: MOV ,; 目的操作数单元源操作数(或单元) 该类指令的功能是实现数在片内RAM单元之间、寄存器之间、寄存器与RAM单元之间的传送。目的操作数和源操作数不同寻址方式的组合就派生出该类的全部16条指令。,图3.3 访问片内RAM的一般传送指令操作关系图,根据片内RAM的一般传送指令操作关系图 ,写出16条指令,例1、设内部RAM(30H)=40H,(40H)=10H,(10H)=00H,(P1)=CAH,分析下面程序。P.60 MOV R0,#30H MOV A,R0 MOV R1,A MOV B,R1 MOV R1,P1 MOV P2,P1 MOV 10H,#20H 结果:(R0)= ,(R1)=(A)= , (B)= ,(40H)=(P1)=(P2)= ,(10)= ;,例1、设内部RAM(30H)=40H,(40H)=10H,(10H)=00H,(P1)=CAH,分析下面程序。P.60 MOV R0,#30H MOV A,R0 MOV R1,A MOV B,R1 MOV R1,P1 MOV P2,P1 MOV 10H,#20H 结果:(R0)=30H,(R1)=(A)=40H, (B)=10H,(40H)=(P1)=(P2)=CAH,(10)=20H,3.3.2 片内特殊传送指令 1堆栈操作指令 堆栈操作有进栈和出栈,即压入和弹出数据,常用于保存或恢复现场。进栈指令用于保存片内RAM单元(低128字节)或特殊功能寄存器SFR的内容;出栈指令用于恢复片内RAM单元(低128字节)或特殊功能寄存器SFR的内容。堆栈指针寄存器SP,直接地址为81H,复位后(SP)=(81H)=07H。堆栈段一般设在片内RAM30H到7FH区域内。,单片微机原理及应用教学课件,2、 堆栈操作指令(2条):,PUSH压栈指令,POP 弹栈指令,堆栈区由特殊功能寄存器堆栈指针SP 管理 堆栈区可以安排在片内RAM单元(低128字节)任意位置,一般不安排在工作寄存器区和可按位寻址的RAM区,而是放在RAM区的靠后的位置 堆栈总是指向栈顶 通常PUSH与POP两条指令成对使用,PUSH direct ;(先加1,再入) 1)(SP)(SP)+ 1 修改指针,使其指向栈顶上的一个存数单元; 2)(SP)direct 把直接地址单元的内容压入SP所指单元内。 POP direct ; (先出,再减1) 1)(direct)(SP) 把栈顶的数据弹出到直接寻址单元中去; 2)(SP)(SP)-1 修改指针,指向新栈顶; 这两条指令都是双字节指令,机器码分别为: C0 direct 和D0 direct。(先入,先出),例2 若在外部程序存储器中2000H单元开始依次存放09的平方值,数据指针(DPTR)=3A00H,用查表指令取得2003H单元的数据后,要求保持DPTR中的内容不变。,MOV A,#03H PUSH DPH PUSH DPL MOV DPTR,#TAB MOVC A,A+DPTR POP DPL POP DPH 执行结果:(A)09H,(DPTR)=3A00H。,;(A)03H ;保护DPTR高8位入栈 ;保护DPTR低8位入栈 ;(DPTR)2000H ;(A)(2000H+03H) ;弹出DPTR低位 ;弹出DPTR高位,演示,由此可见,SP只是存放堆栈的地址,所以PUSH和POP指令属寄存器间接寻址方式。,单片微机原理及应用教学课件,2、 数据交换指令(5条): XCH A,direct (字节互换) XCH A,Ri (字节互换) XCH A,Rn (字节互换) (A) (direct)或(Ri),或(Rn),XCHD A,Ri 累加器 Acc的低4位与(Ri)的低4位互换,各自的高4位不变,SWAP A 累加器 Acc的低4位与自身的高4位互换,单片微机原理及应用教学课件,3.3.3 片外数据存储器数据传送指令,MOVX类指令可在累加器与以DPTR或Ri所代表的外部 RAM或I/O口之间进行数据传送。,例如: MOVX A, DPTR ;(A) (DPTR) 读(64KB) MOVX A, Ri ;(A) (Ri) 读(64KB) MOVX DPTR, A ;(DPTR) (A) 写(256B) MOVX Ri, A ;(Ri) (A) 写(256B),MCS-51单片机CPU对片外扩展的数据存储器RAM或I/O口进行数据传送,必须采用寄存器间接寻址的方法,通过累加器A来完成。,数据存储器 6264 (8K)的扩展:,89C51单片机,SRAM6264,锁存器74LS373,P0.0-P0.7,ALE,P2.7,P2.0-P2.4,8D,8Q,OE,A8-A12,A0-A7,D0-D7,G,EA,OE,CE2,51单片机能提供16条地址线,可扩展64K字节的RAM。可以用一片芯片,也可以用多片RAM,RD,WR,WE,CE1,+5V,图7-9 执行MOVX指令时的读时序,执行MOVX指令时的读时序,图7-10 执行MOVX指令时的写时序,执行MOVX指令时的写时序,读/RD有效(P3.7),写/WR有效(P3.6)。 由于R0是8位的寄存器,DPTR是16位的寄存器,所以但外部数据存储器小于等于256B是采用R0,当外部数据存储器大于256B时,采用DPTR。 当访问外部存贮器时,ALE以每机器周期两次进行信号输出,P0口输出的低八位地址由ALE输出的控制信号锁存到片外地址锁存器,P0口输出地址低八位后,又能与片外存贮器之间传送信息。,单片微机原理及应用教学课件,单片机,锁存器74LS373,P0.0-P0.7,ALE,PSEN,P2.0-P2.4,8D,8Q,OE,A8-A12,A0-A7,D0-D7,G,EA,OE,CE,EPROM,单片机的引脚(PSEN端),PSEN:寻址外部程序存储器时选通外部EPROM的 读控制端(OE)低有效。,图7-7 片外ROM操作时序图,片外ROM操作时序图,3.3.4 访问程序存储器的数据传送指令 P.61 访问程序存储器的数据传送指令又称作查表指令,采用基址寄存器加变址寄存器间接寻址方式,把程序存储器中存放的表格数据读出,传送到累加器A。共有如下两条单字节指令,指令操作码助记符为MOVC。 指令助记符 操作功能注释 机器码(H) MOVC A,A+DPTR ;(A)(A)+(DPTR) 93 MOVC A,A+PC ;(PC)(PC)+1,(A)(A)+(PC) 83 以上两条指令的区别:,前一条指令采用DPTR作基址寄存器,因此可以很方便地把一个16位地址送到DPTR,实现在整个64 KB程序存储器单元到累加器A的数据传送。即数据表格可以存放在程序存储器64 KB地址范围的任何地方。 后一条指令以PC作为基址寄存器,CPU取完该指令操作码时PC会自动加1,指向下一条指令的第一个字节地址,即此时是用(PC)+1作为基址的。另外,由于累加器A中的内容为8位无符号数,这就使得本指令查表范围只能在256个字节范围内(即(PC)+1H(PC)+100H),使表格地址空间分配受到限制。同时编程时还需要进行偏移量的计算,即MOVC A,A+PC指令所在地址与表格存放首地址间的距离字节数的计算,并需要一条加法指令进行地址调整。偏移量计算公式为: 偏移量 = 表首地址-(MOVC指令所在地址+1),例5 若在外部程序存储器中2000H单元开始依次存放09的平方值,以PC作为基址寄存器进行查表,得9 的平方值。 设MOVC指令所在地址为1FF0H,则偏移量=2000H -(1FF0H+1)=0FH,相应程序如下:,MOV A,#09H ADD A,#0FH MOVC A,A+PC,;(A)09H ;用加法指令进行地址调整 ;(A)( (A)+(PC)+1),演示MOVC-PC,以DPTR为基址寄存器的查表指令,程序如下 MOV DPTR,#TAB MOV A,#09H MOVC A,A+DPTR 执行结果:(A)51H。,演示MOVC-DPTR,图3.2 变址寻址示意图,单片微机原理及应用教学课件,单片机,锁存器74LS373,P0.0-P0.7,ALE,PSEN,P2.0-P2.4,8D,8Q,OE,A8-A12,A0-A7,D0-D7,G,EA,OE,CE,EPROM,单片机的引脚(PSEN端),PSEN:寻址外部程序存储器时选通外部EPROM的 读控制端(OE)低有效。,图7-7 片外ROM操作时序图,片外ROM操作时序图,3.4 算术运算类指令,3.4.1 加、减法指令,图3.4 加减法指令形式结构图 (a) 加减法指令关系图;(b) 加1、减1指令关系图,单片微机原理及应用教学课件,算术运算类指令,加法运算: (ADD4条) 带进位加法运算: (ADDC4条) 带借位减法运算: (SUBB4条),所有的加法(ADD)、带进位加法(ADDC)、带借位减法(SUBB)运算都是以 A为一个加数或被减数,最终结果也存进 A 。,加法(ADD)、带进位加法(ADDC) 以及带借位减法(SUBB)运算中,如果产生了进位或借位,将自动对PSW中的Cy标志位置“1” 。,带进位加法(ADDC):(A)(A)+(Cy)+(第二操作数)带借位减法(SUBB):(A)(A)-(Cy)-(第二操作数),单片微机原理及应用教学课件,加1/减1操作: (INC,DEC9条) INC, DEC与用加/减法指令做加1/减1 操作不同之处在于INC、DEC不影响标志位OV和Cy。,例6 设(A) = 49H,(R0)=6BH,分析执行指令ADD A,R0后的结果。 结果为:(A)=B4H,OV=1,CY=0,AC=1,P=0。 例7 设(A)=C3H,数据指针低位(DPL)=ABH,CY=1,分析执行指令ADDC A,DPL后的结果。 结果为:(A)=6FH,CY=1,AC=0,P=0。,例8 设 (A) = 52H,(R0)=B4H,分析执行如下指令后的结果 CLR C ;是位操作指令,是进位位清零 SUBB A,R0 结果为:(A)=9EH,CY=1,AC=1,OV=1,P=1。,关于Cy和OV,1、CY(PSW.7) 进位标志,简记C 8位无符号数在加法运算时,位7有进位,CY=1;无进位,CY=0 8位无符号数在减法运算时,位7有借位,CY=1;无借位,CY=0 在乘除运算时,CY=0,2、OV(PSW.2) 溢出标志 在乘法运算时,乘积超过255,OV=1;否则OV=0 在除法运算时,除数为零,OV=1;否则OV=0 在有符号数加减运算时,数值超出有符号数的范围,OV=1,注意:8位有符号二进制数范围 -128 +127,任何时候OV都满足:OVC6 C7,例9 设 (R0) = 7EH,(7EH)=FFH,(7FH)=38H,(DPTR)=10FEH,分析逐条执行下列指令后各单元的内容。 INC R0 ;使7EH单元内容由FFH变为00H INC R0 ;使R0的内容由7EH变为7FH INC R0 ;使7FH单元内容由38H变为39H INC DPTR ;使DPL为FFH,DPH不变 INC DPTR ;使DPL为00H,DPH为11H INC DPTR ;使DPL为01H,DPH不变,单片微机原理及应用教学课件,3.4.2 十进制调整指令,BCD码是指“用二进制表达的十进制数”。如: 十进制数20可以用二进制数00010100B表示; 也可以用十六进制数14H表示; 还可以用BCD码 00100000B 或 20H 表示。,4个二进制位就可以表示一位BCD码: 00001001 可表示十进制数(BCD数) 09; 8个二进制位就可以表示两位压缩的BCD码:0000000010011001 表示 0099。,十进制调整: (DA A1条) 用于两个BCD码之间的相加,这条指令只能跟在 ADD 或 ADDC 之后,单片微机原理及应用教学课件,若(A)309或(AC)=1则(A)30(A)306; 若(A)749或(CY)=1则(A)74(A)746;,例:两个十进制数“65”与“58”相加,根据常识,显然其和应当为“123”。,MOV A,#65H ADD A,#58H DA A 结果:(A)= 23H (CY)= 1,指令 “DA A” 完成的操作:,6 5 0110 0101 5 8 0101 1000 1011 1101,+,1,3,2,0110 0110,1 0010 0011,+,1、 使用时应注意:DA指令不能对减法进行十进制调整。做减法运算时,可采用十进制补码相加,然后用 DA A指令进行调整。 机内十进制补码可采用:x补 = 9AH -x。,P.64例11 设片内RAM 30H,31H单元中分别存放着两位BCD码表示的被减数和减数,两数相减的差仍以BCD码的形式存放在32H单元中。可用下面的程序实现: CLR C MOV A,#9AH SUBB A,31H ;求减数的十进制补码 ADD A,30H ;作十进制补码加法 DA A ;进行BCD调整 MOV 32H,A ;将BCD码的差送存32H单元,3.4.3 乘、除法指令,MUL AB;,(B)(A)(B)158(A)(A)(B)70 CY0,机器码:A4H,乘法指令的功能是把累加器A和寄存器B中的两个8位无符号数相乘,将乘积16位数中的低8位存放在A中,高8位存放在B中。若乘积大于FFH(255),则溢出标志OV置1,否则OV清零。乘法指令执行后进位标志CY总是零,即CY=0。,1.乘法指令,2除法指令,除法指令的功能是把累加器A中的8位无符号整数除以寄存器B中的8位无符号整数,所得商存于累加器A中,余数存于寄存器B中,进位标志位CY和溢出标志位OV均被清零。若B中的内容为0时,溢出标志OV被置1,即OV=1,而CY仍为0。,3.5 逻辑运算及移位指令,图3.5 逻辑指令形式结构图,表3.3 逻辑操作指令表,表3.3 逻辑操作指令表,例12 (P1)=C5H=11000101B,屏蔽P1口高4位而保留低4位。 执行指令:ANL P1,#0FH 结果为:(P1)=05H=00000101B。 ()逻辑“或”指令常用来使字节中某些位置“1”,其它位保持不变。则欲置位的位用“1“与该位相或,保留不变的位用“0“ 与该位相或。,()逻辑“与”指令常用于屏蔽(置0)字节中的某些位。若清除某位,则用“0”和该位相与:若保留某位,则用“”和该位相与,例13 若(A)=C0H,(R0)=3FH,(3FH)=0FH, 执行指令:ORL A,R0 结果为:(A)=CFH=11001111B。 ()逻辑“异或“指令常用来使字节中某些位进行取反操作,其它位保持不变。欲某位取反该位与“1“相异或;欲某位保留则该位与“0“ 相异或。还可利用异或指令对某单元自身异或,以实现清零操作。,例14 若(A)=B5H=10110101B,执行下列操作: XRL A,#0F0H ; A的高4位取反,低4位保留, (A)=01000101B=45H MOV 30H,A ;(30H)=45H XRL A,30H ;自身异或使A清零 ()用移位指令还可以实现算术运算,左移一位相当于原内容乘以2,右移一位相当于原内容除以2,但这种运算关系只对某些数成立(请读者自行思考)。,例15 设(A)=5AH=90,且CY=0,则 执行指令RL A后,(A)=B4H=180。 执行指令 RR A后,(A)=2DH=45。 执行指令 RLC A后,(A)=B4H=90。 执行指令 RRC A后,(A)=2DH=45。,3.6 控制转移类指令,3.6.1 无条件转移指令,表3.4 无条件转移指令,1LJMP(长转指令) LJMP addr16 长跳转指令 可在64K范围内跳转 LJMP指令执行后,程序无条件地转向16位目标地址(addr16)处执行,不影响标志位。可以使程序从当前地址转移到64 KB程序存储器地址空间的任意地址。,2AJMP(绝对转移指令) AJMP addr11 绝对跳转指令 可在指令所在的2K范围内跳转 AJMP的机器码是由11位直接地址addr11和指令操作码00001,按下列分布组成的:,该指令执行后,程序转移的目的地址是由AJMP指令所在位置的地址PC值加上该指令字节数2,构成当前PC值。取当前PC值的高5位与指令中提供的11位直接地址形成转移的目的地址,即,PC15 PC14 PC13 PC12 PC11a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0,转移目的地址(PC),由于11位地址的范围是0000000000011111111111(000007FFH),即2 KB范围,而目的地址的高5位是由PC当前值,所以程序可转移的位置只能是和PC当前值在同一2 KB范围内。本指令转移可以向前也可以向后,指令执行后不影响状态标志位。 例如:若AJMP指令地址(PC)=2300H。执行指令AJMP 0FFH后,结果为:转移目的地址(PC)=20FFH,程序向前转到20FFH单元开始执行。 又如:若AJMP指令地址(PC)=2FFFH。执行指令AJMP 0FFH后,结果为:转移目的地址(PC)=30FFH,程序向后转到30FFH单元开始执行 因为在执行本指令,当前PC=2FFFH+2。 由上可见:若addr11相同,则AJMP指令的机器码相同,但转移的目的地址却可能不同,这是因为转移的目的地址是由PC当前值的高5位与addr11共同决定的。,3SJMP(相对短转指令) SJMP rel 相对跳转指令 可在当前PC-128与+127范围内跳转 指令的操作数rel用8位带符号数补码表示,占指令的一个字节。因为8位补码的取值范围为-128 +127,所以该指令的转移范围是:相对PC当前值向前转128字节,向后转127字节。即 转移目的地址= SJMP指令所在地址+2+rel 如在2100H单元有SJMP指令,若rel = 5AH(正数),则转移目的地址为215CH(向后转);若rel = F0H(负数),则转移目的地址为20F2H(向前转)。,用汇编语言编程时,指令中的相对地址rel往往用欲转移至的地址的标号(符号地址)表示。机器汇编时,能自动算出相对地址值;但手工汇编时,需自己计算相对地址值rel。 rel的计算公式如下: 向前转移:rel=FEH -(SJMP指令地址与目的地址差的绝对值) 向后转移:rel=FEH -(SJMP指令地址与目的地址差的绝对值)-2 若rel = FEH,即目的地址就是SJMP指令的地址,在汇编指令中的偏移地址可用 $ 符号表示。若在程序的末尾加上SJMP $(机器码为80 FEH),则程序就不会再向后执行,造成单指令的无限循环,进入等待状态。,4JMP A+DPTR(相对长转移指令) JMP A+DPTR 间接长跳转指令 可在以DPTR为基址 + A为偏移量之和所指向的64K程序范围内跳转 它是以数据指针DPTR的内容为基址,以累加器A的内容为相对偏移量,在64 KB范围内无条件转移。该指令的特点是转移地址可以在程序运行中加以改变。例如,当DPTR为确定值,根据A的不同值就可以实现多分支的转移。该指令在执行后不会改变DPTR及A中原来的内容。,例16 根据累加器A的值,转不同处理程序的入口。 MOV DPTR,#TABLE ;表首地址送DPTR JMP A+DPTR ;根据A值转移 ABLE:AJMP TAB1 ;当(A)=0时转TAB1执行 AJMP TAB2 ;当(A)=2时转TAB2执行 AJMP TAB3 ;当(A)=4时转TAB3执行,可见,A必须是偶数,因为AJMP TAB# 是双字节指令。 若为LJMP TAB# 则A值应该为多少?,3.6.2 条件转移指令 条件转移指令是当某种条件满足时,程序转移执行;条件不满足时,程序仍按原来顺序执行。 转移的条件可以是上一条指令或更前一条指令的执行结果(常体现在标志位上),也可以是条件转移指令本身包含的某种运算结果。 由于该类指令采用相对寻址,因此程序可在以当前PC值为中心的-128+127范围内转移。 该类指令共有8条,可以分为累加器判零条件转移指令、比较条件转移指令和减1条件转移指令三类。表3.5中列出了这些指令。,表3.5 条件转移指令,JZ指令:累加器A为0转移,不为0则顺序执行; JNZ指令:累加器A不为0转移,为0则顺序执行。 累加器A的内容是否为0,是由这条指令以前的其它指令执行的结果决定的,执行这条指令不作任何运算,也不影响标志位。,1判零条件转移指令,条件转移: JZ,JNZ,JZ rel JNZ rel 根据Acc的内容是否为0决定是否跳转,例17 将片外RAM首地址为DATA1的一个数据块转送到片内RAM首地址为DATA2的存储区中,遇零终止。 外部RAM向内部RAM的数据转送一定要经过累加器A,利用判零条件转移正好可以判别是否要继续传送或者终止。完成数据传送的参考程序如下: MOV R0,#DATA1 ;R0作为外部数据块的地址指针 MOV R1,#DATA1 ;R1作为内部数据块的地址指针 LOOP: MOVX A,R0 ;取外部RAM数据送入A HERE: JZ HERE ;数据为零则终止传送 MOV R1,A ;数据传送至内部RAM 单元 INC R0 ;修改指针,指向下一数据地址 INC R1 SJMP LOOP ;循环取数,2比较转移指令 CJNE A, #data, rel CJNE A, direct,rel CJNE Ri,#data, rel CJNE Rn, #data, rel 将A(或Ri,或Rn)与#data(或direct)相比较,其值不相等就跳转;相等则不跳转,继续往下执行。,单片微机原理及应用教学课件,以上指令执行过程: (1)若第一操作数=第二操作数,顺序执行,进位标志位CY清0; (2)若第一操作数第二操作数,程序转移,进位标志位CY清0; (3)若第一操作数第二操作数,程序转移,进位标志位CY清1;,比较是进行一次减法运算,但其差值不保存,两个数的原值不受影响,而标志位CY要受到影响。利用标志位CY作进一步的判断,可实现三分支转移。,例18 当从P1口输入数据为01H 时,程序继续执行,否则等待,直到P1口出现01H。参考程序如下: MOV A,#01H ;立即数01H送A WAIT: CJNE A,P1,WAIT ;(P1)01H,则等待,3减1条件转移指令 DJNZ direct,rel DJNZ Rn, rel 将direct(或Rn)里的内容减 1,结果不等于0就跳转;等于0则不跳转继续往下走。 减1条件转移指令有两条。每执行一次这种指令,就把第一操作数减1,并把结果仍保存在第一操作数中,然后判断是否为零。若不为零,则转移到指定的地址单元,否则顺序执行。,若单片的晶振频率为6MHZ,问执行下列程序需要的时间 DELAY: MOV R3,#100 ;1 LOOP: NOP ;1 NOP NOP DJNZ R3,LOOP ;2 RET ;2,3.7.3 空操作指令 NOP ;(PC)(PC)+1 “耗时”一个机器周期。 do nothing! 空操作指令是一条单字节单周期指令。它控制 CPU不做任何操作,仅仅是消耗这条指令执行所需要的一个机器周期的时间,不影响任何标志位,故称为空操作指令。NOP指令在设计延时程序、拼凑精确延时时间及在程序等待或修改程序等场合是很有用的。,若单片的晶振频率为6MHZ,问执行下列程序需要的时间 DELAY: MOV R3,#100 ;1 LOOP: NOP ;1 NOP NOP DJNZ R3,LOOP ;2 RET ;2,1 +,1,+ 1,+ 1,+ 2,( )* 100,+2,=503,T=503*2uS=1006uS1mS,例19 将内部RAM从DATA单元开始的10个无符号数相加,相加结果送SUM单元保存。 设相加结果不超过8位二进制数,则相应的程序如下: CLR C MOV R0,#0AH ;设置循环次数 MOV R1,#DATA ;R1作地址指针,指向数据块首地址 CLR A ;A清零 LOOP: ADDC A,R1 ;加一个数 INC R1 ;修改指针,指向下一个数 DJNZ R0,LOOP ;R0减1,不为0循环 MOV SUM,A ;存10个数相加的和,3.7 子程序调用与返回指令,3.7.1 子程序调用指令 子程序调用指令有长调用和绝对调用两条,它们都是双周期指令。,单片微机原理及应用教学课件,LCALL addr16 子程序长调用指令 可在64K范围内调用子程序,LCALL,可调用64 KB范围内的子程序。由于该指令为3字节,所以执行该指令时首先应执行(PC)(PC)+3,以获得下一条指令地址,并把此时的PC内容压入堆栈(先压入低字节,后压入高字节)作为返回地址,堆栈指针SP加2指向栈顶,然后把目的地址addr16送入PC。该指令执行不影响标志位。,ACALL addr11 子程序绝对调用指令 可在指令所在的2K范围内调用子程序,ACALL提供11位地址,只能调用与PC在同一2 KB范围内的子程序。由于该指令为2字节指令,所以执行该指令时应执行(PC)(PC)+2以获得下一条指令地址,并把该地址压入堆栈作为返回地址。机器码的组成如下:,被调用子程序的目的地址也是由执行 ACALL指令的当前PC值的高5位与指令中提供的11位直接地址形成。PC值如下:,LCALL和ACALL指令类似于转移指令LJMP和AJMP,不同之处在于LCALL和ACALL在转移前要把执行完该指令的PC内容自动压入堆栈后(为了返回),才将子程序入口地址addr16(或addr11)送PC,实现转移。 而LJMP和AJMP,没有堆栈操作,从给出的目的地址开始执行, 不存在子程序返回的问题。,3.7.2 返回指令 返回指令共两条:一条是对应两条调用指令的子程序返回指令RET,另一条是对应从中断服务程序的返回指令RETI。,从上述两条指令的功能操作看,都是从堆栈中弹出返回地址送PC,堆栈指针减2,但它们是两条不同的指令。其有下面两点不同: (1) 从使用上,RET指令必须是子程序的最后一条指令;RETI必须是中断服务程序的最后一条指令。 (2) RETI指令除恢复断点地址外,还恢复CPU响应中断时硬件自动保护的现场信息。执行RETI指令后,将清除中断响应时所置位的优先级状态触发器,使得已申请的同级或低级中断申请可以响应;而RET指令只能恢复返回地址。,单片微机原理及应用教学课件,LCALL addr16 子程序长调用指令 可在64K范围内调用子程序,子程序调用及返回: (LCALL,ACALL,RET,RETI4条),ACALL addr11 子程序绝对调用指令 可在指令所在的2K范围内调用子程序,RET 子程序返回指令 子程序结束并返回调用的下一条指令,RETI 中断服务子程序返回指令 中断结束/返回被打断处的下一条指令,控制转移类指令,此类指令改变程序的执行顺序改变当前PC值,无条件转移: (LJMP,AJMP,SJMP,JMP4条),条件转移(判断跳转): (JZ,JNZ,

温馨提示

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

最新文档

评论

0/150

提交评论