《第8章子程序.ppt》由会员分享,可在线阅读,更多相关《第8章子程序.ppt(100页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1-1过程过程(子程序)的实现(子程序)的实现子程序的引出 在我们编写解决实际问题的程序时,往往会遇到多处使用相同功能的程序段,使用该程序段的唯一差别是对程序变量赋不同的值,例如计算:S=2X+3 3Y+150主程序主程序:CALL SUBR:CALL SUBR:子程序子程序SUBR:RET子程序子程序SUBR:RET1-31、调用程序、调用程序与与过程(子程序)过程(子程序)循循环环程程序序设设计计技技术术能能够够解解决决在在同同一一程程序序中中连连续续重重复复执执行行同同一一个个程程序序段段的的问问题题,但但是是对对于于非非连连续续地地重重复复执执行行同同一一程程序序段段的的问问题题则则无
2、无能能为力。为力。对对于于在在不不同同的的代代码码段段,以以及及在在不不同同的的源源程程序序中中用用到到同同一一个个程程序序段段的的问问题题也也不不能能用用循循环环程序设计技术来解决。程序设计技术来解决。1-4 此此时时,为为了了避避免免重重复复劳劳动动,节节省省程程序序代代码码所所占占的的存存储储空空间间,往往往往将将需需要要重重复复或或经经常常使使用用的的程程序序段段编编制制成成独独立立的的程程序序,在在需需要要的的位位置置使用使用特定的指令特定的指令调用调用该独立的程序。该独立的程序。这这里里所所说说的的独独立立的的程程序序就就称称为为子子程程序序,也称为也称为过程过程。使用子程序的好处
3、使用子程序的好处:(1)简化了程序设计过程,减少了工作量,节省了时间;(2)源程序缩短,节省了机器汇编源程序的时间和存储目标代码的存储空间;(3)增加了源程序的可读性,便于调试维护;(4)有利于程序模块化、结构化和自顶向下的程序设计;(5)子程序一旦编制成功,在开发研制各种软件时都可利用,大大缩短了软件的开发周期。1-62、调用指令、调用指令与与返回指令返回指令 实实现现上上述述的的过过程程调调用用以以及及过过程程返返回回需需要要分分别别使用使用调用指令调用指令与与返回指令返回指令。分为:分为:近调用(近调用(过程与调用程序在同一代码段中)过程与调用程序在同一代码段中)远调用(远调用(过程与调
4、用程序在不同的代码段)过程与调用程序在不同的代码段)又分为:又分为:直接调用(直接调用(指令中直接给出子程序的标号)指令中直接给出子程序的标号)间接调用(间接调用(指令中间接给出子程序的标号)指令中间接给出子程序的标号)1-7 子程序的结构 调用程序与子程序在同一代码段内的程序结构调用程序与子程序在同一代码段内的程序结构1-8调用程序与子程序不在同一代码段内的程序结构调用程序与子程序不在同一代码段内的程序结构子程序的结构1-9指 令功 能CALL 近标号下一指令偏移地址入栈,转到近标号指定的段内位置,即实现直接近调用CALL MEM16/REG16下一指令偏移地址入栈,转到16位存储单元/寄存
5、器指定的段内位置,即实现间接近调用CALL 远标号下一指令段地址、偏移地址依次入栈,转到远标号指定的段外位置,即实现直接远调用CALL MEM32下一指令段地址、偏移地址依次入栈,转到32位存储单元指定的段外位置,即实现间接远调用RET前一CALL指令执行时入栈的地址出栈,使程序转到前一CALL指令的下一指令位置RET n在RET指令功能的基础上,使堆栈指针下移n(正偶数)个字节1-10CALL 近标号近标号;将顺序排列的下一指令的地址压入堆栈将顺序排列的下一指令的地址压入堆栈(以便返回以便返回);将;将 近标号近标号送送 IP,也即转向,也即转向近标近标号处号处执行程序。执行程序。CALL
6、远标号;远标号;将下一指令的地址压入堆栈;将将下一指令的地址压入堆栈;将 远标号远标号地址的段基址地址的段基址送送CS,同时将,同时将远标号地址的远标号地址的偏偏移地址移地址送送IP,也即转向远,也即转向远标号处标号处执行程序。执行程序。1-11RET;对于对于近调用近调用的返回的返回,只需,只需将当前栈顶将当前栈顶的的两个字节两个字节内容弹至内容弹至IP即可;即可;对于对于远调用远调用的返回,的返回,需需将当前栈顶的将当前栈顶的四个字节四个字节内容分别弹至内容分别弹至IP和和CS寄存器。寄存器。1-12例例1:在执行下列程序段之前:在执行下列程序段之前:(BX)=4200H,(SP)=103
7、4H D020:0083CALL BXD020:0085NOPD020:4200D020:42B1RET1-13 则在则在CALL指令和指令和RET指令执行前后,指令执行前后,指指 令令 指指 针针 IP,堆堆 栈栈 指指 针针 SP,堆堆 栈栈 的状况如图的状况如图1所示。所示。1-14IPSP1032H4200H1032H00H85HSPIP0083H1034H1034HIPIP0085H1034H1034H(a)CALL指令执行前指令执行前(b)CALL指令执行后指令执行后IPSP1032H42B1H1032H00H85H(c)RET指令执行前指令执行前(a)CALL指令执行前指令执行前
8、(d)RET指令执行后指令执行后图图1 示意图示意图1-15过程(子程序)的执行主程序过程过程入口过程出口主程序与过程的执行1-16子程序设计要做的几件事子程序设计要做的几件事 (1)将将需需要要重重复复或或经经常常使使用用的的程程序序段段编编制制成成独独立立程程序序,并并通通过过一一定定的的格格式式来来定定义义,该该工工作作称称为为过程(子程序)的定义过程(子程序)的定义。(2)在在调调用用程程序序的的若若干干个个适适当当位位置置使使用用CALL指令调用子程序。指令调用子程序。(3)在在子子程程序序中中设设置置RET指指令令,以以便便返返回回调调用程序。用程序。1-17 (4)在在子子程程序
9、序起起始始处处保保护护调调用用时时的的现现场场,在子程序返回前在子程序返回前恢复调用时的现场恢复调用时的现场。(所所谓谓现现场场,是是指指有有关关寄寄存存器器及及存存储储单单元元的的内内容容。保保护护和和恢恢复复现现场场的的目目的的在在于于,避避免免因因调调用用子子程程序序而而破破坏坏调调用用程程序序所所使使用用的的寄寄存存器器和和内内存存单元内容。)单元内容。)(5)实现调用程序与子程序之间的实现调用程序与子程序之间的参数传参数传递递。包括调用程序为子程序提供。包括调用程序为子程序提供入口参数入口参数,子,子程序向调用程序提供程序向调用程序提供出口参数出口参数。1-18 过程名过程名 PRO
10、C NEAR/FARPROC NEAR/FAR ;指示过程开始;指示过程开始 ;过程体 过程名过程名 ENDPENDP ;指示过程结束;指示过程结束过程的定义方法1-19子过程属性的选择方法:NEARNEAR过程过程和和调用该过程的程序调用该过程的程序同一代码段,同一代码段,NEARNEAR可省略。可省略。FARFAR过程和调用该过程的程序不在同一代码段。过程和调用该过程的程序不在同一代码段。1-20过程的结构过程的结构过程名过程名 PROCNEAR或或FAR保护现场保护现场根据入口参数进行处理根据入口参数进行处理产生出口参数产生出口参数恢复现场恢复现场RET过程名过程名ENDP1-21例例:
11、定义一个过程,使定义一个过程,使BXBX、CXCX和和DXDX相加,相加,而结果存入寄存器而结果存入寄存器AXAX。ADDEM PROC NEARADDEM PROC NEAR ;指示过程开始;指示过程开始 ADD BXADD BX,CXCX ADC BX ADC BX,DXDX MOV AX MOV AX,BXBX RET RET ;从过程返回;从过程返回 ADDEM ENDPADDEM ENDP ;指示过程结束;指示过程结束1-22课堂练习:课堂练习:求三个无符号字变量求三个无符号字变量V1、V2、V3的和,的和,并将结果放到紧接着这三个变量的内存区域。并将结果放到紧接着这三个变量的内存区
12、域。(要求利用上述过程完成)(要求利用上述过程完成)1-23子程序调用与返回实例子程序调用与返回实例例:将一个例:将一个8位二进制数以十六进制形式显示位二进制数以十六进制形式显示在屏幕上。在屏幕上。分析:可设计一个子程序,实现将分析:可设计一个子程序,实现将4位二进制位二进制数以一位十六进制数显示,调用两次子程序即数以一位十六进制数显示,调用两次子程序即可实现可实现8位二进制数的显示。位二进制数的显示。1-24DATAS SEGMENT hendb10011010BDATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART:MOV AX,DATA
13、S MOV DS,AXmoval,henmovcl,4roral,clandal,0fhcallbmoval,henandal,0fhcallb MOV AH,4CH INT 21Hb proc cmp al,9 jg next add al,30h jmp disp next:sub al,9 add al,40h disp:mov dl,al mov ah,2 int 21h ret b endp CODES ENDS END START现场的保护和恢复 子程序中需要使用的寄存器,有可能在主程序中子程序中需要使用的寄存器,有可能在主程序中正被用来保存某种中间结果,这些寄存器的值在从正被用来
14、保存某种中间结果,这些寄存器的值在从子程序返回主程序后还要继续使用子程序返回主程序后还要继续使用,这些这些寄存器的寄存器的值或所需的标志位的值等信息称之为现场值或所需的标志位的值等信息称之为现场。显然,。显然,子程序执行前需要保护现场,返回时要恢复现场。子程序执行前需要保护现场,返回时要恢复现场。保存现场与恢复现场的工作既可在调用程序中保存现场与恢复现场的工作既可在调用程序中完成,也可在子程序中完成,程序设计时根据情况完成,也可在子程序中完成,程序设计时根据情况安排。如果子程序已经设计好了,而其中未保护主安排。如果子程序已经设计好了,而其中未保护主程序现场,那么调用程序在使用子程序之前应保护程
15、序现场,那么调用程序在使用子程序之前应保护现场,从子程序返回后再恢复现场。现场,从子程序返回后再恢复现场。通常在主程序中保护现场,则一定在主程序中恢通常在主程序中保护现场,则一定在主程序中恢复;在子程序中保护现场,则一定在子程序中恢复。复;在子程序中保护现场,则一定在子程序中恢复。不保护现场的示例CODES SEGMENT ASSUME CS:CODESSTART:MOV CX,3LP1:CALL SUB1 LOOP L1 MOV AH,4CH INT 21H SUB1 PROC MOV CX,5 RET SUB1 ENDP CODES ENDS END START程程序序的的本本意意是是调调
16、用用3次次子子程程序序,cx作作为为计计数器数器保护现场CODES SEGMENT ASSUME CS:CODESSTART:MOV CX,3LP1:CALL SUB1 LOOP L1 MOV AH,4CH INT 21H SUB1 PROC PUSH CX;将cx的值入栈 MOV CX,5 POP CX;将cx的值出栈 RET SUB1 ENDP CODES ENDS END START保护现场和恢复现场的方法:保护现场和恢复现场的方法:(1)(1)利用压栈和出栈指令,将寄存器内容或状态标志位内利用压栈和出栈指令,将寄存器内容或状态标志位内容保存在堆栈中,恢复时再从堆栈中取出。容保存在堆栈中
17、,恢复时再从堆栈中取出。SQROOT1 PROCSQROOT1 PROCNEARNEAR PUSH AXPUSH AX;保存现场保存现场 PUSH BXPUSH BX PUSH CX PUSH CX .;子程序正常工作子程序正常工作 POP CX POP CX ;恢复现场恢复现场 POP BXPOP BX POP AX POP AX RET RET ;返回主调函数返回主调函数 SQROOT1 ENDP SQROOT1 ENDP (2)(2)利用内存单元。用传送指令将寄存器的内容保存到指利用内存单元。用传送指令将寄存器的内容保存到指定的内存单元,恢复时再用传送指令取出。定的内存单元,恢复时再用传
18、送指令取出。1-29主程序与过程之间的参数传递主程序与过程之间的参数传递当调用子过程时,要求调用程序把参数传递当调用子过程时,要求调用程序把参数传递给过程,以便于过程可以取得原始数据。在过程给过程,以便于过程可以取得原始数据。在过程执行完毕之后,又需要把结果传递给调用程序。执行完毕之后,又需要把结果传递给调用程序。四种方法传递参数:通过存储器传送,通过存储器传送,通过寄存器传送,通过寄存器传送,通过地址表传送,通过地址表传送,通过堆栈传送。通过堆栈传送。1.1.约定寄存器法约定寄存器法 约定约定寄存器法传送参数,即事先约定一些寄存器法传送参数,即事先约定一些存放参数的通用寄存器,调用程序转向子
19、程序存放参数的通用寄存器,调用程序转向子程序时,先把要传送的参数放到约定好的寄存器中,时,先把要传送的参数放到约定好的寄存器中,子程序工作时,从约定的寄存器中取参数,然子程序工作时,从约定的寄存器中取参数,然后把结果存入事先约定的寄存器中,调用程序后把结果存入事先约定的寄存器中,调用程序再从约定的寄存器中取再从约定的寄存器中取结果。结果。这种这种方法是程序设计中最常用、最简单、方法是程序设计中最常用、最简单、最方便的方法,在传送参数不多的情况下都采最方便的方法,在传送参数不多的情况下都采用此方法。用此方法。1-31例例:将将一一个个8位位二二进进制制数数以以十十六六进进制制形形式式在在屏幕中显
20、示屏幕中显示al=待显示二进制数待显示二进制数al的高低的高低4位互换位互换al=待显示二进制数待显示二进制数开始开始结束结束屏蔽屏蔽al高高4位位屏蔽屏蔽al高高4位位调用子程序调用子程序调用子程序调用子程序开始开始Yal9al=al+30h显示显示al中字符中字符al=al-9+40hN结束结束1-32DATAS SEGMENT hendb10011010BDATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART:MOV AX,DATAS MOV DS,AXmoval,henmovcl,4roral,clandal,0fhcallbmova
21、l,henandal,0fhcallb MOV AH,4CH INT 21Hb proc cmp al,9 jg next add al,30h jmp disp next:sub al,9 add al,40h disp:mov dl,al mov ah,2 int 21h ret b endp CODES ENDS END START1.1.约定寄存器法约定寄存器法 开平方子程序,约定将被开平方数放在开平方子程序,约定将被开平方数放在DXDX中,平方根也放中,平方根也放在在DXDX中,其结果求得平方根的整数部分。中,其结果求得平方根的整数部分。1:;*EXAM8.1.1S*1:;*EXAM
22、8.1.1S*2:SQROOT12:SQROOT1 PROCPROC NEARNEAR 3:3:XORXOR AX,AXAX,AX;i0;i0 4:4:ANDAND DX,DXDX,DX;测试被开方数测试被开方数 5:5:JZJZ SQRT2SQRT2;被开方数为被开方数为0 0 6:6:MOVMOV BX,AXBX,AX;形成奇数形成奇数 7:SQRT1:SHL BX,17:SQRT1:SHL BX,1 8:8:INC BXINC BX 9:9:SUB DX,BXSUB DX,BX;被开方数减去奇数被开方数减去奇数 10:10:JCJC SQRT2SQRT2;不够减不够减 11:11:INC
23、 AXINC AX ;够减够减,i,i增增1 1 12:12:JMP SQRT1JMP SQRT1;继续继续 13:SQRT2:MOV DX,AX13:SQRT2:MOV DX,AX;DX;DX平方根平方根 14:14:RETRET;返回返回 15:SQROOT115:SQROOT1 ENDPENDP1.约定寄存器法主调用程序:主调用程序:1:;*EXAM 8.1.1M*1:;*EXAM 8.1.1M*2:2:SSEG SEGMENT STACKSSEG SEGMENT STACK 3:STKTOP DB 20 DUP(0)3:STKTOP DB 20 DUP(0)4:4:SSEG ENDSS
24、SEG ENDS 5:5:DSEG SEGMENTDSEG SEGMENT 6:PX DW 12345 6:PX DW 12345 7:PY DW 2469 7:PY DW 2469 8:RLT DW 0 8:RLT DW 0 9:9:DSEG ENDSDSEG ENDS 10:CSEG SEGMENT 10:CSEG SEGMENT 11:11:ASSUME CS:CSEG,DS:DSEGASSUME CS:CSEG,DS:DSEG 12:ASSUME SS:SSEG 12:ASSUME SS:SSEG 13:MAIN1:MOV AX,DSEG 13:MAIN1:MOV AX,DSEG 14
25、:MOV DS,AX 14:MOV DS,AX 15:MOV AX,SSEG 15:MOV AX,SSEG 16:MOV SS,AX 16:MOV SS,AX 17:MOV 17:MOV SP,SIZE STKTOPSP,SIZE STKTOP18:18:MOVMOV DX,PXDX,PX;取取X X19:19:ADDADD DX,DXDX,DX;计算计算2X2X20:20:CALLCALL SQROOT1SQROOT1;调用开平方子程序调用开平方子程序21:21:PUSHPUSH DXDX ;暂存结果暂存结果2X2X22:22:MOVMOV DX,PYDX,PY;取取Y Y23:23:MOV
26、MOV AX,DXAX,DX;计算计算3Y3Y24:24:ADDADD DX,DXDX,DX 25:25:ADDADD DX,AXDX,AX 26:26:CALLCALL SQROOT1SQROOT1;调用开平方子程序调用开平方子程序27:27:POPPOP AXAX ;取出取出2X2X28:28:ADDADD AX,DXAX,DX;计算计算2 2X+3YX+3Y29:29:PUSHPUSH AXAX ;暂存结果暂存结果 30:30:MOVMOV DX,150DX,150 31:31:CALLCALL SQROOT1SQROOT1 32:32:POPPOP AXAX ;取出中间结果取出中间结果
27、 33:33:ADDADD AX,DXAX,DX;计算最终结果计算最终结果 34:34:MOVMOV RLT,AXRLT,AX;保存结果保存结果 35:35:MOVMOV AH,4CHAH,4CH 36:36:INTINT 21H21H 37:37:CSEGCSEG ENDSENDS 38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEAR XORXORAX,AXAX,AX ANDANDDX,DXDX,DX JZJZSQRT2SQRT2 SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1 INCINCBXBX S
28、UBSUBDX,BXDX,BXJCJCSQRT2SQRT2 INCINCAXAXJMPJMPSQRT1SQRT1 SQRT2:SQRT2:MOVMOVDX,AXDX,AX RETRET SQROOT1SQROOT1ENDPENDP17:MOV SP,SIZE STKTOP17:MOV SP,SIZE STKTOP18:18:MOV DX,PXMOV DX,PX;取取X X19:19:ADD DX,DXADD DX,DX;计算计算2X2X20:20:CALL SQROOT1CALL SQROOT1;调用开平方子程序调用开平方子程序21:21:PUSH DXPUSH DX ;暂存结果暂存结果2X2
29、X22:22:MOV DX,PYMOV DX,PY;取取Y Y23:23:MOV AX,DXMOV AX,DX;计算计算3Y3Y24:24:ADD DX,DXADD DX,DX 25:25:ADD DX,AXADD DX,AX 26:26:CALL SQROOT1CALL SQROOT1;调用开平方子程序调用开平方子程序27:27:POP AXPOP AX ;取出取出2X2X28:28:ADD AX,DXADD AX,DX;计算计算22X+3YX+3Y29:29:PUSH AXPUSH AX ;暂存结果暂存结果 30:30:MOV DX,150MOV DX,150 31:31:CALL SQR
30、OOT1CALL SQROOT1 32:32:POP AXPOP AX ;取出中间结果取出中间结果 33:33:ADD AX,DXADD AX,DX;计算最终结果计算最终结果 34:34:MOV RLT,AXMOV RLT,AX;保存结果保存结果 35:35:MOV AH,4CHMOV AH,4CH 36:36:INT 21HINT 21H 37:CSEG ENDS37:CSEG ENDS 38:38:END MAIN1END MAIN1SQROOT1SQROOT1PROCPROCNEARNEAR XORXORAX,AXAX,AX ANDANDDX,DXDX,DX JZJZSQRT2SQRT2
31、 SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1 INCINCBXBX SUBSUBDX,BXDX,BXJCJCSQRT2SQRT2 INCINCAXAXJMPJMPSQRT1SQRT1 SQRT2:SQRT2:MOVMOVDX,AXDX,AX RETRET SQROOT1SQROOT1ENDPENDP初始态(执行指令后)17:MOV SP,SIZE STKTOP17:MOV SP,SIZE STKTOP18:18:MOV DX,PXMOV DX,PX;取取X X19:19:ADD DX,DXADD DX,DX;计算计算2X2X20:20:CALL SQR
32、OOT1CALL SQROOT1;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY;取取Y Y23:23:MOVMOVAX,DXAX,DX;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX 25:25:ADDADDDX,AXDX,AX 26:26:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX;取出取出2X2X28:28:ADDADDAX,DXAX,DX;计算计算22X+3YX+3Y29:29:PUSHPUSHAXAX;暂存结果暂
33、存结果 30:30:MOVMOVDX,150DX,150 31:31:CALLCALLSQROOT1SQROOT1 32:32:POPPOPAXAX;取出中间结果取出中间结果 33:33:ADDADDAX,DXAX,DX;计算最终结果计算最终结果 34:34:MOVMOVRLT,AXRLT,AX;保存结果保存结果 35:35:MOVMOVAH,4CHAH,4CH 36:36:INTINT21H21H 37:CSEG37:CSEG ENDSENDS 38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEAR XORXORAX,AXAX,AX ANDA
34、NDDX,DXDX,DX JZJZSQRT2SQRT2 SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1 INCINCBXBX SUBSUBDX,BXDX,BXJCJCSQRT2SQRT2 INCINCAXAXJMPJMPSQRT1SQRT1 SQRT2:SQRT2:MOVMOVDX,AXDX,AX RETRET SQROOT1SQROOT1ENDPENDP执行指令后17:MOV SP,SIZE STKTOP17:MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX;取取X X19:19:ADDADDDX,DXDX,DX;计算计算
35、2X2X20:20:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY;取取Y Y23:23:MOVMOVAX,DXAX,DX;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX 25:25:ADDADDDX,AXDX,AX 26:26:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX;取出取出2X2X28:28:ADDADDAX,DXAX,DX;计算计算22X+3YX+3Y29:29:PU
36、SHPUSHAXAX;暂存结果暂存结果 30:30:MOVMOVDX,150DX,150 31:31:CALLCALLSQROOT1SQROOT1 32:32:POPPOPAXAX;取出中间结果取出中间结果 33:33:ADDADDAX,DXAX,DX;计算最终结果计算最终结果 34:34:MOVMOVRLT,AXRLT,AX;保存结果保存结果 35:35:MOVMOVAH,4CHAH,4CH 36:36:INTINT21H21H 37:CSEG37:CSEG ENDSENDS 38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEAR XORXO
37、RAX,AXAX,AX ANDANDDX,DXDX,DX JZJZSQRT2SQRT2 SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1 INCINCBXBX SUBSUBDX,BXDX,BXJCJCSQRT2SQRT2 INCINCAXAXJMPJMPSQRT1SQRT1 SQRT2:SQRT2:MOVMOVDX,AXDX,AX RETRET SQROOT1SQROOT1ENDPENDP执行指令RET后17:MOV SP,SIZE STKTOP17:MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX;取取X X19:19:AD
38、DADDDX,DXDX,DX;计算计算2X2X20:20:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY;取取Y Y23:23:MOVMOVAX,DXAX,DX;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX 25:25:ADDADDDX,AXDX,AX 26:26:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX;取出取出2X2X28:28:ADDADDAX,DXAX,DX;计算计
39、算22X+3YX+3Y29:29:PUSHPUSHAXAX;暂存结果暂存结果 30:30:MOVMOVDX,150DX,150 31:31:CALLCALLSQROOT1SQROOT1 32:32:POPPOPAXAX;取出中间结果取出中间结果 33:33:ADDADDAX,DXAX,DX;计算最终结果计算最终结果 34:34:MOVMOVRLT,AXRLT,AX;保存结果保存结果 35:35:MOVMOVAH,4CHAH,4CH 36:36:INTINT21H21H 37:CSEG37:CSEG ENDSENDS 38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PRO
40、CPROCNEARNEAR XORXORAX,AXAX,AX ANDANDDX,DXDX,DX JZJZSQRT2SQRT2 SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1 INCINCBXBX SUBSUBDX,BXDX,BXJCJCSQRT2SQRT2 INCINCAXAXJMPJMPSQRT1SQRT1 SQRT2:SQRT2:MOVMOVDX,AXDX,AX RETRET SQROOT1SQROOT1ENDPENDP执行指令后17:MOV SP,SIZE STKTOP17:MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,
41、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,DX 25:25:ADDADDDX,AXDX,AX 26:26:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序 27:27:POPPOPAXAX;取出取出2X2X28:28:AD
42、DADDAX,DXAX,DX;计算计算2 2X+3YX+3Y29:29:PUSHPUSHAXAX;暂存结果暂存结果 30:30:MOVMOVDX,150DX,150 31:31:CALLCALLSQROOT1SQROOT1 32:32:POPPOPAXAX;取出中间结果取出中间结果 33:33:ADDADDAX,DXAX,DX;计算最终结果计算最终结果 34:34:MOVMOVRLT,AXRLT,AX;保存结果保存结果 35:35:MOVMOVAH,4CHAH,4CH 36:36:INTINT21H21H 37:CSEG37:CSEG ENDSENDS 38:38:ENDENDMAIN1MAI
43、N1SQROOT1SQROOT1PROCPROCNEARNEAR XORXORAX,AXAX,AX ANDANDDX,DXDX,DX JZJZSQRT2SQRT2 SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1 INCINCBXBX SUBSUBDX,BXDX,BXJCJCSQRT2SQRT2 INCINCAXAXJMPJMPSQRT1SQRT1 SQRT2:SQRT2:MOVMOVDX,AXDX,AX RETRET SQROOT1SQROOT1ENDPENDP执行指令后17:MOV SP,SIZE STKTOP17:MOV SP,SIZE STKTOP1
44、8: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,DX 25:25:ADDADDDX,AXDX,AX 26:26:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序 27:27:POPPOPAX
45、AX;取出取出2X2X28:28:ADDADDAX,DXAX,DX;计算计算2 2X+3YX+3Y29:29:PUSHPUSHAXAX;暂存结果暂存结果 30:30:MOVMOVDX,150DX,150 31:31:CALLCALLSQROOT1SQROOT1 32:32:POPPOPAXAX;取出中间结果取出中间结果 33:33:ADDADDAX,DXAX,DX;计算最终结果计算最终结果 34:34:MOVMOVRLT,AXRLT,AX;保存结果保存结果 35:35:MOVMOVAH,4CHAH,4CH 36:36:INTINT21H21H 37:CSEG37:CSEG ENDSENDS 3
46、8:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEAR XORXORAX,AXAX,AX ANDANDDX,DXDX,DX JZJZSQRT2SQRT2 SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1 INCINCBXBX SUBSUBDX,BXDX,BXJCJCSQRT2SQRT2 INCINCAXAXJMPJMPSQRT1SQRT1 SQRT2:SQRT2:MOVMOVDX,AXDX,AX RETRET SQROOT1SQROOT1ENDPENDP执行指令RET后17:MOV SP,SIZE STKTOP
47、17: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,DX 25:25:ADDADDDX,AXDX,AX 26:26:CALLCALLSQROOT1SQROOT1;调用开平方子程序调
48、用开平方子程序 27:27:POPPOPAXAX;取出取出2X2X28:28:ADDADDAX,DXAX,DX;计算计算2 2X+3YX+3Y29:29:PUSHPUSHAXAX;暂存结果暂存结果 30:30:MOVMOVDX,150DX,150 31:31:CALLCALLSQROOT1SQROOT1 32:32:POPPOPAXAX;取出中间结果取出中间结果 33:33:ADDADDAX,DXAX,DX;计算最终结果计算最终结果 34:34:MOVMOVRLT,AXRLT,AX;保存结果保存结果 35:35:MOVMOVAH,4CHAH,4CH 36:36:INTINT21H21H 37:
49、CSEG37:CSEG ENDSENDS 38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEAR XORXORAX,AXAX,AX ANDANDDX,DXDX,DX JZJZSQRT2SQRT2 SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1 INCINCBXBX SUBSUBDX,BXDX,BXJCJCSQRT2SQRT2 INCINCAXAXJMPJMPSQRT1SQRT1 SQRT2:SQRT2:MOVMOVDX,AXDX,AX RETRET SQROOT1SQROOT1ENDPENDP执行指令后2.
50、约定存储单元法 约定存储单元法传送参数,与约定寄存器法类似。下面约定存储单元法传送参数,与约定寄存器法类似。下面设计的开平方子程序与调用程序,约定被开方数放在设计的开平方子程序与调用程序,约定被开方数放在ARGXARGX单单元,计算结果放入元,计算结果放入ROOTROOT单元。单元。1:;*EXAM8.1.2S*1:;*EXAM8.1.2S*2:SQROOT22:SQROOT2PROCPROCNEARNEAR 3:3:XORXORAX,AXAX,AX;i0i0 4:4:ANDANDDX,DXDX,DX;测试被开方数测试被开方数 5:5:JZJZSQRT2SQRT2;被开方数为被开方数为0 0