第六章 子程序设计_第1页
第六章 子程序设计_第2页
第六章 子程序设计_第3页
第六章 子程序设计_第4页
第六章 子程序设计_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

1、汇编语言程序设计第六章第六章 子程序设计子程序设计1、 子程序的设计方法 2 、子程序的嵌套3 、子程序应用举例 汇编语言程序设计子程序的设计方法1、子程序的定义 2、 子程序的调用与返回指令3、 保存与恢复寄存器4、子程序的参数传递汇编语言程序设计子程序的定义子程序的定义将一些常用的具有通用功能的操作编写成子程序,便于一将一些常用的具有通用功能的操作编写成子程序,便于一个或多个程序使用,使程序设计模块化,从而达到代码个或多个程序使用,使程序设计模块化,从而达到代码复用、简化编程的目的。复用、简化编程的目的。子程序定义伪指令:子程序定义伪指令:子程序名子程序名 PROC NEAR /FAR 子

2、程序体子程序体 RET子程序名子程序名 ENDP其中:其中:PROCPROC表示子程序开始,表示子程序开始,ENDPENDP表示子程序结束。表示子程序结束。过程名是子程序的入口地址,在程序中是唯一的。它应过程名是子程序的入口地址,在程序中是唯一的。它应满足标识符的命名规则。满足标识符的命名规则。FARFAR或或NEARNEAR是子程序的属性操作符,缺省时为是子程序的属性操作符,缺省时为NEARNEAR属性。属性。汇编语言程序设计NEAR的用法汇编语言程序设计FAR的用法汇编语言程序设计需要注意的问题1、在子程序体内,必须保证有一条、在子程序体内,必须保证有一条RET指令被执行。如:指令被执行。

3、如:PROC1 PROC MOV AX,0 PROC1 ENDP PROC2 PROC MOV BX,-1 RET PROC2 ENDP当用指令当用指令CALL PROC1 调用子程序调用子程序PROC1时,程序执行完时,程序执行完PROC1后,直接顺序执行子程序后,直接顺序执行子程序PROC2,当执行到,当执行到RET时时才返回。汇编程序不会在才返回。汇编程序不会在PROC1的的ENDP伪指令处返回主伪指令处返回主程序。程序。2、当调用程序和子程序在同一个程序段时,属性选择、当调用程序和子程序在同一个程序段时,属性选择NEAR,当调用程序和子程序不在同一个程序段时,属性应选择当调用程序和子程

4、序不在同一个程序段时,属性应选择FAR。汇编语言程序设计子程序的调用与返回指令子程序的调用指令子程序的调用指令 指令格式:指令格式: CALL DST其中:目的操作数其中:目的操作数DST 是子程序名或子程序首地是子程序名或子程序首地址址,可以是与转移指令有关的四种转移的寻址方可以是与转移指令有关的四种转移的寻址方式之一,即:段内直接调用、段内间接调用、段式之一,即:段内直接调用、段内间接调用、段间直接调用、段间间接调用。间直接调用、段间间接调用。如果目的操作数如果目的操作数DST是子程序名(子程序首地址)是子程序名(子程序首地址)或是转移地址,该有效地址直接出现在或是转移地址,该有效地址直接

5、出现在CALL指指令中,则为直接调用;如果有效地址是在寄存器令中,则为直接调用;如果有效地址是在寄存器或存储器中间接得到的,则为间接调用。或存储器中间接得到的,则为间接调用。 汇编语言程序设计CALL指令的格式段内直接近调用1、CALL 子程序名2、CALL NEAR PTR 子程序名段内间接近调用3、CALL 寄存器操作数4、CALL WORD PTR 存储器操作数段间直接远调用5、CALL FAR PTR 子程序名段间间接远调用6、CALL D WORD PTR 存储器操作数汇编语言程序设计CALL指令的格式1)段内直接调用SP=SP-2 ; SS:SPCALL指令的下一条指令的偏移地址I

6、P = IP +D16(当DST为16位)2)段内间接调用SP=SP-2 ; SS:SPCALL指令的下一条指令的偏移地址IP = DST中的有效地址EA(当DST为16位)汇编语言程序设计子程序的调用指令子程序的调用指令3)段间直接调用SP = SP-2; SS:SP 返回地址的段地址SP = SP-2; SS:SP 返回地址的偏移地址IP =DST的偏移地址CSDST的段地址汇编语言程序设计子程序的调用指令子程序的调用指令4)段间间接调用SP = SP-2; SS:SP 返回地址的段地址SP = SP-2; SS:SP 返回地址的偏移地址IP=EA的低16位CS=EA的高16位汇编语言程序

7、设计子程序的返回指令指令格式:RET指令功能:段内返回:取栈顶的两字节内容送IP寄存器。段间返回:将堆栈中保存的IP和CS值分别送IP和CS寄存器。带立即数的返回指令: RET NN一般为偶数;该指令除了执行RET指令的功能外还要修改SP的值即:SP=SP+N汇编语言程序设计指令总结指令格式指令格式 指令功能指令功能 寻址方式寻址方式 CALL DSTCALL DSTCALL NEAR PTR DST CALL NEAR PTR DST SP=SP-2SP=SP-2;SSSS:SP CALLSP CALL指令的下一条指令的指令的下一条指令的IPIP值值IP=IP+DIP=IP+D1616 (当

8、(当DSTDST为为1616位)位)段内直接调用段内直接调用 CALL FAR PTR DST CALL FAR PTR DST SP=SP-2SP=SP-2;SSSS:SPSP返回地址的段地址返回地址的段地址SP=SP-2SP=SP-2;SSSS:SPSP返回地址的偏移值返回地址的偏移值 IP=DSTIP=DST的偏移地址,的偏移地址,CS=DSTCS=DST的段地址的段地址 段间直接调用段间直接调用CALL CALL 寄存器操作数寄存器操作数 如:如:CALL BXCALL BXCALL WORD PTR MCALL WORD PTR MSP=SP-2SP=SP-2; SSSS:SP CA

9、LLSP CALL指令的下一条指令指令的下一条指令的的IPIP值值IP=DSTIP=DST中的有效地址中的有效地址EAEA(当(当DSTDST为为1616位)位)(IP BXIP BX的值)的值) 段内间接调用段内间接调用CALL DWORD PTR DSTCALL DWORD PTR DST如:如:CALL DWORD PTRBX CALL DWORD PTRBX SP=SP-2SP=SP-2; SSSS:SP SP 返回地址的段地址返回地址的段地址SP=SP-2SP=SP-2; SSSS:SP SP 返回地址的偏移值返回地址的偏移值IP=EAIP=EA的低的低1616位,位,CS=EACS

10、=EA的高的高1616位(位(IP DS:BXIP DS:BX的值的值 ,CS DS:BX+2,CS DS:BX+2的值)的值) 段间间接调用段间间接调用RET RET IP SS:SPIP SS:SP,SP = SP+2 SP = SP+2 段内返回段内返回RET RET IP SPIP SP,SP =SP+2CSSPSP =SP+2CSSP,SP= SP+2 SP= SP+2 段间返回段间返回RET NRET NIP SPIP SP,SP=SP+2 SP=SP+2 (段内)(段内)CS SPCS SP,SP=SP+2SP=SP+2(段间)(段间)SP SP+ nSP SP+ n 段内或段间

11、带参段内或段间带参数调用数调用汇编语言程序设计例子1、分析下列程序段,回答指定问题。10A3H:2000H XOR AL, AL10A3H:2002H MOV AX, CS10A3H:2004H MOV SS, AX10A3H:2006H MOV SP, 2F00H10A3H:2009H MOV DX, 2012H10A3H:200CH PUSH DX10A3H:200DH CALL 2700H10A3H:2010H ADD CX, DX10A3H:2012H HLT10A3H:2700H POP CX RET执行后(AX)=? (SP)=? (DX)=? (CX)= ? ZF = ?汇编语言

12、程序设计答案分析下列程序段,回答指定问题。10A3H:2000H XOR AL, AL10A3H:2002H MOV AX, CS10A3H:2004H MOV SS, AX10A3H:2006H MOV SP, 2F00H10A3H:2009H MOV DX, 2012H10A3H:200CH PUSH DX10A3H:200DH CALL 2700H10A3H:2010H ADD CX, DX10A3H:2012H HLT10A3H:2700H POP CX RET执行后(AX)=10A3H (SP)=2F00H (DX)=2012H (CX)= 2010H ZF = 1汇编语言程序设计保

13、存与恢复寄存器子程序中需要使用的寄存器,有可能在主程序中正被用来保存某种中间结果,这些寄存器的值在从子程序返回主程序后还要继续使用, 这些寄存器的值或所需的标志位的值等信息称之为现场。显然,子程序执行前需要保护现场,返回时要恢复现场。 汇编语言程序设计保存与恢复寄存器保存现场与恢复现场的工作既可在调用程序中完成,保存现场与恢复现场的工作既可在调用程序中完成,也可在子程序中完成,程序设计时根据情况安排。也可在子程序中完成,程序设计时根据情况安排。如果子程序已经设计好了,而其中未保护主程序现如果子程序已经设计好了,而其中未保护主程序现场,那么调用程序在使用子程序之前应保护现场,场,那么调用程序在使

14、用子程序之前应保护现场,从子程序返回后再恢复现场。从子程序返回后再恢复现场。 通常在主程序中保护现场,则一定在主程序中恢通常在主程序中保护现场,则一定在主程序中恢复;在子程序中保护现场,则一定在子程序中恢复。复;在子程序中保护现场,则一定在子程序中恢复。这样可以增强主程序和子程序之间的相对独立性,这样可以增强主程序和子程序之间的相对独立性,减少相互依赖,使程序结构清楚,减少错误。减少相互依赖,使程序结构清楚,减少错误。汇编语言程序设计保护现场和恢复现场的方法 (1) (1) 利用压栈和出栈指令,将寄存器内容或状态标志位内容利用压栈和出栈指令,将寄存器内容或状态标志位内容保存在堆栈中,恢复时再从

15、堆栈中取出。如:保存在堆栈中,恢复时再从堆栈中取出。如:SUBT PROCSUBT PROC NEAR NEAR PUSH AXPUSH AX; ;保存现场保存现场 PUSH BXPUSH BX PUSH CX PUSH CX PUSH DX PUSH DX . . ; ;子程序正常工作子程序正常工作 POP DXPOP DX; ;恢复现场恢复现场 POP CX POP CX POP BX POP BX POP AX POP AX RET RET SUBT ENDP SUBT ENDP汇编语言程序设计保护现场和恢复现场的方法在子程序设计时,应仔细考虑哪些寄存器是必须保存在子程序设计时,应仔细考

16、虑哪些寄存器是必须保存的,哪些寄存器是不必要保存的。一般来说,子程的,哪些寄存器是不必要保存的。一般来说,子程序中用到的寄存器是应该保存的。序中用到的寄存器是应该保存的。(2) (2) 利用内存单元。用传送指令将寄存器的内容保存利用内存单元。用传送指令将寄存器的内容保存到指定的内存单元,恢复时再用传送指令取出。到指定的内存单元,恢复时再用传送指令取出。汇编语言程序设计设计子程序时应考虑的问题(1)(1)子程序名(子程序入口地址):用过程(子程序)定义伪子程序名(子程序入口地址):用过程(子程序)定义伪指令定义该过程(子程序)时的过程名,这时过程(子程序)指令定义该过程(子程序)时的过程名,这时

17、过程(子程序)中第一条语句必须是子程序的入口指令;否则应写子程序入中第一条语句必须是子程序的入口指令;否则应写子程序入口指令的标号或地址。口指令的标号或地址。 (2)(2)子程序功能:用自然语言或数学语言等形式简单清楚地描子程序功能:用自然语言或数学语言等形式简单清楚地描述子程序完成的任务。述子程序完成的任务。(3)(3)入口参数:说明子程序要求有几个入口参数,这些参数表入口参数:说明子程序要求有几个入口参数,这些参数表示的意义及存放位置。示的意义及存放位置。(4)(4)出口参数:说明子程序有几个输出参数(运行结果),这出口参数:说明子程序有几个输出参数(运行结果),这些参数表示的意义、存放的

18、位置。些参数表示的意义、存放的位置。(5)(5)受影响的寄存器:说明子程序运行后,哪些寄存器的内容受影响的寄存器:说明子程序运行后,哪些寄存器的内容被破坏了,以便使用者在调用该子程序之前注意保护现场。被破坏了,以便使用者在调用该子程序之前注意保护现场。汇编语言程序设计子程序的参数传递参数传递通常有三种方法:1 1、通过寄存器传递参数、通过寄存器传递参数2 2、通过地址表传递参数地址、通过地址表传递参数地址3 3、通过堆栈传递参数或参数地址、通过堆栈传递参数或参数地址汇编语言程序设计通过寄存器传递参数通过寄存器进行主程序和子程序之间的参数传通过寄存器进行主程序和子程序之间的参数传递是最常用的参数

19、传递方式。由于递是最常用的参数传递方式。由于CPUCPU中的寄中的寄存器是有限的,因此通过寄存器传递参数适存器是有限的,因此通过寄存器传递参数适用于入口参数较少的情况。它一般通过寄存用于入口参数较少的情况。它一般通过寄存器传递数据或数据地址。常用:器传递数据或数据地址。常用:ALAL,AXAX,DX DX 寄存器传数据,用寄存器传数据,用SISI,DIDI,BX BX 传地址。传地址。 汇编语言程序设计子程序的参数传递例 编制程序计算:Z=2X+3Y+150设X,Y 为整数字数据,且存于PX和PY字单元,计算结果存入RLT字单元。 汇编语言程序设计例子开平方子程序和调用程序,约定将被开平方数放

20、在DX中,平方根也放在DX中,其结果求得平方根的整数部分。1:;*LZ601S*2:SQROOTPROCNEAR3:XORAX,AX;i04:ANDDX,DX;测试被开方数5:JZSQRT2;被开方数为06:SQRT1:MOVBX,AX;形成奇数7:SHLBX,18:INCBX9:SUBDX,BX;被开方数减去奇数10:JCSQRT2;不够减11:INCAX;够减,i增112:JMPSQRT1;继续13:SQRT2:MOVDX,AX;DX平方根14:RET;返回15:SQROOTENDP汇编语言程序设计例子2:SSEGSEGMENT STACK 3:STKTOP DB 20 DUP(0) 4:

21、SSEG ENDS 5:DSEG SEGMENT 6:PX DW 200 7:PY DW 300 8:RLT DW 0 9:DSEG ENDS 10:CSEG SEGMENT 11: ASSUME CS:CSEG,DS:DSEG 12: ASSUME SS:SSEG 13:MAIN: MOV AX,DSEG 14: MOV DS,AX 15: MOV AX,SSEG 16: MOV SS,AX 汇编语言程序设计例子17: MOV SP,SIZE STKTOP17: MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX; ;取取X X19:19:ADDADDDX,DX

22、DX,DX; ;计算计算2X2X20:20:CALLCALLSQROOT1SQROOT1; ;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX; ;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY; ;取取Y Y23:23:MOVMOVAX,DXAX,DX; ;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX26:26:CALLCALLSQROOT1SQROOT1; ;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX; ;取出取出2X2X28:28:ADDADDAX,DXAX,DX;

23、 ;计算计算2X+3Y2X+3Y29:29:PUSHPUSHAXAX; ;暂存结果暂存结果30:30:MOVMOVDX,150DX,15031:31:CALLCALLSQROOT1SQROOT132:32:POPPOPAXAX; ;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX; ;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX; ;保存结果保存结果35:35:MOVMOVAH,4CHAH,4CH36:36:INTINT21H21H37:CSEG37:CSEGENDSENDS38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1

24、PROCPROCNEARNEARXORXORAX,AXAX,AXANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2SQRT2INCINCAXAXJMPJMPSQRT1SQRT1SQRT2:SQRT2:MOVMOVDX,AXDX,AXRETRETSQROOT1SQROOT1ENDPENDP汇编语言程序设计例子17: MOV SP,SIZE STKTOP17: MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,

25、PX; ;取取X X19:19:ADDADDDX,DXDX,DX; ;计算计算2X2X20:20:CALLCALLSQROOT1SQROOT1; ;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX; ;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY; ;取取Y Y23:23:MOVMOVAX,DXAX,DX; ;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX26:26:CALLCALLSQROOT1SQROOT1; ;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX; ;取出取出

26、2X2X28:28:ADDADDAX,DXAX,DX; ;计算计算2X+3Y2X+3Y29:29:PUSHPUSHAXAX; ;暂存结果暂存结果30:30:MOVMOVDX,150DX,15031:31:CALLCALLSQROOT1SQROOT132:32:POPPOPAXAX; ;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX; ;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX; ;保存结果保存结果35:35:MOVMOVAH,4CHAH,4CH36:36:INTINT21H21H37:CSEG37:CSEGENDSENDS38:38:END

27、ENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEARXORXORAX,AXAX,AXANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2SQRT2INCINCAXAXJMPJMPSQRT1SQRT1SQRT2:SQRT2:MOVMOVDX,AXDX,AXRETRETSQROOT1SQROOT1ENDPENDP初始态(执行指令后)0BH0DH0EH0FH10H11H12H13H14HSP汇编语言程序设计

28、17: MOV SP,SIZE STKTOP17: MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX; ;取取X X19:19:ADDADDDX,DXDX,DX; ;计算计算2X2X20:20:CALLCALLSQROOT1SQROOT1 ; ;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX; ;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY; ;取取Y Y23:23:MOVMOVAX,DXAX,DX; ;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX26:26

29、:CALLCALLSQROOT1SQROOT1 ; ;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX; ;取出取出2X2X28:28:ADDADDAX,DXAX,DX; ;计算计算2X+2X+3Y3Y29:29:PUSHPUSHAXAX; ;暂存结果暂存结果30:30:MOVMOVDX,150DX,15031:31:CALLCALLSQROOT1SQROOT132:32:POPPOPAXAX; ;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX; ;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX; ;保存结果保存结果35:35:M

30、OVMOVAH,4CHAH,4CH36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEARXORXORAX,AXAX,AXANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2SQRT2INCINCAXAXJMPJMPSQRT1SQRT1SQRT2:SQRT2:MOVMOVDX,AXDX,AXRETRETSQ

31、ROOT1SQROOT1ENDPENDP0BH0DH0EH0FH10H11H12HSP13H14H执行指令执行指令后后汇编语言程序设计17: MOV SP,SIZE STKTOP17: MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX; ;取取X X19:19:ADDADDDX,DXDX,DX; ;计算计算2X2X20:20:CALLCALLSQROOT1SQROOT1 ; ;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX; ;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY; ;取取Y Y23:23:MOVMOVAX,

32、DXAX,DX; ;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX26:26:CALLCALLSQROOT1SQROOT1 ; ;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX; ;取出取出2X2X28:28:ADDADDAX,DXAX,DX; ;计算计算2X+2X+3Y3Y29:29:PUSHPUSHAXAX; ;暂存结果暂存结果30:30:MOVMOVDX,150DX,15031:31:CALLCALLSQROOT1SQROOT132:32:POPPOPAXAX; ;取出中间结果取出中间结果33:33:ADDADD

33、AX,DXAX,DX; ;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX; ;保存结果保存结果35:35:MOVMOVAH,4CHAH,4CH36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEARXORXORAX,AXAX,AXANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2

34、SQRT2INCINCAXAXJMPJMPSQRT1SQRT1SQRT2:SQRT2:MOVMOVDX,AXDX,AXRETRETSQROOT1SQROOT1ENDPENDP0BH0DH0EH0FH10H11H12H13H14HSP执行指令RET后汇编语言程序设计17: MOV SP,SIZE STKTOP17: MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX; ;取取X X19:19:ADDADDDX,DXDX,DX; ;计算计算2X2X20:20:CALLCALLSQROOT1SQROOT1 ; ;调用开平方子程序调用开平方子程序21:21:PUSHPUS

35、HDXDX; ;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY; ;取取Y Y23:23:MOVMOVAX,DXAX,DX; ;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX26:26:CALLCALLSQROOT1SQROOT1 ; ;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX; ;取出取出2X2X28:28:ADDADDAX,DXAX,DX; ;计算计算2X+2X+3Y3Y29:29:PUSHPUSHAXAX; ;暂存结果暂存结果30:30:MOVMOVDX,150DX,15031:31:

36、CALLCALLSQROOT1SQROOT132:32:POPPOPAXAX; ;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX; ;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX; ;保存结果保存结果35:35:MOVMOVAH,4CHAH,4CH36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEARXORXORAX,AXAX,AXANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:

37、MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2SQRT2INCINCAXAXJMPJMPSQRT1SQRT1SQRT2:SQRT2:MOVMOVDX,AXDX,AXRETRETSQROOT1SQROOT1ENDPENDP0BH0DH0EH0FH10H11H12HSP13H2 2X X14H执行指令后汇编语言程序设计17: MOV SP,SIZE STKTOP17: MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX; ;取取X X19:19:ADDADDDX,DXDX,DX; ;计

38、算计算2X2X20:20:CALLCALLSQROOT1SQROOT1 ; ;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX; ;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY; ;取取Y Y23:23:MOVMOVAX,DXAX,DX; ;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX26:26:CALLCALLSQROOT1SQROOT1 ; ;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX; ;取出取出2X2X28:28:ADDADDAX,DXAX,DX; ;计算计算2

39、X+2X+3Y3Y29:29:PUSHPUSHAXAX; ;暂存结果暂存结果30:30:MOVMOVDX,150DX,15031:31:CALLCALLSQROOT1SQROOT132:32:POPPOPAXAX; ;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX; ;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX; ;保存结果保存结果35:35:MOVMOVAH,4CHAH,4CH36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPR

40、OCNEARNEARXORXORAX,AXAX,AXANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2SQRT2INCINCAXAXJMPJMPSQRT1SQRT1SQRT2:SQRT2:MOVMOVDX,AXDX,AXRETRETSQROOT1SQROOT1ENDPENDP0BH0DH0EH0FH10HSP11H12H13H2X2X14H执行指令后汇编语言程序设计17: MOV SP,SIZE STKTOP17: MOV SP,S

41、IZE STKTOP18:18:MOVMOVDX,PXDX,PX; ;取取X X19:19:ADDADDDX,DXDX,DX; ;计算计算2X2X20:20:CALLCALLSQROOT1SQROOT1 ; ;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX; ;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY; ;取取Y Y23:23:MOVMOVAX,DXAX,DX; ;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX26:26:CALLCALLSQROOT1SQROOT1 ; ;调用开平方子程

42、序调用开平方子程序27:27:POPPOPAXAX; ;取出取出2X2X28:28:ADDADDAX,DXAX,DX; ;计算计算2X+2X+3Y3Y29:29:PUSHPUSHAXAX; ;暂存结果暂存结果30:30:MOVMOVDX,150DX,15031:31:CALLCALLSQROOT1SQROOT132:32:POPPOPAXAX; ;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX; ;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX; ;保存结果保存结果35:35:MOVMOVAH,4CHAH,4CH36:36:INTINT21H21

43、H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEARXORXORAX,AXAX,AXANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2SQRT2INCINCAXAXJMPJMPSQRT1SQRT1SQRT2:SQRT2:MOVMOVDX,AXDX,AXRETRETSQROOT1SQROOT1ENDPENDP0BH0DH0EH0FH10

44、H11H12HSP13H2X2X14H执行指令RET后汇编语言程序设计17: MOV SP,SIZE STKTOP17: MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX; ;取取X X19:19:ADDADDDX,DXDX,DX; ;计算计算2X2X20:20:CALLCALLSQROOT1SQROOT1 ; ;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX; ;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY; ;取取Y Y23:23:MOVMOVAX,DXAX,DX; ;计算计算3Y3Y24:24:ADDADDDX

45、,DXDX,DX25:25:ADDADDDX,AXDX,AX26:26:CALLCALLSQROOT1SQROOT1 ; ;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX; ;取出取出2X2X28:28:ADDADDAX,DXAX,DX; ;计算计算2X+2X+3Y3Y29:29:PUSHPUSHAXAX; ;暂存结果暂存结果30:30:MOVMOVDX,150DX,15031:31:CALLCALLSQROOT1SQROOT132:32:POPPOPAXAX; ;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX; ;计算最终结果计算最终结果34:34:M

46、OVMOVRLT,AXRLT,AX; ;保存结果保存结果35:35:MOVMOVAH,4CHAH,4CH36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEARXORXORAX,AXAX,AXANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2SQRT2INCINCAXAXJMPJMPSQRT1SQRT1S

47、QRT2:SQRT2:MOVMOVDX,AXDX,AXRETRETSQROOT1SQROOT1ENDPENDP0BH0DH0EH0FH10H11H12H13H2 2X X14HSP执行指令后汇编语言程序设计通过存储器传递参数下面设计的开平方子程序与调用程序,约定被开方数放在ARGX字单元,计算结果放入ROOT字单元。1:;*LZ602S* 2:SQROOT2PROCNEAR 3:XORAX,AX;i04:ANDDX,DX;测试被开方数5:JZSQRT2 ;被开方数为06:SQRT1:MOVBX,AX;形成奇数7:SHLBX,18:INCBX9:SUBDX,BX;被开方数减去奇数10:JCSQR

48、T2 ;不够减11:INCAX;够减,i增112:JMPSQRT1 ;继续13:SQRT2:MOVDX,AX14:RET;返回15:SQROOT2ENDPMOV DX,ARGXMOV ROOT,AX汇编语言程序设计17: MOV SP,SIZE STKTOP17: MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX; ;取取X X19:19:ADDADDDX,DXDX,DX; ;计算计算2X2X MOV MOV ARGX,DXARGX,DX 20:20:CALLCALLSQROOT2SQROOT2 ; ;调用开平方子程序调用开平方子程序21:21:PUSHPUSH

49、ROOTROOT; ;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY; ;取取Y Y23:23:MOVMOVAX,DXAX,DX; ;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX MOV MOV ARGX,DXARGX,DX 26:26:CALLCALLSQROOT2SQROOT2 ; ;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX; ;取出取出2X2X28:28:ADDADDAX,ROOTAX,ROOT ; ;计算计算2X+2X+3Y3Y29:29:PUSHPUSHAXAX; ;暂存结果暂存

50、结果30:30:MOVMOVARGXARGX,150,15031:31:CALLCALLSQROOT2SQROOT232:32:POPPOPAXAX; ;取出中间结果取出中间结果33:33:ADDADDAX,AX,ROOTROOT ; ;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX; ;保存结果保存结果35:35:MOVMOVAH,4CHAH,4CH36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN1SQROOT2SQROOT2PROCPROCNEARNEARXORXORAX,AXAX,AXM

51、OV DX,ARGX ANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2SQRT2INCINCAXAXJMPJMPSQRT1SQRT1SQRT2:SQRT2:MOVMOVROOT,ROOT,AXAXRETRETSQROOT2SQROOT2ENDPENDP汇编语言程序设计通过堆栈传递参数通过堆栈传递参数堆栈法传送参数是调用程序先将参数压入堆栈,子程序从堆栈中把参数取出,进行处理,然后把结果压入堆栈,调用程序再从堆栈中取出结果。1:;*

52、LZ603S*2:SQROOT3PROCNEAR3:INCSP4:INCSP5:POPDX6:XORAX,AX;i07:ANDDX,DX;测试被开方数.13:SQRT2:PUSHAX14:DECSP15:DECSP16:RET;返回17:SQROOT3ENDP汇编语言程序设计17: 17: MOV SP,SIZE STKTOP MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX; ;取取X X19:19:ADDADDDX,DXDX,DX; ;计算计算2X2X PUSH PUSH DX DX 20: 20: CALLCALLSQROOT3SQROOT3 22:22:

53、MOVMOVDX,PYDX,PY23:23:MOVMOVAX,DXAX,DX24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX PUSH PUSH DX DX 26: 26: CALLCALLSQROOT3SQROOT3 POPPOPDXDX27: 27: POPPOPAXAX28:28:ADDADDAX,DXAX,DX; ;计算计算2X+2X+3Y3Y29:29:PUSHPUSHAXAX; ;暂存结果暂存结果30:30:MOVMOVDXDX,150,150PUSHPUSHDXDX31:31:CALLCALLSQROOT3SQROOT3POPPOPDXDX

54、32:32:POPPOPAXAX; ;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX; ;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX; ;保存结果保存结果35:35:MOVMOVAH,4CHAH,4CH36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN11:;1:;* * * * * * LZ603S * * * * * *2:SQROOT32:SQROOT3PROCPROCNEARNEAR3:3:INCINCSPSP4:4:INCINCSPSP5:5:POPPOPDX

55、DX6:6:XORXORAX,AXAX,AX7:7:ANDANDDX,DXDX,DX. . . .13:SQRT2:13:SQRT2:PUSHPUSHAXAX14:14:DECDECSPSP15:15:DECDECSPSP16:16:RETRET; ;返回返回17:SQROOT317:SQROOT3ENDPENDP0BH0DH0EH0FH10H11H12H13H14HSP初始态(执行指令后)汇编语言程序设计17: 17: MOV SP,SIZE STKTOP MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX; ;取取X X19:19:ADDADDDX,DXDX,

56、DX; ;计算计算2X2X PUSH PUSH DX DX 20: 20: CALLCALLSQROOT3SQROOT3 22:22:MOVMOVDX,PYDX,PY23:23:MOVMOVAX,DXAX,DX24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX PUSH PUSH DX DX 26: 26: CALLCALLSQROOT3SQROOT3 POPPOPDXDX27: 27: POPPOPAXAX28:28:ADDADDAX,DXAX,DX; ;计算计算2X+2X+3Y3Y29:29:PUSHPUSHAXAX; ;暂存结果暂存结果30:30:M

57、OVMOVDXDX,150,150PUSHPUSHDXDX31:31:CALLCALLSQROOT3SQROOT3POPPOPDXDX32:32:POPPOPAXAX; ;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX; ;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX; ;保存结果保存结果35:35:MOVMOVAH,4CHAH,4CH36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN12:SQROOT32:SQROOT3PROCPROCNEARNEAR3:3:INCIN

58、CSPSP4:4:INCINCSPSP5:5:POPPOPDXDX6:6:XORXORAX,AXAX,AX7:7:ANDANDDX,DXDX,DX. . . .13:13:SQRT2:SQRT2:PUSHPUSHAXAX14:14:DECDECSPSP15:15:DECDECSPSP16:16:RETRET; ;返回返回17:SQROOT317:SQROOT3ENDPENDP执行指令后0BH0DH0EH0FH10H11H12HSP13H2X14H汇编语言程序设计17: 17: MOV SP,SIZE STKTOP MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX

59、; ;取取X X19:19:ADDADDDX,DXDX,DX; ;计算计算2X2X PUSH PUSH DX DX 20: 20: CALLCALLSQROOT3SQROOT3 22:22:xxyyxxyy MOVMOVDX,PYDX,PY23:23:MOVMOVAX,DXAX,DX24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX PUSH PUSH DX DX 26: 26: CALLCALLSQROOT3SQROOT3 POPPOPDXDX27: 27: POPPOPAXAX28:28:ADDADDAX,DXAX,DX; ;计算计算2X+2X+3Y3

60、Y29:29:PUSHPUSHAXAX; ;暂存结果暂存结果30:30:MOVMOVDXDX,150,150PUSHPUSHDXDX31:31:CALLCALLSQROOT3SQROOT3POPPOPDXDX32:32:POPPOPAXAX; ;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX; ;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX; ;保存结果保存结果35:35:MOVMOVAH,4CHAH,4CH36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN11:;1:;

温馨提示

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

评论

0/150

提交评论