控制转类指令-课件.ppt

上传人(卖家):三亚风情 文档编号:3546048 上传时间:2022-09-15 格式:PPT 页数:167 大小:1.32MB
下载 相关 举报
控制转类指令-课件.ppt_第1页
第1页 / 共167页
控制转类指令-课件.ppt_第2页
第2页 / 共167页
控制转类指令-课件.ppt_第3页
第3页 / 共167页
控制转类指令-课件.ppt_第4页
第4页 / 共167页
控制转类指令-课件.ppt_第5页
第5页 / 共167页
点击查看更多>>
资源描述

1、第第3章章 指令系统及汇编指令系统及汇编 5.移位指令 移位指令有如下循环左移、带进位位循环左移、循环右移和带进位位循环右移 4 条指令,移位只能对累加器A进行。循环左移RL A;(A n+1)(An),(A0)(A7),23 带进位位循环左移 RLC A;(A n+1)(An),(CY)(A7),(A0)(CY),33 循环右移 RRA;(An)(A n+1),(A7)(A0),03 带进位位循环右移 RRC A;(An)(A n+1),(CY)(A0),(A7)(CY),13 以上移位指令操作,可用图 3 5 表示。第第3章章 指令系统及汇编指令系统及汇编图 3 5 移位指令操作示意图 第

2、第3章章 指令系统及汇编指令系统及汇编 另外,值得一提的是在前述数据传送类指令中有一条累加器A的内容半字节交换指令:SWAP A;(A)74 (A)30 ,C4 它实际上相当于执行循环左移指令 4 次。该指令在BCD码的变换中是很有用的,如 3.3.2 节的例 4。第第3章章 指令系统及汇编指令系统及汇编例如:设(A)=43H,(CY)=0,则执行指令:RL A ;RLC A ;RR A ;RRC A ;结果为:(A)=86H,(CY)=0 (A)=0CH,(CY)=1 (A)=06H,(CY)=1 (A)=83H,(CY)=0第第3章章 指令系统及汇编指令系统及汇编当A的最高位(D7)为0时

3、,执行一次RL指令相当于对A进行一次乘2操作。01111011 10 0000000001111011 11110110当A的最低位(D0)为0时,执行一次RR指令相当于对A进行一次除2操作。即除是乘的反操作。第第3章章 指令系统及汇编指令系统及汇编 3.3.4 控制转移类指令 控制转移类指令共计 17 条,可分为无条件转移指令、条件转移指令、子程序调用及返回指令。有了丰富的控制转移类指令,就能很方便地实现程序的向前、向后跳转,并根据条件分支运行、循环运行、调用子程序等。1.无条件转移指令 无条件转移指令有如下 4 条指令,它们提供了不同的转移范围和寻址方式:LJMP addr16;(PC)a

4、ddr16,addr 158 addr 70 AJMP addr11;(PC)(PC)+2,addr108 00001 addr 70 (PC)100 addr11 第第3章章 指令系统及汇编指令系统及汇编 SJMP rel ;(PC)(PC)+2+rel ,80rel JMP A+DPTR;(PC)(A)+DPTR ,73 (1)LJMP 称为长转移指令,三字节指令,提供 16 位目标地址addr16。例如:在程序存储器0000H单元存放一条指令:LJMP 3000H;(PC)3000H,02 3000 则上电复位后程序将跳到3000H 单元去执行用户程序。第第3章章 指令系统及汇编指令系统

5、及汇编 (2)AJMP称为绝对转移指令,双字节指令。它的机器代码是由 11 位直接地址addr11和指令特有操作码 00001,按下列分布组成的:该指令执行后,程序转移的目的地址是由AJMP指令所在位置的地址PC值加上该指令字节数 2,构成当前PC值。取当前PC值的高 5 位与指令中提供的 11 位直接地址形成转移的目的地址,即:a10 a9 a8 0 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0 PC15 PC14 PC13 PC12 PC11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0PC 转移目的地址:第第3章章 指令系统及汇编指令系统及汇编 由

6、于 11 位地址的范围是 0000000000011111111111,即 2 KB范围,而目标地址的高 5 位是由PC当前值固定的,所以程序可转移的位置只能是和PC当前值在同一 2 KB的范围之内。本指令转移可以向前也可以向后,指令执行后不影响状态标志位。例如:若AJMP指令地址(PC)=2300H。执行指令:AJMP 0FFH ;(PC)(PC)+2=2302H,01 FF (PC)100 00011111111 第第3章章 指令系统及汇编指令系统及汇编 结果为:转移目的地址(PC)=20FFH,程序向前转向 20FFH单元开始执行。又如:若AJMP指令地址(PC)=2FFFH。执行指令:

7、AJMP 0FFH;(PC)(PC)+2=3001H,01 FF (PC)100 00011111111 结果为:转移目的地址(PC)=30FFH,程序向后转向 30FFH单元开始执行。第第3章章 指令系统及汇编指令系统及汇编 (3)SJMP称为短转移指令,双字节指令,指令的操作数是相对地址rel。由于rel是带符号的偏移量,所以程序可以无条件向前或向后转移,转移的范围是在SJMP指令所在地址PC值(源地址)加该指令字节数2的基础上,以-128+127 为偏移量(256 个单元)的范围内实现相对短转移,即:目的地址=源地址+2+rel第第3章章 指令系统及汇编指令系统及汇编 用汇编语言编程时,

8、指令中的相对地址rel往往用欲转移至的地址的标号(符号地址)表示,能自动算出相对地址值;但人工将程序翻译成机器代码时,需自己计算相对地址rel。rel的计算公式如下:向前转移:rel=FE(源地址与目的地址差的绝对值)向后转移:rel=(源地址与目的地址差的绝对值)2 若rel值大于 80H,程序向前转移;若rel值小于 80H,则程序向后转移。例如:设(PC)=2100H,若转向215CH去执行程序,则:rel=(215CH2100H)2H=5AH第第3章章 指令系统及汇编指令系统及汇编 (4)JMP称为间接长转移指令。它是以数据指针DPTR的内容为基址,以累加器A的内容为相对偏移量,在 6

9、4 KB范围内可无条件转移的单字节指令。该指令的特点是转移地址可以在程序运行中加以改变。例如:根据累加器A的数值,转不同处理程序的入口。MOV DPTR,TABLE ;表首址送DPTR JMP A+DPTR ;依据A值转移 TABLE:AJMPTAB1;当(A)=0时转TAB1执行 AJMPTAB2;当(A)=2时转TAB2执行 AJMPTAB3;当(A)=4时转TAB3执行 第第3章章 指令系统及汇编指令系统及汇编 2.条件转移指令(判跳指令)条件转移指令是当某种条件满足时,程序转移执行;条件不满足时,程序仍按原来顺序继续执行。条件转移的条件可以是上一条指令或者更前一条指令的执行结果(常体现

10、在标志位上),也可以是条件转移指令本身包含的某种运算结果。1)累加器判零转移指令 这类指令有 2 条:JZ rel;若(A)=0,则 (PC)(PC)+2+rel 60 rel 若(A)0,则(PC)(PC)+2 第第3章章 指令系统及汇编指令系统及汇编JNZ rel;若(A)0,则(PC)(PC)+2+rel,70 rel 若(A)=0,则(PC)(PC)+2 例 1:将外部数据RAM的一个数据块传送到内部数据RAM,两者的首址分别为DATA1 和 DATA2,遇到传送的数据为零时停止。解:外部RAM向内部RAM的数据传送一定要以累加器A作为过渡,利用判零条件转移正好可以判别是否要继续传送或

11、者终止。完成数据传送的参考程序如下:第第3章章 指令系统及汇编指令系统及汇编 MOV R0,DATA1 ;外部数据块首址送R0 MOV R1,DATA2 ;内部数据块首址送R1LOOP:MOVX A,R0 ;取外部RAM数据入AHERE:JZ HERE ;数据为零则终止传送 MOV R1,A ;数据传送至内部RAM单元 INCR0 ;修改地址指针,指向下一数据地址 INCR1 SJMP LOOP ;循环取数第第3章章 指令系统及汇编指令系统及汇编 2)比较转移指令 比较转移指令共有 4 条,其一般格式为:CJNE目的操作数,源操作数,rel 这组指令是先对两个规定的操作数进行比较,根据比较的结

12、果来决定是否转移到目的地址。4 条比较转移指令如下:CJNE A,data,rel ;B4 data rel CJNE A,direct,rel ;B5direct rel CJNE Ri,data,rel ;B6B7data rel CJNER n,data,rel ;B8Bfdata rel第第3章章 指令系统及汇编指令系统及汇编 这 4 条指令的含义分别为:第 1 条指令:累加器内容与立即数比较,不等则转移;第 2 条指令:累加器内容与内部RAM(包括特殊功能寄存器)内容比较,不等则转移;第 3 条指令:内部RAM内容与立即数比较,不等则转移;第 4 条指令:工作寄存器内容与立即数比较,

13、不等则转移。第第3章章 指令系统及汇编指令系统及汇编 以上 4 条指令的差别仅在于操作数的寻址方式不同,均完成以下操作:若目的操作数=源操作数,则(PC)(PC)+3;若目的操作数源操作数,则(PC)(PC)+3+rel,CY=0;若目的操作数源操作数,则(PC)(PC)+3+rel,CY=1;指令的操作过程如图 3 6 所示。第第3章章 指令系统及汇编指令系统及汇编 偏移量rel 的计算公式为:向前转移:rel=FD(源地址与目的地址差的绝对值)向后转移:rel=(源地址与目的地址差的绝对值)-3 例如:当 P1 口输入为 3AH时,程序继续进行,否则等待,直至P1口出现 3AH。参考程序如

14、下:MOV A,3AH;立即数3A送A;74 3AWAIT:CJNE A,P1,WAIT;(P1)3AH,则等待,B5 90 FD第第3章章 指令系统及汇编指令系统及汇编图 3 6 比较转移指令操作示意图 第第3章章 指令系统及汇编指令系统及汇编 3)减 1 条件转移指令(循环转移指令)减 1 条件转移指令有如下两条:DJNZ direct,rel;(direct)(direct)1 ,D5 direct rel 若(direct)=0,则(PC)(PC)+3 否则,(PC)(PC)+3+relDJNZ Rn,rel;(Rn)(Rn)1 ,D8DF rel 若(Rn)=0,则(PC)(PC)+

15、2 否则,(PC)(PC)+2+rel第第3章章 指令系统及汇编指令系统及汇编 这组指令是把减1功能和条件转移结合在一起的一组指令。程序每执行一次该指令,就把第一操作数减 1,并且结果保存在第一操作数中,然后判断操作数是否为零。若不为零,则转移到规定的地址单元,否则顺序执行。转移的目标地址是在以PC当前值为中心的128+127 的范围内。如果第一操作数原为 00H,则执行该组指令后,结果为FFH,但不影响任何状态标志。第第3章章 指令系统及汇编指令系统及汇编 例 2:软件延时程序:MOV R1,0AH;给R1赋循环初值 DELAY:DJNZ R1,DELAY;(R1)(R1)1,若(R1)0则

16、循环 由于DJNZ R1,DELAY 为双字节双周期指令,当单片机主频为 12 MHz时,执行一次该指令需 24 个振荡周期约 2 s。因此,R1 中置入循环次数为 10 时,执行该循环指令可产生20 s 的延时时间。第第3章章 指令系统及汇编指令系统及汇编 例 3:将内部RAM中从DATA单元开始的 10 个无符号数相加,相加结果送SUM 单元保存。解:设相加结果不超过8位二进制数,则相应的程序如下:MOV R0,0AH ;给 R0 置计数器初值 MOV R1,DATA ;数据块首址送R1 CLR A ;A清零第第3章章 指令系统及汇编指令系统及汇编 LOOP:ADD A,R1 ;加一个数

17、INC R1 ;修改地址,指向下一个数 DJNZ R0,LOOP ;R0 减 1,不为零循环 MOV SUM,A ;存 10 个数相加和第第3章章 指令系统及汇编指令系统及汇编 4)空操作指令 NOP ;(PC)(PC)+1,00 空操作指令是一条单字节单周期指令。它控制CPU不做任何操作,仅仅是消耗这条指令执行所需要的一个机器周期的时间,不影响任何标志,故称为空操作指令。但由于执行一次该指令需要一个机器周期,所以常在程序中加上几条NOP指令用于设计延时程序,拼凑精确延时时间或产生程序等待等。第第3章章 指令系统及汇编指令系统及汇编 3.3.5位操作类指令 位操作又称为布尔变量操作,它是以位(

18、bit)作为单位来进行运算和操作的。MCS51系列单片机内设置了一个位处理器(布尔处理机),它有自己的累加器(借用进位标志CY),自己的存储器(即位寻址区中的各位),也有完成位操作的运算器等。第第3章章 指令系统及汇编指令系统及汇编 这一组指令的操作对象是内部RAM中的位寻址区,即20H2FH中连续的 128 位(位地址00H7FH),以及特殊功能寄存器SFR中可进行位寻址的各位。在指令中,位地址的表示方法主要有以下 4 种(均以程序状态字寄存器PSW的第五位 F0 标志为例说明):(1)直接位地址表示方式:如D5H;(2)点操作符表示(说明是什么寄存器的什么位)方式:如PSW.5,说明是PS

19、W的第五位;(3)位名称表示方法:如F0;(4)用户定义名表示方式:如用户定义用FLG这一名称(位符号地址)来代替F0,第第3章章 指令系统及汇编指令系统及汇编 1.位传送指令 位传送指令有如下互逆的两条双字节单周期指令,可实现进位位CY与某直接寻址位bit间内容的传送。MOV C,bit ;(CY)(bit),A2 bit MOV bit,C ;(bit)(CY),92 bit 上述指令中:bit为直接寻址位,C为进位标志CY的简写。第1条指令是把bit中的一位二进制数送位累加器CY中,不影响其余标志。第2条指令是将C中的内容传送给指定位。第第3章章 指令系统及汇编指令系统及汇编 由于两个寻

20、址位之间没有直接的传送指令,常用上述两条指令并通过C作为中间媒介来进行寻址位间的传送。例如:将内部RAM中20H 单元的第7位(位地址为07H)的内容,送入P1口的P1.0中的程序如下:MOV C,07H ;(CY)(07H)MOV P1.0,C ;(P1.0)(CY)当(20H)=A3H,(P1)=11111110B时,执行上述指令后修改了P1 口第 0 位,即(CY)=1,(P1)=11111111B。第第3章章 指令系统及汇编指令系统及汇编 2.位置位指令 对进位标志CY以及位地址所规定的各位都可以进行置位或清零操作,共有如下4条指令:CLR bit;(bit)0 ,C2 bit CLR

21、 C;(CY)0 ,C3 SETB bit;(bit)1 ,D2 bit SETB C ;(CY)1 ,D3第第3章章 指令系统及汇编指令系统及汇编 前两条指令为位清零指令,后两条指令为位置 1 指令。当第 1、3 条指令的直接寻址位为某端口的某位时,指令执行时具有读修改写功能。例如:将P1 口的P1.7 置位,并清进位位的程序如下:SETB P1.7 ;(P1.7)1 CLR C ;(CY)0 当(P1)=00001111B时,执行完上述指令后,(P1)=10001111B,(CY)=0。第第3章章 指令系统及汇编指令系统及汇编 3.位逻辑指令 位逻辑指令包含“与”ANL、“或”ORL、“非

22、”CPL位逻辑运算操作,共有如下 6 条指令:ANL C,bit ;(CY)(CY)(),82bitANL C,/bit ;(CY)(CY)(),B0bitORL C,bit ;(CY)(CY)(),72bitORL C,/bit ;(CY)(CY)(),A0bit CPL bit ;(bit)(),B2bitCPL C ;(CY)(C),B3 bitbitbitbitbit第第3章章 指令系统及汇编指令系统及汇编 例 1:完成(Z)=(X)(Y)异或运算,其中:X、Y、Z表示位地址。解:异或运算可表示为:(Z)=(X)()+()(Y),参考子程序如下:PR1:MOV C,X ;(CY)(X)

23、ANL C,/Y ;(CY)(X)()MOV Z,C ;暂存Z中 MOV C,Y ;(CY)(Y)ANL C,/X ;(CY)()(Y)ORL C,Z ;(CY)(X)()+()(Y)MOV Z,C ;保存异或结果 RETYXYXYX第第3章章 指令系统及汇编指令系统及汇编 例 2:利用位逻辑指令,模拟图 3 7 所示硬件逻辑电路功能。参考子程序如下:PR2:MOV C,P1.1 ;(CY)(P1.1)ORL C,P1.2 ;(CY)(P1.1)(P1.2)=A ANL C,P1.0 ;(CY)(P1.0)A CPL C ;(CY)MOV F0,C ;F0内暂存B MOV C,P1.3 ;(C

24、Y)(P1.3)ANL C,/P1.4 ;(CY)(P1.3)ORL C,F0 ;(CY)BD MOV P1.5,C ;运算结果送入P1.5 RET(1.0)PAB(1.4)PD第第3章章 指令系统及汇编指令系统及汇编 3.位条件转移指令 位条件转移指令是以进位标志CY或者位地址bit的内容作为是否转移的条件,共有 5 条指令。(1)以CY内容为条件的双字节双周期转换指令。JC rel ;若(CY)=1,则(PC)(PC)+2+rel转移 ,40 rel 否则,(PC)(PC)+2 顺序执行 JNC rel ;若(CY)=0,则(PC)(PC)+2+rel转移 ,50 rel 否则,(PC)(

25、PC)+2顺序执行 第第3章章 指令系统及汇编指令系统及汇编 这两条指令常和比较条件转移指令CJNE一起使用,先由CJNE指令判别两个操作数是否相等,若相等就顺序执行;若不相等则依据两个操作数的大小置位或清零CY(参见图 3-6),再由JC 或JNC指令根据CY的值决定如何进一步分支,从而形成三分支的控制模式,如图 3-8 所示。第第3章章 指令系统及汇编指令系统及汇编图 3 7 例 2 硬件逻辑电路 第第3章章 指令系统及汇编指令系统及汇编图 3 8CJNE 与JC(或JNC)一起构成三分支模式 第第3章章 指令系统及汇编指令系统及汇编 例 3:比较内部RAM I、J单元中A、B两数的大小。

26、若A=B,则使内部RAM的位K置 1;若AB,则大数存M单元,小数存N单元。设A、B数均为带符号数,以补码数存入I、J中,该带符号数比较子程序的比较过程示意图如图 3 9 所示。参考子程序如下:第第3章章 指令系统及汇编指令系统及汇编图 3 9 带符号数比较过程示意图 第第3章章 指令系统及汇编指令系统及汇编 MOV A,I ;A数送累加器A ANL A,80H ;判A数的正负 JNZ NEG ;A0 则转至NEG MOV A,J ;B数送累加器A ANL A,80H ;判B数的正负 JNZ BIG1 ;A0,B0,转BIG1 SJMP COMP ;A0,B0,转COMPNEG:MOV A,J

27、 ;B数送累加器A ANL A,80H ;判B数的正负 JZ SMALL ;A0,B0,转SMALL COMP:MOV A,I ;A数送累加器A第第3章章 指令系统及汇编指令系统及汇编 CJNE A,J,BIG ;AB则转BIG SETB K ;A=B,位K置 1 RETBIG:JC SMALL ;A0 Y=0 X=0 -1 X0则转移到POSI MOV A,0FFH ;若X0 时A=1 COMP:MOV FUNC,A ;存函数Y值 HERE:AJMP HERE ;结束程序第第3章章 指令系统及汇编指令系统及汇编 例 4:3 个无符号单字节整数分别存于R1、R2、R3 中,找出其中最大数放于R

28、0 中。解:首先将 R0 清零,然后进行(R1)与(R0)减法,若(R1)(R0)0,则(R1)(R0),把(R1)送(R0);否则(R0)保持不变。再将(R0)分别与(R2)和(R3)比较,比较处理的方法与上面相同,这样比较 3 次后,R0 中即为 3 数中的最大数。程序清单如下:BR2:ORG 2500H MOV R0,00H ;R0 清零 MOV A,R1 ;第一个数(R1)送A ACALL COMP ;比较(R1)与(R0)大小第第3章章 指令系统及汇编指令系统及汇编 MOV A,R2 ;第二个数(R2)送A ACALL COMP ;比较(R2)与(R0)大小 MOV A,R3 ;第三

29、个数(R3)送A ACALL COMP ;比较(R3)与(R0)大小 HERE:AJMP HERE COMP:MOV R4,A ;R4 暂存A的内容 CLR C ;清进位位C SUBB A,R0 ;(A)(R0)JC M1 ;(A)(R0)时大数存R0 M1:RET 第第3章章 指令系统及汇编指令系统及汇编例:把片外RAM的首地址为10H开始存放的数据块,传送给片内RAM首地址为20H开始的数据块中去,如果数据为“0”,就停止传送。程序如下:ORG 2000HMOV R0,#10HMOV R1,#20HLOOP:MOVX A,R0 ;A片外RAM数据第第3章章 指令系统及汇编指令系统及汇编HE

30、RE:JZ HERE ;数据=0终止,程序原地踏步MOV R1,A ;片内RAMAINC R0 INC R1 SJMP LOOP ;循环传送 END第第3章章 指令系统及汇编指令系统及汇编 3.5.4 循环结构程序设计 在解决实际问题时,往往会遇到同样的一组操作需要重复多次的情况,这时应采用循环结构,以简化程序,缩短程序的长度及节省存储空间。例如,要做 1 到 100 的加法,没有必要写 100 条加法指令,而只需写一条加法指令,使其执行 100 次,每次执行时操作数亦作相应的变化,同样能完成原来规定的操作。第第3章章 指令系统及汇编指令系统及汇编 循环程序一般由 3 部分组成:(1)置循环初

31、值:即设置循环开始时的状态。(2)循环体:即要求重复执行的部分。(3)循环控制部分:它包括循环参数修改和依据循环结束条件判断循环是否结束两部分。第第3章章 指令系统及汇编指令系统及汇编 例 5:从BLOCK单元开始有一个无符号数数据块,其长度存于LEN单元,试求出数据块中最大的数并存入MAX单元。解:该问题解决方法与例 4 相同,所不同的是无符号数个数增加,即搜索寻找最大值的范围扩大了。因此,本例题采用直到型单重循环的程序结构方式比较合理。程序框图如图 3 14 所示。第第3章章 指令系统及汇编指令系统及汇编图 3 14 例 5 程序框图 第第3章章 指令系统及汇编指令系统及汇编程序清单:LO

32、OP:ORG 2000H MOV R0,BLOCK ;数据块首址送R0 MOV R1,LEN ;数据块长度送R1 MOV MAX,00H ;存最大数单元清零 LOOP1:MOV A,MAX ;(A)(MAX)CLR C ;清C SUBB A,R0 ;(MAX)(R0)JNC NEXT ;若(MAX)(R0),则转移 MOV MAX,R0 ;若(MAX)(R0),则(MAX)(R0)NEXT:INC R0 ;修改地址指针 DJNZ R1,LOOP1 ;若(R1)0则循环搜索 RET第第3章章 指令系统及汇编指令系统及汇编 例 6:设计 100 ms延时程序。解:计算机执行一条指令需要一定的时间,

33、由一些指令组成一段程序,并反复循环执行,利用计算机执行程序所用的时间来实现延时,这种程序称为延时程序。如当系统使用 12 MHz晶振时,一个机器周期为 1 s,执行一条双字节双周期DJNZ指令的时间为 2 s,因此,执行该指令 50 000 次,就可以达到延时 100 ms的目的。对于 50 000 次循环可采用外循环、内循环嵌套的多重循环结构。本例题的程序流程如图315所示。第第3章章 指令系统及汇编指令系统及汇编 程序清单:START:ORG 1000H MOV R6,0C8H ;外循环 200 次 LOOP1:MOV R7,0F8H ;内循环 248 次 NOP ;时间补偿 LOOP2:

34、DJNZ R7,LOOP2 ;延时 2 s248=496 s DJNZ R6,LOOP1;延时 500 s200=100 ms RET 第第3章章 指令系统及汇编指令系统及汇编图 3 15 例 6 程序框图 返回第第3章章 指令系统及汇编指令系统及汇编 以上程序执行MOV Rn,data 指令的时间为 1 s,DJNZ指令 2 s,NOP指令1 s,所以,内循环延迟时间:1 s+1 s+2 s248=498 s,外循环延迟时间:1 s+(内环延时+2 s)200=100.001 ms。第第3章章 指令系统及汇编指令系统及汇编 3.5.5 子程序结构程序设计 在一个程序中,将反复出现的程序段编制

35、成一个个独立的程序段,存放在内存中,这些完成某一特定任务可被重复调用的独立程序段被称为子程序。在前面所举的例子中,已有一些程序段是以带有RET指令的子程序形式出现的。在汇编语言编程时,恰当地使用子程序,可使整个程序的结构清楚,阅读和理解方便,而且还可以减少源程序和目标程序的长度,不必多次重复书写和翻译同样的指令。在汇编语言源程序中使用子程序,需要强调注意两个问题,即子程序中参数传递和现场保护的问题。第第3章章 指令系统及汇编指令系统及汇编 一般在汇编语言中采用的参数传递方法有以下 3 种。(1)用累加器或工作寄存器来传递参数。(2)用指针寄存器传递参数。(3)用堆栈来传递参数。第第3章章 指令

36、系统及汇编指令系统及汇编 例 7:将HEX单元存放的两个十六进制数分别转换成ASCII码,并存入ASC和ASC+1 单元。解:由于伪指令DB在汇编后,使字节以ASCII码形式存放,所以采用查表子程序的方式来实现十六进制数到ASCII码的转换。转换子程序为HASC,调用时传递参数采用堆栈来完成。程序清单如下:ORG 2000H PUSH HEX ;第一个十六进制数入栈 ACALL HASC ;调查表转换子程序第第3章章 指令系统及汇编指令系统及汇编 POP ASC ;低 4 位转换值保存 MOV A,HEX ;十六进制数送A SWAP A ;高 4 位低 4 位交换 PUSH A ;第二个十六进

37、制数入栈 ACALL HASC ;调查表转换子程序 POP ASC+1 ;高 4 位转换值保存 HERE:AJMP HERE ;结束源程序 HASC:DEC SP ;DEC SP ;修改SP到参数位置 POP A ;弹出十六进制数到A ANL A,0FH ;取A低 4 位第第3章章 指令系统及汇编指令系统及汇编 ADD A,07H ;为查表进行地址调整 MOV CA,A+PC ;查表转换 PUSH A ;转换结果入栈 INC SP ;INC SP ;恢复返回地址 RET ASCTAB:DB 0,1,2,3,4,5,6,7 DB 8,9,A,B,C,D,E,F END第第3章章 指令系统及汇编指

38、令系统及汇编 由于堆栈操作是“先入后出”,因此,先压入堆栈的参数应后弹出,才能保证恢复原来的状态。例如:SUBROU:PUSH A PUSH PSW PUSH DPL PUSH DPH POP DPH POP DPL POP PSW POP A RET第第3章章 指令系统及汇编指令系统及汇编3.6.3 代码转换程序设计代码转换程序设计【例3-46】编写一子程序,将8位二进制数转换为BCD码。设要转换的二进制数在累加器A中,子程序的入口地址为BCD1,转换结果存入R0所指示的RAM中。程序如下:第第3章章 指令系统及汇编指令系统及汇编BCD1:MOVB,#100 DIVAB ;A百位数,B余数M

39、OVR0,A ;(R0)百位数INCR0MOVA,#10XCHA,BDIVAB ;A十位数,B个位数SWAPAADDA,B ;十位数和个位数组合到AMOVR0,A ;存入(R0)RET第第3章章 指令系统及汇编指令系统及汇编 例 1:十六进制数到ASCII码的转换子程序设计。解:该转换的算法为:凡大于等于 10 的十六进制数加 37 H,凡小于 10 的十六进制数加 30 H,便可得到相应的ASCII码。入口:R2(高4位为 0000,低 4 位为 00001111 的一个十六进制数0F)。出口:R2(相应的ASCII码)。程序清单如下:HASC1:MOV A,R2 ;十六进制数送A ADD

40、A,0F6H ;(A)+(-10)补 第第3章章 指令系统及汇编指令系统及汇编 MOV A,R2 ;恢复十六进制数 JNC AD30H ;若(A)10 则转AD30H ADD A,07H ;(A)10 则先加 07H AD30H:ADD A,30H ;(A)+30H MOV R2,A ;ASCII码存R2 RET 第第3章章 指令系统及汇编指令系统及汇编 例 2:ASCII码到十六进制数的转换子程序设计。解:该转换的算法为:若为 09 的ASCII码,则减去 30H;若为AF的ASCII码,则减去 37H,便可得到相应的十六进制数 0F。入口:R2(09 或AF的ASCII码)。出口:R2(高

41、 4 位为 0000,低 4 位为00001111)。程序清单如下:ASCH1:MOV A,R2 ;ASCII码值送A ADD A,0D0H ;(A)+(-30H)补 MOV R2,A ;R2暂存减结果 ADD A,0F6H ;A+(-10)补第第3章章 指令系统及汇编指令系统及汇编 JNC RET1 ;若(A)10 转RET1 MOV A,R2 ;若(A)10 则(R2)送A ADD A,0F9H ;(A)+(-07H)补 MOV R2,A ;十六进制数存R2 RET1:RET第第3章章 指令系统及汇编指令系统及汇编 3.6.2 运算子程序设计 在 3.3.2 节例 1、例 2 中已经介绍了

42、双字节无符号数的加法、减法程序,在 3.3.2 节例3中介绍了双字节数乘单字节数,以及在 3.3.2 节例 5、例 6、例 7 中介绍了BCD码加法和利用DA调整指令进行十进制减法程序等。下面再分别介绍双字节乘法、除法子程序。例 3:双字节无符号数乘法子程序设计。解:算法:两个双字节无符号数被分别放在R7、R6和R5、R4中。由于MCS51指令中只有 8 位数的乘法指令MUL,用它来实现双字节数相乘时,可把被乘数分解为:第第3章章 指令系统及汇编指令系统及汇编(R7)(R6)=(R7)28+(R6),(R5)(R4)=(R5)28+(R4)则这两个数的乘积可表示为:(R7)(R6)(R5)(R

43、4)=(R7)28+(R6)(R5)28 8+(R4)=(R7)(R5)216+(R7)(R4)28+(R6)(R5)28+(R6)(R4)=(R04)(R03)(R02)(R01)第第3章章 指令系统及汇编指令系统及汇编 显然,我们将(R6)(R4)放入(R02)(R01)中,将(R7)(R4)和(R6)(R5)累加到(R03)(R02)中;再将(R7)(R5)累加到(R04)(R03)中即可得到乘积结果。入口:(R7 R6)=被乘数;(R5 R4)=乘数;(R0)=乘积的低位字节地址指针。出口:(R0)=乘积的高位字节地址指针,指向 32 位积的高 8 位。工作寄存器:R3、R2 存放部分

44、积;R1存放进位位。第第3章章 指令系统及汇编指令系统及汇编程序清单如下:MUL1:MOV A ,R6 MOV B ,R4 MUL AB ;(R6)(R4)MOV R0,A ;R01 存乘积低 8 位 MOV R3,B ;R3暂存(R6)(R4)的高 8 位 MOV A ,R7 MOV B ,R4 MUL AB ;(R7)(R4)ADD A,R3 ;(R7)(R4)低 8 位加(R3)第第3章章 指令系统及汇编指令系统及汇编MOV R3,A ;R3暂存28 部分项低 8 位MOV A,B ;(R7)(R4)高 8 位送AADD CA,00H ;(R7)(R4)高 8 位加进位CYMOV R2,

45、A ;R2暂存 28 部分项高 8 位MOV A,R6MOV B,R5MUL AB ;(R6)(R5)ADD A,R3 ;(R6)(R5)低 8 位加(R3)INC R0 ;调整R0 地址为R02 单元MOV R0,A ;R02 存放乘积 158 位结果第第3章章 指令系统及汇编指令系统及汇编MOV R1,00H ;清暂存单元MOV A,R2ADD CA,B ;(R6)(R5)高 8 位加(R2)与CYMOV R2,A ;R2暂存 28部分项高 8 位JNC NEXT ;28 项向 216 项无进位则转移INC R1 ;有进位则R1 置 1 标记 NEXT:MOV A ,R7 MOV B,R5

46、 MUL AB ;(R7)(R5)ADD A,R2 ;(R7)(R5)低 8 位加(R2)INC R0 ;调整 R0 地址为R03第第3章章 指令系统及汇编指令系统及汇编 MOV R0,A ;R03 存放乘积 2316 位结果 MOV A,B ADD CA,R1 ;(R7)(R5)高 8 位加 28 项进位 INC R0 ;调整 R0 地址为 R04 MOV R0,A ;R04 存放乘积 3124 位结果 RET第第3章章 指令系统及汇编指令系统及汇编 例 4:双字节带符号数乘法子程序设计。解:算法:由于带符号数乘法和无符号数乘法的基本算法是一样的,因此可以根据入口条件调用例 3 MUL1子程

47、序进行计算。不同之处有以下 3 点:(1)需根据被乘数和乘数的符号计算乘积的符号;(2)当被乘数和乘数为负数时,应对它们取补,形成 2 的补码,然后才能调用MUL1进行运算;(3)当积为负数时,计算的结果尚需取补后才是正确的积(绝对值),积为 31 位。第第3章章 指令系统及汇编指令系统及汇编 乘积符号的算法在本程序中分两步完成:首先用ANL指令判断两数是否均为负,若与操作的结果为 1,则两数均为负,乘积应为正,对与的结果取反即为积的符号,存入SIG;若不属于此情况,则用ORL指令算出积的符号存入SIG。程序中SIG、SIG1、SIG2均为内部RAM中的可寻址位。入口:(R7 R6)=带符号位

48、被乘数;(R5 R4)=带符号位乘数;(R0)=乘积的低位字节地址指针。第第3章章 指令系统及汇编指令系统及汇编 出口:(R0)=乘积的高位地址指针。程序清单如下:MUL2:MOV A,R7 ;被乘数高 8 位送A RLC A ;(R7)的符号位送CY MOV SIG1,C ;SIG1 存被乘数符号 MOV A,R5 ;乘数高 8 位送A RLC A ;(R5)的符号位送CY MOV SIG2,C ;SIG2 存放乘数符号 ANL C,SIG1 ;计算积的符号第第3章章 指令系统及汇编指令系统及汇编 JC POSI ;若两数均负积为正则转POSI MOV C,SIG1 ;计算两数非全负时积的符

49、号 ORL C,SIG2 SJMP SIGN POSI:CPL C SIGN:MOV SIG,C ;存积的符号 MOV A,R7 JB A.7,CPL1 ;被乘数为负转求补 STEP1:MOV A,R5 JB A.7,CPL2 ;乘数为负转求补 第第3章章 指令系统及汇编指令系统及汇编STEP2:ACALL MUL1 ;调(R7 R6)(R5 R4)子程序 JB SIG,CPL3 ;积符号为负转求补 RETCPL1:MOV A,R6 ;被乘数求补 CPL A ADD A,01H MOV R6,A MOV A,R7 CPLA ADDC A,00H MOV R7,A SJMP STEP1 第第3章

50、章 指令系统及汇编指令系统及汇编 CPL2:MOV A,R4 ;乘数求补 CPL A ADD A,01H MOV R4,A MOV A,R5 CPLA ADD CA,00H MOV R5,A SJMP STEP2 CPL3:DEC R0 ;乘积结果求补 DEC R0 DEC R0 ;使R0指向乘积低字节地址第第3章章 指令系统及汇编指令系统及汇编 MOV R2,03H ;待取补数字节数-1 送R2 ACALL CPL4 ;调用多字节数求补子程序 RET CPL4:MOVA ,R0 ;多字节数求补 CPL A ADD A,01H MOV R0,A STEP3:INC R0 MOV A,R0 CP

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(控制转类指令-课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|