1.28k likes | 1.45k Views
第 3 章 单片机汇编程序设计. 3.1 MCS-51 系列单片机汇编指令格式及标识. 指令 是使计算机完成基本操作的命令。一种计算机能够执行的全部指令的集合,称为这种计算机的指令系统。单片机的指令系统与微型计算机的指令系统不同, MCS-51 系列单片机指令系统共有: 111 条指令; 42 种指令助记符。. 49 条 1 字节指令; 45 条 2 字节指令; 17 条 3 字节指令。. 64 条为 1 机器周期指令; 45 条为 2 机器周期指令; 2 条为 4 机器周期指令 ( 乘、除法 ) 。. 这些指令在存储空间和运算速度上,效率都比较高。.
E N D
第3章 单片机汇编程序设计 3.1 MCS-51系列单片机汇编指令格式及标识 指令是使计算机完成基本操作的命令。一种计算机能够执行的全部指令的集合,称为这种计算机的指令系统。单片机的指令系统与微型计算机的指令系统不同,MCS-51系列单片机指令系统共有: 111条指令;42种指令助记符。 49条1字节指令; 45条2字节指令; 17条3字节指令。 64条为1机器周期指令; 45条为2机器周期指令; 2条为4机器周期指令(乘、除法)。 这些指令在存储空间和运算速度上,效率都比较高。
MCS-51系列单片机指令系统功能强、指令短、执行快。 从功能上可分成五大类: • 1、数据传送指令; • 2、算术运算指令; • 3、逻辑操作指令; • 4、控制转移指令; • 5、位操作指令。
3.1.1 指令格式 [标号:] 操作码助记符 [目的操作数][,源操作数] [;注释] (1)操作码助记符表明指令的功能,不同的指令有不同的指令助记符,它一般用说明其功能的英文单词的缩写形式表示。 (2)操作数用于给指令的操作提供数据、数据的地址或指令的地址,操作数往往用相应的寻址方式指明。MCS-51单片机指令系统的指令按操作数的多少可分为无操作数、单操作数、双操作数和三操作数四种情况。 (3)标号是该指令的符号地址,后面须带冒号。它主要为转移指令提供转移的目的地址。 (4)注释是对该指令的解释,前面须带分号。它们是编程者根据需要加上去的,用于对指令进行说明,对于指令本身功能而言是可以不要的。
3.1.2 指令中用到的标识符 为便于后面的学习,在这里先对指令中用到的一些符号的约定意义作以下说明: (1)Ri和Rn:表示当前工作寄存器区中的工作寄存器。 i取0或1,表示R0或R1。n取0~7,表示R0~R7。 (2)#data:表示包含在指令中的8位立即数。 (3)#data16:表示包含在指令中的16位立即数。 (4)rel:以补码形式表示的8位相对偏移量,范围为-128~+127,主要用在相对寻址的指令中。 (5)addr16和addr11:分别表示16位直接地址和11位直接地址。 (6)direct:表示直接寻址的地址。 (7)bit:表示可位寻址的直接位地址。 (8)(X):表示X单元中的内容。 (9)((X)):表示以X单元的内容为地址的存储器单元内容,即(X)作地址,该地址单元的内容用((X))表示。 (10)/ 和→符号:“/”表示对该位操作数取反,但不影响该位的原值。“→”表示操作流程,将箭尾一方的内容送入箭头所指一方的单元中去。
3.2 MCS-51系列单片机寻址方式 • MCS-51单片机的寻址方式按操作数的类型,可分为: • ①数的寻址; • ②指令寻址。 • ①数的寻址有: • 常数寻址(立即寻址); • 寄存器数寻址(寄存器寻址); • 存储器数寻址: 直接寻址方式; 寄存器间接寻址方式; 变址寻址方式。 • 位寻址。 • ②指令的寻址有: • 绝对寻址; • 相对寻址。
3.2.1 常数寻址(立即寻址) 操作数是常数,使用时直接出现在指令中,紧跟在操作码的后面,作为指令的一部分。与操作码一起存放在程序存储器中,可以立即得到并执行,不需要经过别的途径去寻找。常数又称为立即数,故又称为立即寻址。在汇编指令中,立即数前面以“#”符号作前缀。在程序中通常用于给寄存器或存储器单元赋初值,例如: MOV A,#20H 其功能是把立即数20H送给累加器A,其中源操作数20H就是立即数。指令执行后累加器A中的内容为20H。
3.2.2 寄存器数寻址(寄存器寻址) 操作数在寄存器中,使用时在指令中直接提供寄存器的名称,这种寻址方式称为寄存器寻址。在MCS-51系统中,这种寻址方式针对的寄存器只能是R0~R7 8个通用寄存器和部分特殊功能寄存器(如累加器A、寄存器B、数据指针DPTR等)中的数据,对于其它的特殊功能寄存器中的内容的寻址方式不属于它。在汇编指令中,寄存器寻址在指令中直接提供寄存器的名称,如R0、R1、A、DPTR等。例如: MOV A,R0 其功能是把R0寄存器中的数送给累加器A,在指令中,源操作数R0为寄存器寻址,传送的对象为R0中的数据。如指令执行前R0中的内容为20H,则指令执行后累加器A中的内容为20H。
3.2.3 存储器数寻址 • 存储器数寻址针对的数据是存放在存储器单元中,对于存储器单元的内容通过提供存储器单元地址使用。 • 根据存储器单元地址的提供方式,存储器数的寻址方式有: • 1、直接寻址; • 2、寄存器间接寻址; • 3、变址寻址。
1.直接寻址 直接寻址是指数据在存储器单元中,在指令中直接提供存储器单元的地址。在MCS-51系统中,这种寻址方式针对的是片内数据存储器和特殊功能寄存器。在汇编指令中,指令中直接以地址数的形式提供存储器单元的地址。例如: MOV A,20H 其功能是把片内数据存储器20H单元的内容送给累加器A。如指令执行前片内数据存储器20H单元的内容为30H,则指令执行后累加器A的内容为30H。指令中20H是地址数,它是片内数据存储单元的地址。在MCS-51中,数据前面不加“#”是存储单元地址而不是常数,常数前面要加符号“#”。 对于特殊功能寄存器,在指令中使用时往往通过特殊功能寄存器的名称使用,而特殊功能寄存器名称实际上是特殊功能寄存器单元的符号地址,因此它们是直接寻址。例如: MOV A,P0 其功能是把P0口的内容送给累加器A。P0是特殊功能寄存器P0口的符号地址,该指令在翻译成机器码时,P0就转换成直接地址80H。
80H R1 80H 20H 20H A 2.寄存器间接寻址 寄存器间接寻址是指数据存放在存储单元中,而存储单元地址存放在寄存器中,在指令中通过提供存放存储单元地址的寄存器来使用对应的存储单元。形式为:@寄存器名。 例如:MOV A,@R1 该指令的功能是将以工作寄存器R1中的内容为地址的片内RAM单元的数据传送到累加器A中去。指令的源操作数是寄存器间接寻址。 若R1中的内容为80H,片内RAM地址为80H的单元中的内容为20H,则执行该指令后,累加器A的内容为20H。 在MCS-51单片机中,寄存器间接寻址用到的寄存器只能是通用寄存器R0、R1和数据指针寄存器DPTR,它能访问的数据是片内数据存储器和片外数据存储器。其中,片内数据存储器只能用R0和R1作指针间接访问;片外数据存储器,低端的256字节单元,既可以用两位十六进制地址以R0或R1作指针间接访问,也可用四位十六进制地址以DPTR作指针间接访问,而高端的字节单元则只能以DPTR作指针间接访问。对于片内RAM和片外RAM的低端256字节都可以用R0和R1作指针访问,它们之间用指令来区别。片内RAM访问用MOV指令,片外RAM访问用MOVX指令。
2000H DPTR 30H 2005H + 05H A 30H A 3.变址寻址 变址寻址是指操作数的地址由基址寄存器的地址加上变址寄存器的地址得到。在MCS-51系统中,它是以数据指针寄存器DPTR或程序计数器PC为基址,累加器A为变址,两者相加得存储单元的地址,所访问的存储器为程序存储器。 例如:MOVC A,@A+DPTR 其功能是将数据指针寄存器DPTR的内容和累加器A中的内容相加作为程序存储器的地址,从对应的单元中取出内容送累加器A中。指令中,源操作数的寻址方式为变址寻址,设指令执行前数据指针寄存器DPTR的值为2000H,累加器A的值为05H,程序存储器2005H单元的内容为30H,则指令执行后,累加器A中的内容为30H。示意图如左图所示。
3.2.4 位寻址 位寻址是指操作数是二进制位的寻址方式。在MCS-51单片机中有一个独立的位处理器,有多条位处理指令,能够进行各种位运算。在MCS-51系统中,位处理的操作对象是各种可位寻址位。对于它们的访问是通过提供相应的位地址来处理。 指令给出位地址。一位数据在存储器位寻址区。 (1)内部RAM低128单元中的位寻址区: 位地址为00H~07FH共128位(字节地址为20H~2FH); (2)内部RAM高128单元中的专用寄存器的可寻址位: SFR中11个有位地址寄存器中的83位。
在MCS-51系统中,位地址的表示可以用以下几种方式:在MCS-51系统中,位地址的表示可以用以下几种方式: 1.直接使用位地址(00H~07FH+83位)。 例如:PSW的位6可表示为0D6H(位地址)。 2.字节地址带位号。 例如:PSW的位6可表示为0D0H.6; 20H.3表示20H单元的3位。 3.特殊功能寄存器名带位号。 例如: PSW的位6可表示为PSW.6 ; P0.1表示P0口的1位。 4.位符号地址。 例如: PSW的位6可表示为AC; TR0是定时/计数器T0的启动位。
位寻址区 29H 01100010 28H 11010110 例:MOV C,40H ;CY¬(位地址40H) 设指令执行前 CY=1,位地址40H存储器单元 如图,执行指令后,CY= ? 0
3.2.5 指令寻址 一、绝对寻址 • 绝对寻址是在指令的操作数中直接提供目的位置的 • 地址或地址的一部分。 • 在MCS-51系统中: • 长转移和长调用提供目的位置的16位地址; • 绝对转移和绝对调用提供目的位置的16位地址的低11位。 • 它们都为绝对寻址。
--(前) PC +(后) 二、相对寻址 相对寻址是以当前程序计数器PC值加上指令中给出的偏移量rel得到目的位置的地址。在MCS-51系统中,相对转移指令的操作数属于相对寻址。 在使用相对寻址时要注意以下两点: (1)当前PC值是指转移指令执行时的PC值,它等于转移指令的地址加上转移指令的字节数。实际上是转移指令的下一条指令的地址。例如:若转移指令的地址为2010H,转移指令的长度为2字节,则转移指令执行时的PC值为2012H。 (2)偏移量rel是8位有符号数,以补码表示,它的取值范围为 -128~+127。当为负值时,向前转移,当为正数时向后转移。 相对寻址的目的地址为: 目的地址=转移指令的地址+转移指令的字节数+rel =当前PC+rel
3.3 MCS-51系列单片机指令系统 3.3.1 数据传送指令 数据传送指令有29条,是指令系统中数量最多、使用也最频繁的一类指令。 这类指令可分为三组: • 普通传送指令; • 数据交换指令; • 堆栈操作指令。
一、普通传送指令 普通传送指令以助记符MOV为基础。分成片内数据存储器传送指令、片外数据存储器传送指令和程序存储器传送指令。 1.片内数据存储器传送指令MOV 指令格式:MOV 目的操作数,源操作数 其中:源操作数可以为A、Rn、@Ri、direct、#data,目的操作数可以为A、Rn、@Ri、direct,组合起来总共16条。
按目的操作数的寻址方式划分为五组: (1)以A为目的操作数 MOV A,Rn ;A←Rn MOV A,direct ;A←(direct) MOV A,@Ri ;A←(Ri) MOV A,#data ;A← #data (2)以Rn为目的操作数 MOV Rn,A ;Rn←A MOV Rn,direct ;Rn←(direct) MOV Rn,#data ;Rn←#data (3)以直接地址direct为目的操作数 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
(4)以间接地址@Ri为目的操作数 MOV @Ri,A ;(Ri)←A MOV @Ri,direct ;(Ri)←(direct) MOV @Ri,#data ;(Ri)← #data (5)以DPTR为目的操作数 MOV DPTR,#data16 ;DPTR← #data16 注意: 源操作数和目的操作数中的Rn和@Ri不能相互配对。如不允许有“MOV Rn,Rn”,“MOV @Ri,Rn”这样的指令,在MOV指令中,不允许在一条指令中同时出现工作寄存器,无论它是寄存器寻址还是寄存器间接寻址。
例: 顺序执行下列指令序列,求每一步执行结果。 ;A=30H ;(4FH)=30H ;R0=20H ;(20H)=30H ;(21H)=30H • MOV A,#30H • MOV 4FH,A • MOV R0,#20H • MOV @R0,4FH • MOV 21H,20H 练习题:用两种寻址方式实现,将片内RAM 60H单元的数据传送给累加器A。 MOV R0,60H MOV A,@R0(×) 解: MOV A,#60H(×) 解: MOV A,60H(√) 结果A=32H MOV R0,#60H(√)MOV A,@R0
说 明: 1、一条指令中不能同时出现两个工作寄存器。非法指令: MOV R1,R2 MOV R2,@R0 2、间址寄存器只能使用 R0、R1。非法指令: MOV A,@R2 3、SFR区只能直接寻址,不能用寄存器间接寻址。非法指令: MOV R0,#80H MOV A,@R0 4、指令表(P287):关注表中指令字节数和机器周期数 只有指令表中的指令才有对应指令代码,计算机才能执行。编程时,不能随意创造发明指令。
2.片外数据存储器传送指令MOVX 在MCS-51系统中只能通过累加器A与片外数据存储器进行数据传送,访问时,只能通过@Ri和@DPTR以间接寻址方式进行。MOVX指令共有四条: ①DPTR作16位数据指针,寻址64KB片外RAM空间: MOVX A,@DPTR;A←(DPTR)(读) MOVX @DPTR,A;(DPTR)←A(写) ② Ri作8位数据指针,寻址256B片外RAM空间(页内寻址): MOVX A,@Ri ;A←(P2Ri) (读) MOVX @Ri,A;(P2Ri)←A(写) 其中前两条指令通过DPTR间接寻址,可以对整个64KB片外数据存储器访问。后两条指令通过@Ri间接寻址,只能对片外数据存储器的低端的256字节访问,访问时将低8位地址放于Ri中。
例:实现片外数据存储器数据传送(2000H) →(2100H)。 ;DPTR=2000H ;A=X ;DPTR=2100H ;(2100H)=X MOV DPTR,#2000H MOVX A,@DPTR MOV DPTR,#2100H MOVX @DPTR,A 片外数据存储器不能直接寻址。下列为非法指令: MOVX A,2000H MOVX 2100H,2000H 思考题:为什么对DPTR的数据传送使用内部传送指令? 习题:将片外RAM 0000H单元的数据传送到片内RAM的60H单元。
3.程序存储器传送指令MOVC 程序存储器传送指令只有两条,一条用DPTR基址变址寻址。一条用PC基址变址寻址。这两条指令通常用于访问表格数据,因此以称为查表指令。 ① DPTR为基址寄存器: MOVC A,@A+DPTR ;A¬(A+DPTR) (读) 查表范围为 64KB程序存储器任意空间, 称为远程查表指令。 ② PC为基址寄存器: MOVC A,@A+PC ;A¬(A+PC) (读) 常数表只能在查表指令后256B范围内, 称为近程查表指令。 特点: MOVC A,@A+DPTR指令可访问整个ROM的64KB空间,表格可放在ROM 的任何位置,与MOVC指令无必然的关系。 MOVC A,@A+PC指令优点:不改变PC的状态,根据A的内容取表格常数。 缺点:(1)表格只能存放在查表指令以下的256个单元内。 (2)当表格首地址与本指令间有其它指令时,须用调整偏移量,调整量为下 一条指令的起始地址到表格首址之间的字节数。
例如:查表指令MOVC A,@A+PC所在的地址为2000H,表格的起始单元地址为2035H,表格的第4个元素(位移量为03H)的内容为45H,则查表指令的处理过程如下: MOV A,#03H;表格元素相对于表首的位移量送累加器A ADD A,#34H;当前程序计数器PC相对于表首的差值加到累加器A中 MOVC A,@A+PC;查表,查得第4个元素内容45H送累加器A 注意:查表指令的长度为1个字节,当前程序计数器PC的值应为 查表指令的地址加1。 PC→
【例3-1】写出完成下列功能的程序段。 (1)将R0的内容送R6中程序为: MOV A,R0 MOV R6,A (2)将片内RAM 30H单元的内容送片外60H单元中程序为: MOV A,30H MOV R0,#60H MOVX @R0,A (3)将片处RAM 1000H单元的内容送片内20H单元中程序为: MOV DPTR,#1000H MOV A,@DPTR MOV 20H,A (4)将ROM 2000H单元的内容送片内RAM的30H单元中程序为: MOV A,#0 MOV DPTR,#2000H MOVC A,@A+DPTR MOV 30H,A
二、数据交换指令 普通传送指令实现将源操作数的数据传送到目的操作数,指令执行后源操作数不变,数据传送是单向的。数据交换指令数据作双向传送,传送后,前一个操作数原来的内容传送到后一个操作数中,后一个操作数原来的内容传送到前一个操作数中。 数据交换指令要求第一个操作数须为累加器A,共有5条。 XCH A,Rn ;A←→Rn XCH A ,direct ;A←→(direct) XCH A,@Ri ;A←→(Ri) XCHD A,@Ri ;A0~3←→(Ri)0~3 SWAP A ;A0~3←→A4~7
【例3-2】若R0的内容为30H,片内RAM 30H单元的内容为23H,累加器A的内容为45H,则执行 XCH A,@R0 指令后片内RAM 30H单元的内容为45H,累加器A中的内容为23H。 若执行SWAP A指令,则累加器A的内容为54H。 例:设A=29H,执行指令 XCH A,2AH后, A= ? ,(2AH)= ? 29H 38H XCH 60H,61H; ←对吗? 不对!! 29H 习题:将片内RAM60H单元与61H单元的数据交换。
MOV A,#0 A 00000000 00H 00111000 38H @R0 MOV R0,#2AH @R1 35H 00110101 MOV R1,#2BH @R1 30H A 00110000 00000101 05H XCHD A,@R1 01010000 50H A SWAP A @R0 00110000 A 30H 58H XCHD A,@R0 01011000 58H 01011000 20H XCH A,20H 例:将片内RAM 2AH和2BH单元中的ASCII码转换成压缩式BCD码存入20H单元。 58H 习题:交换片内RAM 40H单元和 41H单元的低半字节。
三、堆栈操作指令 堆栈是在片内RAM中按“先进后出,后进先出”原则设置的专用存储区。数据的进栈和出栈由指针SP统一管理。在MCS-51系统中,堆栈操作指令有两条: PUSH direct ;SP←(SP+1),(SP)←(direct) POP direct ;(direct)←(SP),(SP)←(SP-1) 其中PUSH指令入栈,POP指令出栈。操作时以字节为单位。入栈时SP指针先加1,再入栈。出栈时内容先出栈,SP指针再减1。用堆栈保存数据时,先入栈的内容后出栈;后入栈的内容先出栈。 【例3-3】若入栈保存时入栈的顺序为: PUSH A PUSH B 则出栈的顺序为: POP B POP A
× × × × × B 56H B 01H A A 02H 00H B 56H A 02H B 56H A 00H B 56H A 02H × × × 02H × × × 56H 02H × × × 56H 02H × × × 56H 02H × × × 56H 02H × SP→ SP→ SP→ SP→ B 56H 02H A SP→ SP→ 入栈指令:PUSH direct ;SP←SP+1,(SP)←(direct) 出栈指令:POP direct ;(direct)←(SP),SP←SP-1“先加后压”“先弹后减” • 例:设A=02H,B=56H,执行下列指令后, • SP= ? ,A= ? ,B= ? 。 56H 30H 02H SBR: MOV SP,#30H ;设栈底 PUSH A PUSH B MOV A,#00H MOV B,#01H … POP B POP A
练习: • 说明程序执行过程中,SP的内容及堆栈中内 • 容的改变过程。 • 程序如下: • MOV SP,#30H • MOV A,#20H • MOV B,#30H • PUSH A • PUSH B • … … • POP A • POP B ;SP=30H ;A=20H ;B=30H ;SP=31H (31H)=20H ;SP=32H (32H)=30H … … ;A=30H SP=31H ;B=20H SP=30H
习题:找出指令错误并改正: • 1.MOV A,#1000H ;A←1000H(A装1个字节数) • 2.MOVX A,1000H ;A←(1000H)片外RAM(DPTR、Ri) • 3.MOVC A,1000H ;A←(1000H)片外ROM(DPTR、PC) • 4.MOVX 60H,A ;片外RAM(60H)←A(应为MOV) • 5.MOV R0,60H ;片内RAM:(61H)←(60H) • MOV 61H,@R0 (片内RAM可直接寻址) • 6. XCH R1,R2 ;R1« R2(必须有A参加) • 7. MOVX DPTR,#2000H ;DPTR←2000H(应为MOV) • 8. MOVX 60H,@DPTR ;片内RAM←片外RAM • (必须有A参加)
3.3.2 算术运算指令 一.加法指令 其中,ADD和ADDC指令在执行时要影响CY、AC、OV和P标志位。而INC指令除了INC A要影响P标志位外,对其它标志位都没有影响。 在MCS-51单片机中,常用ADD和ADDC配合使用实现多字节加法运算。 1.一般的加法指令ADD ADD A,Rn ;A←A + Rn ADD A,direct ;A←A +(direct) ADD A,@Ri ;A←A +(Ri) ADD A,#data ;A←A + #data 2.带进位加指令ADDC ADDC A,Rn ;A←A+Rn+C ADDC A,direct ;A←A +(direct)+ C ADDC A,@Ri ;A←A +(Ri)+ C ADDC A,#data ;A←A + #data + C 3.加1指令 INC A ;A←A+1 INC Rn ;Rn←Rn+1 INC direct ;(direct)←(direct)+ 1 INC @Ri ;(Ri)←(Ri)+ 1 INC DPTR ;DPTR←DPTR+1
C R1 R2 + R3 R4 ADDC ADD C R5 R6 【例3-4】试把存放在R1R2和R3R4中的两个16位数相加,结果存于R5R6中。 处理时,R2和R4用一般的加法指令ADD,结果放于R6中,R1和R3用带进位的加法指令ADDC,结果放于R5中,程序如下: MOV A,R2 ADD A,R4 MOV R6,A MOV A,R1 ADDC A,R3 MOV R5,A
二.减法指令 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 2.减1指令DEC DEC A ;A←A - 1 DEC Rn ;Rn←Rn - 1 DEC direct ;direct←(direct)- 1 DEC @Ri ;(Ri)←(Ri)- 1
在MCS-51单片机中,只提供了一种带借位的减法指令,没有提供一般的减法指令,一般的减法操作可以通过先对CY标志清零,然后再执行带借位的减法来实现。其中,SUBB指令在执行时要影响CY、AC、OV和P标志位。而DEC指令除了DEC A要影响P标志位外,对其它标志位都没有影响。 【例3-5】求R3←R2 - R1。 程序为: MOV A,R2 CLR C SUBB A,R1 MOV R3,A
3.乘法指令MUL 在MCS-51单片机中,乘法指令只有一条: MUL AB 该指令执行时将对存放于累加器A中的无符号被乘数和放于B寄存器中的无符号乘数相乘,积的高字节存于B寄存器中,低字节存于累加器A中。 指令执行后将影响CY和OV标志,CY复位,对于OV:当积大于255时(即B中不为0),OV为1;否则,OV为0。
4.除法指令DIV 在MCS-51单片机中,除法指令也只有一条: DIV AB 该指令执行时将用存放在累加器A中的无符号被除数与存放在B寄存器中的无符号除数相除,除得的结果,商的存于累加器A中,余数存于B寄存器中。 指令执行后将影响CY和OV标志,一般情况CY和OV都清0,只有当B寄存器中的除数为0时,CY和OV才被置1。
5.十进制调整指令 在MCS-51单片机中,十进制调整指令只有一条: DA A 它只能用在ADD或ADDC指令后面,用来对两个二位的压缩的BCD码数通过用ADD或ADDC指令相加后存于累加器A中的结果进行调整,使得它得到正确的十进制结果。通过该指令可实现两位十进制BCD码数的加法运算。 它的调整过程为: (1)若累加器A的低四位为十六进制的A~F或辅助进位标志AC为1,则累加器A中的内容作加06H调整。 (2)若累加器A的高四位为十六进制的A~F或进位标志CY为1,则累加器A中的内容作加60H调整。
例如:求BCD码48+69=?117 • 0100 1000 B • + 0110 1001 B • 1011 0001 B • + 0110 0110 B加6修正 • 1 0001 0111 B • ①低4位向高4位进位,表明低位和大于9,需加6修正; • ②高位由于获得进位而出现非法码,因此也需要加6修正。 • 修正后,结果为117,正确。 • 思考:BCD码减法,如何修正?(求减数对9A的补码) • 9A的原码为1 110 0110 B=66H。
【例3-6】在R3中有十进制数67,在R2中有十进制数85,用十进制运算,运算的结果放于R5中。【例3-6】在R3中有十进制数67,在R2中有十进制数85,用十进制运算,运算的结果放于R5中。 程序为: MOV A,R3 ;(R3)=67 ADD A,R2 ;(R2)=85,(A)=0ECH DA A ;(A) =52H MOV R5,A ;(R5)=52H 程序中DA指令对ADD指令运算出来的放于累加器A中的结果进行调整,调整后,累加器A中的内容为52H,CY为1,则结果为152,最后放于R5中的内容为52H(十进制数52)。 (R3)=67=0110 0111 B (R2)=85=1000 0101 B + (A)=1110 1100 B=ECH ECH=1110 1100B 0110 0110B + 10101 0010B 1=(C) 52H=(A) 跳过或进入6个无效编码区,结果就会出错。
3.3.3 逻辑操作指令 一.逻辑与指令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)←(direct) A ANL direct,#data ;(direct)←(direct) data 二.逻辑或指令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)←(direct) A ORL direct,#data ;(direct)←(direct) data
三.逻辑异或指令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,其余位不变;逻辑异或用于实现指定位取反,其余位不变。 【例3-7】写出完成下列功能的指令段。 1.对累加器A中的1、3、5位清0,其余位不变 ANL A,#11010101B 2.对累加器A中的2、4、6位置1,其余位不变 ORL A,#01010100B 3.对累加器A中的0、1位取反,其余位不变 XRL A,#00000011B
四.清零和求反指令 1.清零指令:CLR A ;A← 0 2.求反指令:CPL A ;A← Ā 在MCS-51系统中,只能对累加器A中的内容进行清零和求反,如要对其它的寄存器或存储单元进行清零和求反,则须放在累加器A进行,运算后再放回原位置。 【例3-8】写出对R0寄存器内容求反的程序段。 程序为: MOV A,R0 CPL A MOV R0,A
A A A A C C 五.循环移位指令 MCS-51系统有四条对累加器A的循环移位指令,前两条只在累加器A中进行循环移位,后两条还要带进位标志CY进行循环移位。每一次移一位。分别如下: • 1)8位循环指令: • RL A;A循环左移一位 • RR A;A循环右移一位 • 2)9位循环指令: • RLC A ;带CY循环左移一位 • RRC A ;带CY循环右移一位
CY R5 CY R6 1 0 【例3-9】若累加器A中的内容为10001011B,CY=0,则执行RLC A指令后累加器A中的内容为00010110,CY=1。 用9位循环指令实现多字节移位: 例:编程将寄存器 R6R5中的双字节数X左移一位。 • CLR C • MOV A,R5 • RLC A • MOV R5,A • MOV A,R6 • RLC A • MOV R6,A ;CY=0,设 R6=55H,R5=0AAH ;R6=01010101B,R5=10101010B,CY=0 ;R5=01010100B,CY=1 ;R6=01010101B,R5=01010100B,CY=1 ;R6=10101011B,R5=01010100B,CY=0 思考题:如何将寄存器R6R5中的双字节数X右移一位。
3.3.4 控制转移指令 • 共有17条,包括: • 无条件转移指令; • 条件转移指令; • 子程序调用及返回指令。 一、无条件转移指令 无条件转移指令是指当执行该指令后,程序将无条件地转移到指令指定的地方去。无条件转移指令包括长转移指令、绝对转移指令、相对转移指令和间接转移指令。
一、无条件转移指令 指令:LJMP,AJMP,SJMP,JMP——4条 LJMP addr16 长跳转指令 ——可在64KB范围内跳转 AJMP addr11 绝对跳转指令 ——可在指令所在的2KB范围内跳转 SJMP rel 相对跳转指令 ——可在当前PC-128与+127范围内跳转 JMP @A+DPTR 间接长跳转指令 ——可在以DPTR为基址+A为偏移量之 和所指向的64KB程序范围内跳转