《微机原理与接口技术(4-3).ppt》由会员分享,可在线阅读,更多相关《微机原理与接口技术(4-3).ppt(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、朱亚萍朱亚萍杭州电子科技大学自动化学院杭州电子科技大学自动化学院微机原理与接口技术第四章 汇编语言程序设计1 14-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构1 1 1 1子程序使用子程序使用子程序使用子程序使用子子子子程程程程序序序序:将将多多次次使使用用的的程程序序段段写写成成一一个个相相对对独独立立的的程程序序段段,称为子程序或过程。称为子程序或过程。子程序结构的定义:子程序结构的定义:子程序结构的定义:子程序结构的定义:使用过程定义语句使用过程定义语句PROCENDPPROCENDP。属性:属性:属性:属性:l l调用程序和过程在同
2、一代码段中,则用调用程序和过程在同一代码段中,则用NEARNEAR属性属性;l l调用程序和过程不在同一代码段中,使用调用程序和过程不在同一代码段中,使用FARFAR属性属性。l l主过程主过程定义为定义为FARFAR属性,看作属性,看作DOSDOS调用的一个子过程。调用的一个子过程。四、子程序结构四、子程序结构2 24-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序说明:子程序说明:子程序说明:子程序说明:功能描述:名称,功能及性能功能描述:名称,功能及性能寄存器和存储单元寄存器和存储单元入口参数,出口参数入口参数,出口参数调用其它子程
3、序的名称调用其它子程序的名称3 34-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构例例4-11 4-11 有一个子程序说明如下:有一个子程序说明如下:;名称:;名称:BCD2BINBCD2BIN;功能:将一个字节的功能:将一个字节的BCDBCD码转换成二进制数码转换成二进制数;所用寄存器:;所用寄存器:CXCX;入口参数:入口参数:ALAL存放两位存放两位BCDBCD码码;出口参数:;出口参数:ALAL存放二进制数存放二进制数;调其它子程序:无;调其它子程序:无 若若AL=XAL=X1 1X X0 0H H,则,则转换方法为转换方法为转换方法
4、为转换方法为:X X1 11010X X0 0子程序形式如下:子程序形式如下:4 44-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构BCD2BINBCD2BINPROCPROC NEAR NEAR(或(或FARFAR)PUSH CXPUSH CX MOV CHMOV CH,ALAL AND AND CHCH,0FH 0FH ;存存个位个位个位个位 MOV CLMOV CL,4 4 SHR ALSHR AL,CLCL;高;高4 4位右移位右移4 4位后乘位后乘1010,即,即十位乘十位乘1010 MOV CLMOV CL,1010 MUL MU
5、L CLCL ADD AL ADD AL,CH CH ;高高4 4位乘位乘1010后加低后加低4 4位位 POP CXPOP CX RETRETBCD2BIN BCD2BIN ENDPENDP5 54-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构说明:说明:说明:说明:保护调用程序的断点保护调用程序的断点保护调用程序的断点保护调用程序的断点由由CALLCALL指指令令本本身身完完成成。要要注注意意堆堆栈栈的的使使用用,防防止止弹弹出出地地址值错误。址值错误。保护某些寄存器内容保护某些寄存器内容保护某些寄存器内容保护某些寄存器内容l l在在子子
6、程程序序开开头头,用用一一组组PUSHPUSH指指令令,保保护护的的寄寄存存器器原原来来的内容;的内容;l l在在子子程程序序结结尾尾,用用一一组组POPPOP指指令令,将将寄寄存存器器原原来来的的内内容容恢复。恢复。l l注意注意注意注意PUSHPUSH和和和和POPPOP指令组的使用次序!指令组的使用次序!指令组的使用次序!指令组的使用次序!6 64-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构主程序与子程序相互之间参数的传递主程序与子程序相互之间参数的传递主程序与子程序相互之间参数的传递主程序与子程序相互之间参数的传递用寄存器传递参数用
7、寄存器传递参数:参数较少,速度较快。:参数较少,速度较快。用用存存储储器器传传递递参参数数:参参数数较较多多,需需事事先先在在存存储储器器中中建建立立一个参数表。一个参数表。用用堆堆栈栈传传递递参参数数:参参数数较较多多,多多用用在在子子程程序序嵌嵌套套与与递递归归调用中。调用中。7 7例例例例4-144-14 数数据据段段定定义义两两个个数数组组,编编程程序序实实现现数数组组段段分分别别求求和和(不不不不计溢出计溢出计溢出计溢出)。)。本例本例通过存储器来传递参数。通过存储器来传递参数。相应程序如下:相应程序如下:DATADATASEGMENTSEGMENTARY1ARY1DW DW 123
8、4H1234H,2233H2233H,100 100 DUP(?)DUP(?);定义数组;定义数组1 1 SUM1 DW?SUM1 DW?ARY2ARY2DW DW 3456H3456H,2783H2783H,100 100 DUP(?)DUP(?);定义数组;定义数组2 2 SUM2SUM2DW?DW?DATA DATA ENDSENDS;STACKSTACK SEGMENT STACK SEGMENT STACKSASADBDB 100 DUP(?)100 DUP(?)TOP TOP EQU LENGTH SAEQU LENGTH SASTACK ENDSSTACK ENDS4-4 4-4
9、 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构 8 8CODECODE SEGMENTSEGMENT ASSUME CS:CODEASSUME CS:CODE,DS:DATADS:DATA,SS:STACKSS:STACKMAINMAINPROC FARPROC FARSTARTSTART:MOVMOV AXAX,DATADATA MOV MOV DSDS,AXAX MOV MOV AXAX,STACKSTACK MOV MOV SSSS,AXAX MOV MOV SPSP,TOPTOP LEA LEA SISI,ARY1 ARY1
10、;数组;数组1 1首地址,入口参数首地址,入口参数 MOV MOV CXCX,SUM1SUM1ARY1ARY1 ;数组数组1 1字节数字节数SHRSHRCXCX,1 1 ;除以;除以2 2,数组,数组1 1的字数的字数 CALL CALL SUM SUM ;调用求和子程序;调用求和子程序 LEA LEA SISI,ARY2 ARY2 ;数组;数组2 2首地址,入口参数首地址,入口参数 MOV MOV CXCX,SUM2SUM2ARY2 ARY2 ;数组;数组2 2字节参数字节参数SHRSHRCXCX,1 1 ;除除以以2 2,数数组组2 2的的字字数数 4-4 4-4 4-4 4-4 程序设计
11、方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构 9 94-5 4-5 4-5 4-5 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构CALL CALL SUM SUM ;调用求和子程序;调用求和子程序 MOV MOV AHAH,4CH4CH;返回;返回DOSDOS INT INT 21H21H RETRETMAINMAINENDPENDPSUMSUMPROCPROC NEAR NEAR ;子程序;子程序 XOR XOR AXAX,AX AX ;AXAX清清0 0L1L1:ADD ADD AXAX,WORD PTRSI WORD PTRSI
12、 ;加数组元素;加数组元素 INC INC SISI INC INC SISI LOOP L1LOOP L1 MOV MOV WORD PTRSIWORD PTRSI,AX AX ;数组和送入;数组和送入SUMSUM RETRETSUMSUMENDP ENDP ;子程序返回;子程序返回CODECODE EDNSEDNS END END STARTSTART1010 例例例例4-154-15 通通过过堆堆栈栈传传递递参参数数,实实现现十十进进制制数数数数组组求求和和,要要求求主主程程序序和和过过程程不不在在同同一一个个代代码码段段中中,要要进进行行段段间间调调用用。相相应应程程序如下:序如下:M
13、DATA MDATA SEGMENTSEGMENT ARY1 ARY1 DB DB 20 DUP(?)20 DUP(?);定义数组定义数组1 1 SUM1 DW?SUM1 DW?N1N1EQUEQUSUM1SUM1ARY1ARY1 ARY2ARY2DB DB 20 DUP(?)20 DUP(?);定义数组定义数组2 2 SUM2 DW?SUM2 DW?N2N2EQUEQUSUM2SUM2ARY2ARY2MDATA MDATA ENDSENDSMSTACKMSTACKSEGMENT STACKSEGMENT STACK SB SB DW 100 DUP(?)DW 100 DUP(?)TOP TO
14、P LABEL WORDLABEL WORDMSTACK MSTACK ENDSENDS4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构 1111MCODE SEGMENT MCODE SEGMENT ;主程序段;主程序段 ASSUME CS:MCODEASSUME CS:MCODE,DS:MDATADS:MDATA,SS:MSTACKSS:MSTACKMAIN PROC MAIN PROC FARFARSTART:MOVSTART:MOVAXAX,MSTACKMSTACK ;初始化;初始化SSSS,SPSP MOV MO
15、V SSSS,AXAX MOV MOV SPSP,OFFSET TOP OFFSET TOP PUSHPUSHDSDS ;程序段前缀;程序段前缀 MOV MOV AXAX,0 0 PUSH AXPUSH AX MOV MOV AXAX,MDATAMDATA ;初始化;初始化DSDS MOV MOV DSDS,AX AX 4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构1212MOV MOV AXAX,OFFSET ARY1 OFFSET ARY1 ;PADDPADD过程入口参数进栈过程入口参数进栈 PUSH AXPUSH
16、AX MOV MOV AXAX,N1 N1 ;SIZE ARY1SIZE ARY1 PUSH AXPUSH AX CALLCALLFAR PTR PADDFAR PTR PADD MOV MOV AXAX,OFFSET ARY2OFFSET ARY2 PUSH PUSH AXAX MOVMOVAXAX,N2 N2 ;SIZE ARY2SIZE ARY2 PUSHPUSHAXAX CALLCALLFAR PTR PADDFAR PTR PADD RETRETMAINMAINENDPENDPMCODE ENDSMCODE ENDS4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法
17、程序设计方法子程序结构子程序结构子程序结构子程序结构1313PCODEPCODESEGMENT SEGMENT ;过程段过程段 ASSUME CSASSUME CS:PCODEPCODE,DSDS:MDATAMDATA,SSSS:MSTACKMSTACKPADD PADD PROCPROC FARFAR PUSH PUSH BX BX ;寄存器保护;寄存器保护 PUSHPUSHCXCX PUSHPUSHBPBP MOVMOVBPBP,SPSP PUSHFPUSHF MOVMOVCXCX,BP+10 BP+10 ;数组长度;数组长度CXCX MOVMOVBXBX,BP+12 BP+12 ;数组;
18、数组ARYARY起始地址起始地址BXBX MOVMOVAXAX,0 0 NEXT NEXT:ADD ADD ALAL,BX BX ;数组相加数组相加 DAA DAA 4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构 1414 MOV MOV DLDL,ALAL MOV MOV ALAL,0 0 ;调整进位调整进位 ADCADCALAL,AHAH DAADAAMOVMOVAHAH,ALALMOVMOVALAL,DLDL INCINCBXBX LOOP NEXTLOOP NEXT MOV MOV BXBX,AX AX ;送数组
19、和送数组和SUMSUM POPFPOPF POP POP BPBP POP POP CXCX POP POP BXBX RET RET 4 4 ;返回作废参数;返回作废参数PADD PADD ENDPENDPPCODE PCODE ENDSENDS END STARTEND START4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构 15154-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构该例该例用堆栈传递参数用堆栈传递参数,堆栈中数据变化如图,堆栈中数据变化如图4-11
20、4-11所示。所示。总结:总结:总结:总结:调调用用前前通通过过堆堆栈栈传传递递两两个个参参数数:数数组组的的偏偏移移地地址址值值,数数组长度。组长度。进入过程时重新定义进入过程时重新定义CSCS段:指向当前代码段段:指向当前代码段PCODEPCODE。过过程程返返回回时时:用用返返回回指指令令RET RET 4 4,将将通通过过堆堆栈栈传传递递的的4 4个个参数作废。参数作废。16164-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构17174-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构堆
21、栈的变化:堆栈的变化:堆栈的变化:堆栈的变化:初始化后,初始化后,SPSP指向堆栈底,堆栈为空;指向堆栈底,堆栈为空;主主程程序序调调用用过过程程前前,二二个个参参数数(数数组组偏偏移移地地址址及及数数组组长长度度)已入栈;已入栈;执行执行CALLCALL指令时,返回地址自动入栈;指令时,返回地址自动入栈;过过程程中中:BXBX,CXCX,BPBP,标标志志寄寄存存器器入入栈栈;继继续续执执行行过过程程段段PCODEPCODE程程序序,利利用用BPBP,在在堆堆栈栈中中位位置置BPBP1212处处获获取取数数组偏移地址,在堆栈中位置组偏移地址,在堆栈中位置BPBP1010处获取数组长度。处获取
22、数组长度。过过程程运运行行到到RET RET 4 4之之前前,由由POPPOP指指令令将将PSWPSW,BPBP,CXCX及及BXBX相继弹出。相继弹出。堆堆栈栈中中还还有有4 4个个字字节节的的参参数数SIZE1SIZE1和和ARY1ARY1会会影影响响下下次次过过程程调用参数的正确传递,用调用参数的正确传递,用RET 4RET 4将此将此4 4个字节的参数弹出作废。个字节的参数弹出作废。18184-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构2 2子程序嵌套与递归调用子程序嵌套与递归调用子程序嵌套与递归调用子程序嵌套与递归调用子子子子程程
23、程程序序序序嵌嵌嵌嵌套套套套:子子程程序序本本身身又又调调用用其其它它子子程程序序。只只要要堆堆栈栈空空间间足够嵌套的层数不限。足够嵌套的层数不限。图图4-124-12给出了子程序嵌套示意图。给出了子程序嵌套示意图。递归调用递归调用递归调用递归调用:子程序调用子程序本身。子程序调用子程序本身。19194-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构例例4-16 4-16 要求计算要求计算N N!(N(N0)0)解:递归调用的应用:解:递归调用的应用:N N!N(NN(N1)(N1)(N2)12)1 N N!1 1,N N0 0 N N!N(N
24、N(N1)1)!,!,N N0 0 求求N N!即即为为计计算算N(NN(N1)1)!,而而(N N1 1)!要要调调用用N N!子子程程序序,只只要要将将调调用用参参数数修修改改即即可可。可可以以通通过过堆堆栈栈将将调调用用参参数数、寄寄存存器器内内容容等等保保护护起起来来,每每调调用用一一次次将将(N N1 1)有有关关信信息息入入栈栈,直直到到N N0 0为为止止,然然后后开开始始返返回回,返返回回时时将将N N乘乘以以(N N1 1)!,直到)!,直到N N为设置值为止。为设置值为止。20204-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程
25、序结构具体程序如下:具体程序如下:ADATAADATASEGMENTSEGMENT P1 P1DB DB Input Input the the number:number:(06)(06),$,$;提提示示输输入入信信息息 P2P2DB The result is:DB The result is:,$CRCRDB 0DHDB 0DH,0AH0AH,$;回回车车换换行行ADATAADATAENDSENDSASTACKASTACKSEGMENT STACK STACKSEGMENT STACK STACK SA DW 100 DUP(?)SA DW 100 DUP(?)TOP LABEL WO
26、RD TOP LABEL WORDASTACK ASTACK ENDSENDS2121ACODE ACODE SEGMENTSEGMENT ASSUME CS:ACODEASSUME CS:ACODE,DS:ADATADS:ADATA,SS:ASTACKSS:ASTACKMAINMAINPROC FARPROC FARSTARTSTART:MOV MOV AXAX,ASTACK ASTACK ;初初始始化化 SSSS,SPSP MOV SSMOV SS,AXAX MOV SPMOV SP,OFFSET TOPOFFSET TOP PUSH DSPUSH DS;程序段前缀;程序段前缀 MOV A
27、XMOV AX,0 0 PUSH AXPUSH AX MOV AXMOV AX,ADATA ADATA ;初始化初始化 DSDS MOV DSMOV DS,AXAX4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构 2222MOVMOV AHAH,09H09HLEALEADXDX,P1P1INTINT21H 21H ;显示;显示 Input the number:(06)Input the number:(06)MOVMOV AHAH,01H01HINTINT21H21H;输入数字到;输入数字到ALAL并显示并显示ANDAN
28、DALAL,0FH0FHMOVMOV BLBL,ALAL LEALEADXDX,CRCRMOVMOV AHAH,09H09HINTINT21H21H;回车换行;回车换行 MOV DXMOV DX,0 0;DXDX为为N N!的结果!的结果MOVMOV AHAH,0 0;插入此条指令!;插入此条指令!;插入此条指令!;插入此条指令!MOV ALMOV AL,BL BL 4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构 2323CALL FACTCALL FACT;输入:;输入:AL=NAL=N;输出:;输出:DX=N!DX=
29、N!MOV AXMOV AX,DXDXCALLCALL B2TOBCDB2TOBCD;输入:;输入:AX=16AX=16位二进制;位二进制;输出:;输出:AX=4AX=4位压缩型位压缩型BCDBCD码码MOVMOV BXBX,AXAX MOVMOV AHAH,09H 09H ;显示;显示 The result is:The result is:LEALEADXDX,P2P2INTINT21H21HCALLCALL DISPDISP;输入:;输入:BX=4BX=4位压缩型位压缩型BCDBCD码;码;输出:在屏幕上显示;输出:在屏幕上显示RETRETMAIN MAIN ENDPENDP4-4 4-
30、4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构 2424FACTFACTPROC PROC ;N!N!子程序子程序 CMPCMPALAL,0 0 JNZ CHNJNZ CHN MOV DLMOV DL,1 1 ;N=0,N!=1N=0,N!=1 RETRET;第一次执行此指令返回到;第一次执行此指令返回到POPPOP指令指令CHNCHN:PUSH AX PUSH AX ;N N入栈入栈 DEC AL DEC AL ;N N1 1 CALLCALL FACT FACT ;递归调用递归调用FACTFACT子程序子程序 POP AX PO
31、P AX ;N N弹出弹出 MUL DL MUL DL ;N N逐层返回相乘逐层返回相乘 MOV DXMOV DX,AX AX ;送结果到内存;送结果到内存 RETRET;后;后N N1 1次执行次指令返回次执行次指令返回FACT FACT ENDPENDP4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构 2525B2TOBCDB2TOBCDPROCPROCFARFAR CMPCMPAXAX,9999 9999 ;AX9999AX9999,则,则CFCF置置1 1 JBE JBE TRANTRAN STC STC JMP
32、JMP EXITEXITTRANTRAN:PUSH CXPUSH CX PUSH DXPUSH DX SUB SUB DXDX,DX DX ;DXDX清清0 0 MOV MOV CXCX,1000 1000 ;计算千位数;计算千位数 DIV DIV CXCX;(DX AX)(DX AX)/CX/CX,AXAX商,商,DX DX 余数余数 XCHG AXXCHG AX,DX DX ;商在;商在DXDX中,余数在中,余数在AXAX中中 MOV MOV CLCL,4 4 SHL DXSHL DX,CL CL ;DXDX左移左移4 4位,位,DX=00X0HDX=00X0H4-4 4-4 4-4 4-
33、4 程序设计方法程序设计方法程序设计方法程序设计方法综合举例综合举例综合举例综合举例2626 MOV CLMOV CL,100 100 ;计算百位数;计算百位数 DIV DIV CLCLADD ADD DLDL,AL AL ;百位数加到;百位数加到DLDL中,中,DX=00XXHDX=00XXH MOV CLMOV CL,4 4 SHL DXSHL DX,CLCL;DXDX左移左移4 4位,位,DX=0XX0HDX=0XX0H XCHGXCHG AL AL,AH AH ;余数保留在;余数保留在ALAL中中 SUBSUBAHAH,AHAH MOV CLMOV CL,10 10 ;计算十位数计算十
34、位数 DIV CLDIV CL ADD ADD DLDL,AL AL ;十位数加到;十位数加到DLDL中,中,DX=0XXXHDX=0XXXH MOV CLMOV CL,4 4 SHL SHL DXDX,CL CL ;DXDX左移左移4 4位,位,DX=XXX0HDX=XXX0H4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法综合举例综合举例综合举例综合举例2727 ADD ADD DLDL,AH AH ;加个位数,;加个位数,DX=XXXXHDX=XXXXH MOV AXMOV AX,DX DX ;结果送到;结果送到AXAX中中 POP POP DXDX PO
35、P POP CXCXEXITEXIT:RETRETB2TOBCD B2TOBCD ENDPENDP4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法综合举例综合举例综合举例综合举例2828DISPDISPPROCPROC ;显示子程序;显示子程序 PUSHPUSH AX AXPUSHPUSH CX CX MOV CHMOV CH,4 4MOV CLMOV CL,4 4 LZ LZ:ROL BXROL BX,CL CL ;循环左移;循环左移4 4次次 MOV DLMOV DL,BLBL AND DLAND DL,0FH0FH CMP DLCMP DL,0 0 JNE
36、 LNZJNE LNZ;最高位是最高位是0 0,则不输出,转到下一位,则不输出,转到下一位 DEC CHDEC CHJNZJNZLZLZ4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构 2929LLLL:ROL BXROL BX,CLCL MOVMOV DLDL,BLBL ANDANDDLDL,0FH0FHLNZ:LNZ:ADDADDDLDL,30H30HMOV AHMOV AH,2 2;2 2号功能调用,显示字符号功能调用,显示字符 INT INT 21H21H DEC CHDEC CH JNZ LLJNZ LLPOPP
37、OPCXCXPOPPOPAXAX RETRETDISP DISP ENDPENDPACODE ACODE ENDSENDS END END START START 4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构 3030主程序中CALL下条指令的IP0004HFACT子程序中POP AX的IP0003HFACT子程序中POP AX的IP0002HFACT子程序中POP AX的IP0001HFACT子程序中POP AX的IP第一次执行第一次执行RETRET指令指令(前一条前一条RETRET指令指令)返返回的断点回的断点第第
38、2 2N N1 1次执行次执行RETRET指令(后一条指令(后一条RETRET指令)返回的指令)返回的断点断点堆栈操作情况如下:堆栈操作情况如下:说明说明说明说明:FACTFACT子程序共被调用子程序共被调用N N1 1次,其中第一次由主程次,其中第一次由主程序调用,后序调用,后N N次为自调用(递归调用)。次为自调用(递归调用)。4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法子程序结构子程序结构子程序结构子程序结构31314-5 4-5 4-5 4-5 程序设计方法程序设计方法程序设计方法程序设计方法综合举例综合举例例例4-17 4-17 将将十十进进制制数
39、数的的ASCIIASCII字字符符串串转转换换成成有有符符号号二二进进制制数数算算法法:首首先先检检测测字字符符串串为为正正还还是是为为负负,若若是是为为负负,将将标标识识符符MINUMINU置置1 1,然然后后进进行行字字符符串串转转换换,转转换换结结束束判判别别标标识识符符MINUMINU,若若MINUMINU是是1 1,把把AXAX中中的的数数取取补补。字字符符串串转转换换方方法法采采用用累累加加和和(DX)(DX)乘乘1010,然后读取下一个字符并转换成二进制数加到累加和中。,然后读取下一个字符并转换成二进制数加到累加和中。子程序名:子程序名:AS2BINAS2BIN输入参数:输入参数
40、:DX=DX=字符串偏移量;字符串偏移量;CXCX字符串字符个数字符串字符个数输输出出参参数数:CF=0CF=0,则则AX=AX=二二进进制制数数;CF=1CF=1,则则字字符符串串非非法法,AXAX0 0。使用寄存器:使用寄存器:SISI,BXBX方法方法方法方法:若字符串为若字符串为3X3X4 4H H,3X3X3 3H H,3X3X2 2H H,3X3X1 1H H,3X3X0 0H H则二进制数则二进制数(X(X4 410)10)X X3 3)10)10X X2 2)10)10)X X1 1)10)10X X0 0五、综合举例五、综合举例3232AS2BINAS2BINPROCPROC
41、 FAR FAR PUSH CXPUSH CX PUSH DXPUSH DX PUSH SIPUSH SI MOV SIMOV SI,DX DX ;DXDX存到存到SISI中中 CMP CXCMP CX,6 6 JA JA ERRERR;字符串长度;字符串长度大于大于6 6转转ERRERR CLDCLD MOV ALMOV AL,SI SI ;查符号;查符号 CMP ALCMP AL,JNE JNE CHKCHK MOV MOV MINUMINU,1 1 JMP JMP DECSDECS4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法综合举例综合举例综合举例综合
42、举例3333CHKCHK:CMP ALCMP AL,JNE JNE CLRDCLRD;第一个字符不为正负;第一个字符不为正负号号DECSDECS:DEC DEC CXCX INC INC SISICLRDCLRD:SUB SUB DXDX,DX DX ;DXDX清清0 0,放结果,放结果NEXTNEXT:CALLCALL CHE CHE ;DXDX乘乘1010 JC JC ERRERR LODSB LODSB ;读下一个字符到;读下一个字符到ALAL CMP CMP ALAL,0 0 ;字字符符不不在在0 09 9之之间间,出出错错 JB JB ERRERR CMP CMP ALAL,99JA
43、 JA ERRERR4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法综合举例综合举例综合举例综合举例3434 AND AND AXAX,000FH 000FH ;转换成二进制数;转换成二进制数ADD ADD DXDX,AXAXJC JC ERR ERR ;累加和超过;累加和超过6553565535出错出错LOOP NEXTLOOP NEXTMOV MOV AXAX,DX DX ;结果送入;结果送入AXAXCMP MINUCMP MINU,1 1 ;负数求补;负数求补JNE JNE EXITEXITNEG AXNEG AXJMP JMP EXITEXITERRER
44、R:STC STC ;字符串为非法;字符串为非法MOV MOV AXAX,0 0EXITEXIT:POP POP SISI POP POP DXDX POP POP CXCX RETRET4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法综合举例综合举例综合举例综合举例3535 CHE CHE PROC NEAR PROC NEAR ;乘;乘1010子程序子程序 PUSH BXPUSH BX MOV BXMOV BX,DXDX SHL DXSHL DX,1 1 SHL DXSHL DX,1 1 ADD DXADD DX,BXBX SHL DXSHL DX,1 1
45、POP BXPOP BX RETRETCHE CHE ENDPENDPAS2BIN AS2BIN ENDPENDP4-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法综合举例综合举例综合举例综合举例36364-5 4-5 4-5 4-5 程序设计方法程序设计方法程序设计方法程序设计方法综合举例综合举例*例例4-18 4-18 完成两个多位十进制数相乘,并将结果送屏幕显示。完成两个多位十进制数相乘,并将结果送屏幕显示。解:该程序包含三个过程:解:该程序包含三个过程:MMULMMUL过程:过程:两个多位十进制数相乘,并输出结果;两个多位十进制数相乘,并输出结果;MULS
46、MULS过程:过程:两个一位十进制数相乘,结果以非压缩型两个一位十进制数相乘,结果以非压缩型BCDBCD码形式保留码形式保留在在AXAX中;中;DOUTDOUT过程:过程:累加部分积,采用过程嵌套调用的方法。累加部分积,采用过程嵌套调用的方法。37374-5 4-5 4-5 4-5 程序设计方法程序设计方法程序设计方法程序设计方法综合举例综合举例NAMENAME MULTMULTDATADATASEGMENT SEGMENT ;数据段数据段 X XDB 4,5,6,7 DB 4,5,6,7 ;定义被乘数定义被乘数 N1N1EQU$EQU$X X Y Y DB 1,2,3,4 DB 1,2,3,
47、4 ;定义乘数定义乘数 N2 N2 EQU$EQU$Y Y Z Z DB 30H DUP(?)DB 30H DUP(?)P P DB 45671234=DB 45671234=Q Q DB 30H DUP(?)DB 30H DUP(?)DATA DATA ENDSENDSSTACK STACK SEGMENT STACK SEGMENT STACK ;堆栈段;堆栈段 DW 50H DUP(?)DW 50H DUP(?)TOP LABEL WORDTOP LABEL WORDSTACK STACK ENDSENDS3838CODECODESEGMENT SEGMENT ;代码段代码段 ASSUM
48、E CS:CODEASSUME CS:CODE,DS:DATADS:DATA,SS:STACKSS:STACKMAIN MAIN PROCPROC FARFARSTARTSTART:MOVMOVAXAX,DATADATA MOV MOV DSDS,AXAX MOV MOV AXAX,STACKSTACK MOV MOV SSSS,AXAX MOV MOV SPSP,OFFSET TOPOFFSET TOP MOV MOV CLCL,4 4 MOV MOV SISI,0 0 MOV MOV BXBX,N2N2LOOP1LOOP1:MOV MOV CHCH,YBXYBX11 CALL CALL M
49、MULMMUL INC INC SI SI DEC DEC BXBX JNZ JNZ LOOP1LOOP14-4 4-4 4-4 4-4 程序设计方法程序设计方法程序设计方法程序设计方法综合举例综合举例综合举例综合举例3939 MOVMOVSISI,DXDX;DXDX为积的高位相对于地位的位移量为积的高位相对于地位的位移量 MOV MOV BXBX,0 0ASCASC:MOV MOV ALAL,ZSIZSI;从积的高位开始,将其由非压缩;从积的高位开始,将其由非压缩 AND AND ALAL,0FH0FH;BCDBCD码转换为码转换为ASCIIASCII码,存放在码,存放在 OR OR ALA
50、L,30H30H;QQ开始的单元中,即积的高位开始的单元中,即积的高位 MOV MOV QBXQBX,ALAL;ASCIIASCII码在码在QQ低地址。低地址。INC INC BXBX DEC DEC SISI CMP CMP SISI,0 0 JNL JNL ASCASC MOV MOV QBXQBX,$;QQ的最后存入显示结束符的最后存入显示结束符$DISP DISP:MOV MOV AHAH,9 9 MOV MOV DXDX,OFFSET POFFSET P INT INT 21H21H;显显 示示“4567123445671234”MOV MOV AHAH,4CH4CH INT INT