《汇编语言高级编程技巧第八章教案》由会员分享,可在线阅读,更多相关《汇编语言高级编程技巧第八章教案(63页珍藏版)》请在金锄头文库上搜索。
1、汇编语言高级编程技巧第八章教案第八章汇编语言高级编程技巧.8.1 8.1 8.1 8.1 模模模模块块块块化程序化程序化程序化程序设计设计设计设计8.2 8.2 8.2 8.2 汇编语汇编语汇编语汇编语言程序与高言程序与高言程序与高言程序与高级语级语级语级语言程序的言程序的言程序的言程序的连连连连接接接接8.3 8.3 8.3 8.3 使用使用使用使用DOS EXECDOS EXECDOS EXECDOS EXEC功能功能功能功能执执执执行程序行程序行程序行程序8.4 TSR8.4 TSR8.4 TSR8.4 TSR程序程序程序程序设计设计设计设计软软件工程开件工程开发发包括以下步包括以下步骤
2、骤:系系统统分析;分析; 系系统设计统设计; 细细化各模化各模块块的功能、确定模的功能、确定模块间块间的关系及通信方的关系及通信方法;法;法;法; 完成各模完成各模完成各模完成各模块块块块的程序的程序的程序的程序编码编码编码编码及模及模及模及模块调试块调试块调试块调试; 连连接多个模接多个模块组块组成大系成大系统统; 调试调试大系大系统统; 系系系系统维护统维护统维护统维护。8.1 8.1 模模块块化程序化程序设计设计 主模主模块块模模块块B B模模块块C C模模块块A A模模块块D D模模块块C C模模块块E E图图8-1 8-1 模模块块的的层层次次结结构构8.1.1 8.1.1 模模块块
3、通信通信 例例实实现现PRICEQTYPRICEQTYTOTALTOTAL的的功功能能。要要求求由由两两个个模模块块实实现现,其其中中主主模模块块给给出出数数据据,子子模模块块实实现现两两数数相乘。相乘。主模主模块块DATADATA SEGMENTSEGMENTPRICE PRICE DW 60DW 60QTY QTY DW 80DW 80TOTAL TOTAL DD ?DD ?DATADATA ENDSENDSCODECODE SEGMENT SEGMENT ASSUME ASSUME CS:CODE,DS:DATACS:CODE,DS:DATAMAINMAIN PROC FARPROC F
4、ARMOV AX,DATAMOV AX,DATAMOV DS,AXMOV DS,AX CALL FAR PTR SUBMCALL FAR PTR SUBM MOV AX,4C00H MOV AX,4C00H INT 21H INT 21HMAINMAIN ENDPENDPCODECODE ENDSENDS END MAIN END MAIN子模子模块块CODE SEGMENTCODE SEGMENTCODE SEGMENTCODE SEGMENTSUBM PROC FARSUBM PROC FARSUBM PROC FARSUBM PROC FAR ASSUME CS:CODE ASSUME
5、CS:CODE ASSUME CS:CODE ASSUME CS:CODE MOV AX,PRICE MOV AX,PRICE MOV AX,PRICE MOV AX,PRICE MUL QTY MUL QTY MUL QTY MUL QTY MOV WORD PTR TOTAL,AX MOV WORD PTR TOTAL,AX MOV WORD PTR TOTAL,AX MOV WORD PTR TOTAL,AX MOV WORD PTR TOTAL+2,DX MOV WORD PTR TOTAL+2,DX MOV WORD PTR TOTAL+2,DX MOV WORD PTR TOTAL
6、+2,DX RET RET RET RETSUBM ENDPSUBM ENDPSUBM ENDPSUBM ENDPCODE ENDSCODE ENDSCODE ENDSCODE ENDS END END END END(1)(1)外部引用外部引用伪伪指令指令EXTRNEXTRN格式:格式:EXTRN EXTRN 名字名字: :类类型型,.,.注注意意:EXTRNEXTRNEXTRNEXTRN伪伪伪伪指指指指令令令令应应应应该该该该出出出出现现现现在在在在引引引引用用用用该该该该名名名名字字字字之之之之前前前前,一一一一般般般般放放放放在在在在程程程程序序序序的开的开的开的开头头头头。(2)(2
7、)(2)(2)全局符号全局符号全局符号全局符号说说说说明明明明伪伪伪伪指令指令指令指令PUBLICPUBLICPUBLICPUBLIC格式:格式:PUBLIC PUBLIC 名字名字,.,. 实实实实现现现现PRICEPRICEPRICEPRICE QTYQTYQTYQTYTOTALTOTALTOTALTOTAL的的的的功功功功能能能能。其其其其中中中中数数数数据据据据定定定定义义义义和和和和乘乘乘乘法法法法实实实实现现现现分分分分别别别别在两个模在两个模在两个模在两个模块块块块中。程序中。程序中。程序中。程序见见见见程序。程序。程序。程序。 a a 主模主模块块EXTRN SUBM:FARE
8、XTRN SUBM:FARPUBLIC PRICE,QTY,TOTALPUBLIC PRICE,QTY,TOTALPUBLIC PRICE,QTY,TOTALPUBLIC PRICE,QTY,TOTALstacksg segment stack stkstacksg segment stack stk dw 32 dup(s) dw 32 dup(s)stacksg endsstacksg endsstacksg endsstacksg endsdata segmentdata segmentPRICE DW 60PRICE DW 60PRICE DW 60PRICE DW 60QTY DW
9、80QTY DW 80QTY DW 80QTY DW 80TOTAL DD ?TOTAL DD ?data endsdata endscode segmentcode segmentcode segmentcode segmentmain proc farmain proc farmain proc farmain proc far assume cs:code,ds:data assume cs:code,ds:data assume cs:code,ds:data assume cs:code,ds:data mov ax,data mov ax,data mov ax,data mov
10、ax,data mov ds,ax mov ds,ax mov ds,ax mov ds,ax CALL FAR PTR SUBM CALL FAR PTR SUBM CALL FAR PTR SUBM CALL FAR PTR SUBM MOV AX,4C00H MOV AX,4C00H MOV AX,4C00H MOV AX,4C00H INT 21H INT 21H INT 21H INT 21Hmain endpmain endpmain endpmain endpcode endscode endscode endscode ends end main end main end ma
11、in end mainb b 子模子模块块EXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDEXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDEXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDEXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDPUBLIC SUBMPUBLIC SUBMPUBLIC SUBMPUBLIC SUBMCODE SEGMENTCODE SEGMENTCODE SEGMENTCODE SEGMENTSUBM PROC FARSUBM PROC FARSUBM PROC FAR
12、SUBM PROC FAR ASSUME CS:CODE ASSUME CS:CODE ASSUME CS:CODE ASSUME CS:CODE MOV AX,PRICE MOV AX,PRICE MOV AX,PRICE MOV AX,PRICE MUL QTY MUL QTY MUL QTY MUL QTY MOV word ptr TOTAL,AX MOV word ptr TOTAL,AX MOV word ptr TOTAL,AX MOV word ptr TOTAL,AX MOV word ptr TOTAL+2,DX MOV word ptr TOTAL+2,DX MOV wo
13、rd ptr TOTAL+2,DX MOV word ptr TOTAL+2,DX RET RET RET RETSUBM ENDPSUBM ENDPSUBM ENDPSUBM ENDPCODE ENDSCODE ENDSCODE ENDSCODE ENDS END END END END2. 2. 使用公用数据段使用公用数据段实现过实现过程通信程通信COMMONCOMMON功功能能:告告诉诉连连接接程程序序把把多多个个同同名名数数据据段段在在连连接接时时重叠形成一个段,重叠形成一个段,产产生段覆盖。生段覆盖。说说明明:具具有有COMMONCOMMON组组合合类类型型的的最最长长段段决决定定了
14、了公公共共段段的的长长度度,重重叠叠部部分分的的内内容容取取决决于于连连接接时时最最后后一一个个公公共共段段的内容。的内容。 实实现现例例8.18.1的的功功能能,但但使使用用公公用用数数据据段段实实现现过过程程通通信信,见见程序程序8.28.2。a a(主程序):(主程序):EXTRN SUBM:FAREXTRN SUBM:FAREXTRN SUBM:FAREXTRN SUBM:FARSTACKSG SEGMENT STACK STKSTACKSG SEGMENT STACK STKSTACKSG SEGMENT STACK STKSTACKSG SEGMENT STACK STK DW 3
15、2 DUP(S) DW 32 DUP(S) DW 32 DUP(S) DW 32 DUP(S)STACKSG ENDSSTACKSG ENDSSTACKSG ENDSSTACKSG ENDSDATA SEGMENT COMMONDATA SEGMENT COMMONDATA SEGMENT COMMONDATA SEGMENT COMMONPRICE DW 60PRICE DW 60PRICE DW 60PRICE DW 60QTY DW 80QTY DW 80TOTAL DD ?TOTAL DD ?DATA ENDSDATA ENDSDATA ENDSDATA ENDSCODE SEGMEN
16、TCODE SEGMENTCODE SEGMENTCODE SEGMENTMAIN PROC FARMAIN PROC FARMAIN PROC FARMAIN PROC FAR ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV AX,DATA MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX MOV DS,AX MOV DS,AX CALL FAR PTR SUBM CALL FAR PTR
17、 SUBM CALL FAR PTR SUBM CALL FAR PTR SUBM MOV AX,4C00H MOV AX,4C00H MOV AX,4C00H MOV AX,4C00H INT 21H INT 21H INT 21H INT 21HMAIN ENDPMAIN ENDPMAIN ENDPMAIN ENDPCODE ENDSCODE ENDSCODE ENDSCODE ENDS END MAIN END MAIN END MAIN END MAINb b(子程序)(子程序)PUBLIC SUBMPUBLIC SUBMDATA SEGMENT COMMONDATA SEGMENT
18、COMMONPRICE DW 80PRICE DW 80QTY DW 60QTY DW 60TOTAL DD ?TOTAL DD ?REM DB123 REM DB123 ;局部;局部变变量量DATA ENDSDATA ENDSCODE SEGMENT CODE SEGMENT SUBM PROC FARSUBM PROC FAR ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATA PUSH DS PUSH DS PUSH AX PUSH AX PUSH DX PUSH DX MOV AX,DATA MOV AX,DATA MOV DS,AX MOV D
19、S,AX MOV AX,PRICE MOV AX,PRICE MUL QTYMUL QTY MOV WORD PTR TOTAL,AX MOV WORD PTR TOTAL,AX MOV WORD PTR TOTAL+2,DX MOV WORD PTR TOTAL+2,DX POP DX POP DX POP AX POP AX POP DS POP DS RET RETSUBM ENDPSUBM ENDPCODE ENDSCODE ENDS END END 在在模模块块化化程程序序设设计计中中,也也可可以以使使用用寄寄存存器器或或堆堆栈栈传传递递参参数数或或参参数数地地址址,从从而而实实现现
20、过过程程通通信信。例例如如,通通过过AXAX、DXDX寄寄存存器器把把PRICEPRICE和和QTYQTY的的值值传传递递给给子程序子程序实现过实现过程通信。程通信。EXTRN EXTRN EXTRN EXTRN SUBM:FARSUBM:FARSUBM:FARSUBM:FARPUBLIC PUBLIC PUBLIC PUBLIC TOTALTOTALTOTALTOTALdata data data data segmentsegmentsegmentsegmentPRICE PRICE PRICE PRICE DW 60DW 60DW 60DW 60QTY QTY QTY QTY DW 80
21、DW 80DW 80DW 80TOTAL TOTAL TOTAL TOTAL DD ?DD ?DD ?DD ?data data data data endsendsendsends MOV AXMOV AXMOV AXMOV AX,PRICEPRICEPRICEPRICE MOV DXMOV DXMOV DXMOV DX,QTYQTYQTYQTY CALL FAR PTR SUBMCALL FAR PTR SUBMCALL FAR PTR SUBMCALL FAR PTR SUBM end mainend mainend mainend main可以把程序可以把程序8.1b8.1b改改为为:
22、EXTRN TOTAL:DWORDEXTRN TOTAL:DWORDEXTRN TOTAL:DWORDEXTRN TOTAL:DWORDPUBLIC SUBMPUBLIC SUBMPUBLIC SUBMPUBLIC SUBM MUL DX MUL DX MUL DX MUL DX MOV word ptr TOTAL,AX MOV word ptr TOTAL,AX MOV word ptr TOTAL,AX MOV word ptr TOTAL,AX MOV word ptr TOTAL+2,DX MOV word ptr TOTAL+2,DX MOV word ptr TOTAL+2,DX
23、 MOV word ptr TOTAL+2,DX END END END END8.1.2 8.1.2 模模块连块连接接一一个个程程序序可可以以由由若若干干个个模模块块组组成成,一一个个模模块块又又可可以以包包含含多多个个段段,这这些些模模块块经经过过分分别别调调试试后后,最最终终要要组组装到一起,形成一个大系装到一起,形成一个大系统统。一、多模一、多模块块程序程序设计设计上机步上机步骤骤和两个独立模和两个独立模和两个独立模和两个独立模块为块为块为块为例,例,例,例,讨论讨论讨论讨论多模多模多模多模块块块块程序程序程序程序设计设计设计设计上机步上机步上机步上机步骤骤骤骤。 对对对对各模各模各模
24、各模块块块块分分分分别处别处别处别处理以保理以保理以保理以保证证证证其功能的正确性其功能的正确性其功能的正确性其功能的正确性 构造主模构造主模构造主模构造主模块块块块 例如把第例如把第例如把第例如把第步所得到的修改成主模步所得到的修改成主模步所得到的修改成主模步所得到的修改成主模块块块块形式。形式。形式。形式。键键键键入命令:入命令:入命令:入命令:edit prices.asmedit prices.asmedit prices.asmedit prices.asm 如程序如程序如程序如程序a a a a所示。所示。所示。所示。 构造子模构造子模构造子模构造子模块块块块 例如把第例如把第例如
25、把第例如把第步所得到的修改成子程序的形式。步所得到的修改成子程序的形式。步所得到的修改成子程序的形式。步所得到的修改成子程序的形式。键键键键入命令:入命令:入命令:入命令:edit prices.asmedit prices.asmedit prices.asmedit prices.asm 如程序如程序如程序如程序b b b b所示。所示。所示。所示。 对对所有模所有模块块分分别汇编别汇编,生成各自的,生成各自的.obj.obj文件文件键键入命令:入命令:masm pricem masm pricem 生成生成pricem.objpricem.obj等文件等文件键键入命令:入命令:masm
26、prices masm prices 生成生成prices.objprices.obj等文件等文件若若汇汇编编过过程程出出现现错错误误,应应修修改改源源程程序序,直直到到汇编汇编通通过过。 连连接与本系接与本系统统相关的所有相关的所有.obj.obj文件文件键键入命令:入命令:link pricem+prices,price;link pricem+prices,price;于是生成了文件。于是生成了文件。 调试调试调试调试及运行程序及运行程序及运行程序及运行程序用用DEBUGDEBUG调试调试文件及运行的文件及运行的过过程同第程同第4 4章。章。二、二、连连接接对对程序程序设计设计的要求的要
27、求段定段定义伪义伪指令的完整格式:指令的完整格式:段名段名段名段名 SEGMENT SEGMENT SEGMENT SEGMENT 定位定位定位定位类类类类型型型型组组组组合合合合类类类类型型型型类别类别类别类别 段名段名段名段名 ENDS ENDS ENDS ENDS其中其中其中其中 中的内容是可中的内容是可中的内容是可中的内容是可选选选选的,各的,各的,各的,各项项项项含含含含义义义义如下:如下:如下:如下:1 1定位定位类类型型确定段的起始确定段的起始确定段的起始确定段的起始边边边边界。界。界。界。BYTEBYTEBYTEBYTE:字:字:字:字节边节边节边节边界,从任意地址开始。界,从
28、任意地址开始。界,从任意地址开始。界,从任意地址开始。WORDWORDWORDWORD:字:字:字:字边边边边界,从偶地址开始。界,从偶地址开始。界,从偶地址开始。界,从偶地址开始。DWORDDWORDDWORDDWORD:双字:双字:双字:双字边边边边界,从可以被界,从可以被界,从可以被界,从可以被4 4 4 4整除的地址开始。整除的地址开始。整除的地址开始。整除的地址开始。PARAPARAPARAPARA(缺省(缺省(缺省(缺省值值值值):):):):节边节边节边节边界,从可以被界,从可以被界,从可以被界,从可以被16161616整除的地整除的地整除的地整除的地 址开始。址开始。址开始。址
29、开始。PAGEPAGEPAGEPAGE:页边页边页边页边界,从可以被界,从可以被界,从可以被界,从可以被256256256256整除的地址开始。整除的地址开始。整除的地址开始。整除的地址开始。 2 2 2 2类别类别类别类别说说说说明本段明本段明本段明本段归归归归于哪一于哪一于哪一于哪一类类类类。3 3组组合合类类型型说说明段之明段之间间的关系。可以是:的关系。可以是: 缺省缺省值值 PUBLIC PUBLIC STACK STACK STACK STACK COMMON COMMON AT AT 段基址表达式段基址表达式例:例:VIDEOVIDEORAM SEGMENT AT 0B800HR
30、AM SEGMENT AT 0B800H三、模三、模块连块连接接举举例例1 1使用缺省的使用缺省的组组合合类类型和定位型和定位类类型型主模主模主模主模块块块块EXTRN SUBM:FAREXTRN SUBM:FAREXTRN SUBM:FAREXTRN SUBM:FARPUBLIC PRICE,QTY,TOTALPUBLIC PRICE,QTY,TOTALPUBLIC PRICE,QTY,TOTALPUBLIC PRICE,QTY,TOTALdata segmentdata segmentdata segmentdata segmentPRICE DW 60PRICE DW 60PRICE D
31、W 60PRICE DW 60QTY DW 80QTY DW 80QTY DW 80QTY DW 80TOTAL DD ?TOTAL DD ?TOTAL DD ?TOTAL DD ?data endsdata endsdata endsdata endscode segmentcode segmentmain proc farmain proc far assume cs:code,ds:data assume cs:code,ds:data mov ax,data mov ax,data mov ds,ax mov ds,ax CALL FAR PTR SUBM CALL FAR PTR S
32、UBM MOV AX,4C00H MOV AX,4C00H INT 21H INT 21Hmain endpmain endpcode endscode ends end main end main子模子模块块EXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDEXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDEXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDEXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDPUBLIC SUBMPUBLIC SUBMPUBLIC SUBMPUBLIC SUBMCOD
33、E SEGMENTCODE SEGMENTCODE SEGMENTCODE SEGMENTSUBM PROC FARSUBM PROC FARSUBM PROC FARSUBM PROC FAR ASSUME CS:CODE ASSUME CS:CODE ASSUME CS:CODE ASSUME CS:CODE . MOV AX,PRICE MOV AX,PRICE MOV AX,PRICE MOV AX,PRICE MUL QTY MUL QTY MUL QTY MUL QTY MOV word ptr TOTAL,AX MOV word ptr TOTAL,AX MOV word ptr
34、 TOTAL,AX MOV word ptr TOTAL,AX MOV word ptr TOTAL+2,DX MOV word ptr TOTAL+2,DX MOV word ptr TOTAL+2,DX MOV word ptr TOTAL+2,DX. RET RET RET RETSUBM ENDPSUBM ENDPSUBM ENDPSUBM ENDPCODE ENDSCODE ENDSCODE ENDSCODE ENDS END END END END.MAP.MAP文件文件主、子模块的code segmentcode segment效果效果 StartStopLengthNameCl
35、ass00000H0003FH00040HSTACKSGSTK00040H00047H00008HDATA00050H0005EH0000FHCODE00060H00072H00013HCODEProgramentrypointat0005:0000主、子模块的CODE段均无任何可选项的.MAP文件2 2使用使用PUBLICPUBLIC组组合合类类型型PUBLICPUBLICPUBLICPUBLIC组组组组合合合合类类类类型且同段名同型且同段名同型且同段名同型且同段名同类别类别类别类别名,例如名,例如名,例如名,例如:CODE SEGMENT PARA PUBLIC CODECODE SEGM
36、ENT PARA PUBLIC CODE 则则则则连连连连接接接接后后后后生生生生成成成成的的的的.MAP.MAP.MAP.MAP文文文文件件件件中中中中只只只只有有有有一一一一个个个个代代代代码码码码段段段段CODECODECODECODE,其其其其总长总长总长总长度度度度为为为为00023H00023H00023H00023H,它是主、子模,它是主、子模,它是主、子模,它是主、子模块块块块代代代代码码码码段段段段长长长长度的度的度的度的总总总总和。和。和。和。 StartStopLengthNameClass00000H0003FH00040HSTACKSGSTK00040H00047H0
37、0008HDATA00050H00072H00023HCODECODEProgramentrypointat0005:00003 3堆堆栈栈段使用段使用STACKSTACK组组合合类类型型在在程程序序8.38.3的的主主、子子模模块块中中均均增增加加同同段段名名同同类类别别名且具有名且具有STACKSTACK组组合合类类型的段,例如:型的段,例如:STACKSG SEGMENT STACK STKSTACKSG SEGMENT STACK STKSTACKSG SEGMENT STACK STKSTACKSG SEGMENT STACK STK DW 32 DUP(S) DW 32 DUP(S
38、) DW 32 DUP(S) DW 32 DUP(S)STACKSG ENDSSTACKSG ENDSSTACKSG ENDSSTACKSG ENDS则则则则连连连连接接接接后后后后生生生生成成成成的的的的堆堆堆堆栈栈栈栈段段段段长长长长度度度度为为为为两两两两个个个个模模模模块块块块中中中中的的的的栈栈栈栈长长长长度度度度之和之和之和之和80H80H80H80H,.MAP.MAP.MAP.MAP文件如下:文件如下:文件如下:文件如下: StartStopLength NameClass00000H0007FH00080HSTACKSGSTK00080H00087H00008HDATA0009
39、0H0009EH0000FHCODE000A0H000B2H00013HCODEProgramentrypointat0009:00004 4数据段使用数据段使用COMMONCOMMON组组合合类类型型COMMONCOMMONCOMMONCOMMON组组组组合合合合类类类类型型型型的的的的程程程程序序序序示示示示例例例例见见见见,其其其其.MAP.MAP.MAP.MAP文文文文件件件件如如如如下下下下所所所所示示示示。其其其其数数数数据据据据段段段段的的的的长长长长度度度度为为为为0BH0BH0BH0BH(具具具具有有有有COMMONCOMMONCOMMONCOMMON组组组组合合合合类类类类
40、型型型型的的的的最最最最长长长长段段段段),产产产产生生生生了段的覆盖。了段的覆盖。了段的覆盖。了段的覆盖。 StartStopLengthNameClass00000H0003FH00040HSTACKSGSTK00040H0004AH0000BHDATA00050H0005EH0000FHCODE00060H00079H0001AHCODEProgramentrypointat0005:0000设设新新局局部部数数据据段段名名为为NEW_DATANEW_DATA,原原局局部部数数据据段段名名为为OLD_DATAOLD_DATAASSUME DS: NEW_DATAASSUME DS: NE
41、W_DATAPUSH DS PUSH DS ; ;保存原局部数据段基址保存原局部数据段基址MOV AXMOV AX,NEW_DATA NEW_DATA ; ;建立新局部数据段建立新局部数据段寻寻址址MOV DSMOV DS,AXAX ; ;访问访问NEW_DATANEW_DATA段的数据段的数据POP DSPOP DS ; ;恢复原局部数据段基址恢复原局部数据段基址8.1.3 8.1.3 模模块组织块组织建建议议当当全全部部堆堆栈栈数数据据的的总总长长度度不不超超过过段段长长限限定定时时,通通常常使使用用STACKSTACK组组合合类类型型且且同同段段名名同同类类别别名名定定义义所所有有堆堆栈
42、栈段段,使使其其连连接接后后生生成成一一个个堆堆栈栈段段,这这样样使使用用起起来来十十分分方方便便。但但在在必必须须使使用用多多个个独独立立堆堆栈栈段段的的场场合合,需需要要注注意意堆堆栈栈的的切切换换,即即堆堆栈栈段段寄寄存存器器SSSS和堆和堆栈栈指指针针SPSP。EXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDEXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDPUBLIC SUBMPUBLIC SUBMSTACKSG SEGMENT STACKSG SEGMENT DW 16 DUP(a) DW 16 DUP(a)TOP LABEL WO
43、RDTOP LABEL WORDSTACKSG ENDSSTACKSG ENDSCODE SEGMENTCODE SEGMENTSUBM PROC FARSUBM PROC FAR ASSUME CS:CODE,SS:STACKSG ASSUME CS:CODE,SS:STACKSG mov cs:sav_ss,ss mov cs:sav_ss,ss mov cs:sav_sp,sp mov cs:sav_sp,sp cli cli mov ax,stacksg mov ax,stacksg mov ss,ax mov ss,ax mov sp,offset top mov sp,offset
44、 top sti sti push AX push AX PUSH DX PUSH DX MOV AX,PRICE MOV AX,PRICE MUL QTY MUL QTY MOV WORD PTR TOTAL,AX MOV WORD PTR TOTAL,AX MOV WORD PTR TOTAL+2,DX MOV WORD PTR TOTAL+2,DX POP DX POP DX POP AX POP AX cli cli mov ss,cs:sav_ss mov ss,cs:sav_ss mov sp,cs:sav_sp mov sp,cs:sav_sp sti sti RET RETsa
45、v_ss dw ?sav_ss dw ?sav_sp dw ?sav_sp dw ?SUBM ENDPSUBM ENDPCODE ENDSCODE ENDS END ENDPRICEMPRICEMPRICEMPRICEM有以下堆有以下堆有以下堆有以下堆栈栈栈栈段定段定段定段定义义义义,把程序,把程序,把程序,把程序8.48.48.48.4与程序与程序与程序与程序8.38.38.38.3连连连连接,接,接,接,则则则则生生生生成成成成图图图图8-68-68-68-6的的的的.MAP.MAP.MAP.MAP文件。文件。文件。文件。 stacksg segment stack stkstacksg
46、segment stack stkstacksg segment stack stkstacksg segment stack stk dw 32 dup(s) dw 32 dup(s) dw 32 dup(s) dw 32 dup(s)stacksg endsstacksg endsstacksg endsstacksg ends StartStopLengthNameClass00000H0003FH00040HSTACKSGSTK00040H00047H00008HDATA00050H0005EH0000FHCODE00060H0007FH00020HSTACKSG00080H000B6
47、H00037HCODEProgramentrypointat0005:0000图图8-6 8-6 含有多个堆含有多个堆栈栈段的段的.MAP.MAP文件文件8.1.4 8.1.4 模模块块程序程序设计设计上机步上机步骤骤 各个模各个模各个模各个模块块块块独立独立独立独立调试调试调试调试以确保功能的正确性。以确保功能的正确性。以确保功能的正确性。以确保功能的正确性。构造主模构造主模块块。构造子模构造子模块块。对对第第和第和第步得到的所有模步得到的所有模块块分分别汇编别汇编,生成各,生成各自的自的.obj.obj等文件。等文件。把第把第把第把第步步步步产产产产生的所有生的所有生的所有生的所有.obj
48、.obj.obj.obj文件文件文件文件连连连连接到一起。接到一起。接到一起。接到一起。运行及运行及调试调试程序。程序。8.1.5 8.1.5 综综合合举举例例 略(略(见书见书254254页页)。)。8.2.1 C8.2.1 C语语言程序中直接嵌入言程序中直接嵌入汇编汇编代代码码 1. 内嵌内嵌汇编语汇编语句格式句格式 格式:格式: asm asm 内嵌内嵌汇编语汇编语句的操作数可以是:句的操作数可以是: C C程序中的符号程序中的符号 汇编汇编指令操作数可以是指令操作数可以是结结构数据构数据 8.2 8.2 汇编语汇编语言程序与高言程序与高级语级语言程序的言程序的连连接接 2. 转转移指令
49、的移指令的执执行行内嵌内嵌汇编汇编指令可以使用指令可以使用转转移指令和移指令和LOOP LOOP 循循环环指指令,但是它令,但是它们们只能在函数体内有效,不允只能在函数体内有效,不允许进许进行段行段间转间转移。由于移。由于asm asm 语语句中不能句中不能给给出出标标号,因而号,因而转转移移指令只能使用指令只能使用C C语语言程序中言程序中GOTOGOTO语语句使用的句使用的标标号。号。 3. 3. 直接嵌入直接嵌入汇编汇编代代码码的的C C语语言程序示例言程序示例 main main main main三三三三 asm mov ah,2; asm mov ah,2; asm mov dl,
50、*; asm mov dl,*; asm int 21h; asm int 21h; printf(n The & above is printed in printf(n The & above is printed in inline Assembly statement);inline Assembly statement); 对对于于TURBO TURBO C C,假假设设源源程程序序、LIBLIB库库均均在在当当前前TCTC子目子目录录下,相下,相应应的的编译连编译连接命令接命令为为: 1. 1. 1. 1. 编编编编写写写写汇编汇编汇编汇编子程序注意事子程序注意事子程序注意事子程序
51、注意事项项项项 (1)(1)变变量和函数的使用量和函数的使用 (2)(2)参数参数传递传递 (3)(3)汇编语汇编语言子程序的返回言子程序的返回值值 (4)(4)(4)(4)汇编语汇编语汇编语汇编语言子程序中寄存器的使用言子程序中寄存器的使用言子程序中寄存器的使用言子程序中寄存器的使用 8.2.2 8.2.2 在在C C程序中直接程序中直接调调用用汇编汇编子程序子程序 2. 2. 使用使用C C和和汇编语汇编语言混合言混合编编程的程的编译编译及及连连接接 有两种方法可以采用:有两种方法可以采用: (1)(1)(1)(1)以工程(以工程(以工程(以工程(PROJECTPROJECTPROJECT
52、PROJECT)的方式)的方式)的方式)的方式进进进进行行行行在在在在DOSDOSDOSDOS下下下下,用用用用汇汇汇汇编编编编程程程程序序序序将将将将汇汇汇汇编编编编语语语语言言言言子子子子程程程程序序序序汇汇汇汇编编编编生生生生成相成相成相成相应应应应的目的目的目的目标标标标文件文件文件文件.OBJ.OBJ.OBJ.OBJ。在在在在工工工工程程程程文文文文件件件件(设设设设文文文文件件件件名名名名为为为为X.PRJX.PRJX.PRJX.PRJ)中中中中加加加加入入入入将将将将要要要要编编编编译译译译连连连连接接接接的的的的C C C C语语语语言言言言程程程程序序序序及及及及其其其其调调
53、调调用用用用的的的的汇汇汇汇编编编编子子子子程程程程序序序序目目目目标标标标文文文文件件件件名。名。名。名。对对对对工工工工程程程程文文文文件件件件进进进进行行行行编编编编译译译译连连连连接接接接,生生生生成成成成一一一一个个个个.EXE.EXE.EXE.EXE可可可可执执执执行文件。行文件。行文件。行文件。使用使用使用使用这这这这种方法要注意种方法要注意种方法要注意种方法要注意C C C C语语语语言言言言对对对对大小写敏感的大小写敏感的大小写敏感的大小写敏感的问题问题问题问题,最,最,最,最好关好关好关好关闭闭闭闭大小写敏感开关。大小写敏感开关。大小写敏感开关。大小写敏感开关。 (2)(2
54、)(2)(2)采用命令行的方式采用命令行的方式采用命令行的方式采用命令行的方式进进进进行行行行编译连编译连编译连编译连接接接接3. 3. 混合混合编编程程实实例例 具体具体实实例例见见教材例教材例8.88.8(p266p266)。)。8.2.3 8.2.3 汇编语汇编语言程序言程序调调用用C C函数函数 在在在在汇编汇编汇编汇编源程序中,源程序中,源程序中,源程序中,对对对对所使用的所使用的所使用的所使用的C C C C函数和函数和函数和函数和变变变变量在其名字量在其名字量在其名字量在其名字均均均均应应应应加下划加下划加下划加下划线线线线。对调对调对调对调用的用的用的用的C C C C函数用函
55、数用函数用函数用EXTRNEXTRNEXTRNEXTRN伪伪伪伪指令指令指令指令进进进进行行行行说说说说明。明。明。明。 对汇编语对汇编语对汇编语对汇编语言中使用的言中使用的言中使用的言中使用的C C C C函数函数函数函数变变变变量用量用量用量用“EXTRN “EXTRN “EXTRN “EXTRN 变变变变量名:量名:量名:量名:size”size”size”size”说说说说明,其明,其明,其明,其中中中中sizesizesizesize视视视视数据数据数据数据类类类类型而定,例如型而定,例如型而定,例如型而定,例如intintintint型型型型为为为为2 2 2 2。参数参数参数参数
56、传递传递传递传递有两种:一种是在有两种:一种是在有两种:一种是在有两种:一种是在C C C C程序中定程序中定程序中定程序中定义变义变义变义变量,在量,在量,在量,在汇编汇编汇编汇编源程序中把源程序中把源程序中把源程序中把它它它它说说说说明成明成明成明成EXTRNEXTRNEXTRNEXTRN型;另一种是采用堆型;另一种是采用堆型;另一种是采用堆型;另一种是采用堆栈传递栈传递栈传递栈传递,这时这时这时这时要注意参数要注意参数要注意参数要注意参数压压压压入堆入堆入堆入堆栈栈栈栈的的的的顺顺顺顺序。序。序。序。8.3.1 DOS8.3.1 DOS的内存分配与的内存分配与释释放功能放功能简简介介 8
57、.3 8.3 使用使用DOS EXECDOS EXEC功能功能执执行程序行程序 1 1 1 1分配内存分配内存分配内存分配内存块块块块功能功能功能功能48H48H48H48H调调用参数:用参数:AHAHAHAH48H48H48H48H BXBXBXBX以以以以节节节节(16161616字字字字节节节节)为单为单为单为单位的附加内存位的附加内存位的附加内存位的附加内存 块块块块的大小的大小的大小的大小返回参数:返回参数:调调调调用成功用成功用成功用成功 CF CF CF CF0 0 0 0,AXAXAXAX分配的内存分配的内存分配的内存分配的内存块块块块的段地址;的段地址;的段地址;的段地址;
58、调调调调用失用失用失用失败败败败 CF CF CF CF1 1 1 1,AXAXAXAX错误码错误码错误码错误码,BXBXBXBX最大可用最大可用最大可用最大可用块块块块的的的的 大小。大小。大小。大小。 2 2释释放已分配的内存放已分配的内存块块功能功能49H49H调调用参数:用参数:AHAHAHAH49H49H49H49H ES ES ES ES待待待待释释释释放内存放内存放内存放内存块块块块的段地址的段地址的段地址的段地址返回参数:返回参数:返回参数:返回参数:调调调调用成功用成功用成功用成功 CF CF CF CF0 0 0 0,并把,并把,并把,并把0 0 0 0存于存于存于存于该该
59、该该内存内存内存内存块块块块的第二和第三的第二和第三的第二和第三的第二和第三 字字字字节节节节,以表示,以表示,以表示,以表示该块该块该块该块未使用;未使用;未使用;未使用; 调调调调用失用失用失用失败败败败 CF CF CF CF1 1 1 1,AXAXAXAX错误码错误码错误码错误码。 3 3 3 3修改已分配的内存修改已分配的内存修改已分配的内存修改已分配的内存块块块块功能功能功能功能4AH4AH4AH4AH调调用参数:用参数:AHAHAHAH4AH4AH4AH4AH BX BX BX BX以以以以节为单节为单节为单节为单位新申位新申位新申位新申请请请请内存内存内存内存块块块块的大小的大
60、小的大小的大小 ES ES ES ES待修改内存待修改内存待修改内存待修改内存块块块块的段地址的段地址的段地址的段地址返回参数:返回参数:返回参数:返回参数: 调调调调用成功用成功用成功用成功 CF CF CF CF0 0 0 0; 调调调调用失用失用失用失败败败败 CF CF CF CF1 1 1 1,AXAXAXAX错误码错误码错误码错误码,BXBXBXBX最大可用内存的最大可用内存的最大可用内存的最大可用内存的 大小。大小。大小。大小。 8.3.2 8.3.2 使用使用DOS EXECDOS EXEC功能加功能加载载并并执执行程序行程序 使用使用DOSDOS的的EXECEXEC功能可以功
61、能可以实现实现加加载载并并执执行程序行程序等功能。用等功能。用EXECEXEC功能功能执执行或加行或加载载另一个程序的程另一个程序的程序称序称为为父父进进程,由它程,由它执执行或加行或加载载的另一个程序称的另一个程序称为为子子进进程。子程。子进进程被装入内存或程被装入内存或执执行行时时,父,父进进程程一直存于内存中。父一直存于内存中。父进进程可以通程可以通过过多种方法把信多种方法把信息息传递给传递给子子进进程。程。1. EXEC1. EXEC功能功能功能功能简简简简介介介介DOSDOSDOSDOS的的的的EXECEXECEXECEXEC功功功功能能能能可可可可以以以以通通通通过过过过调调调调用
62、用用用INT INT INT INT 21H21H21H21H的的的的4BH4BH4BH4BH功功功功能能能能实实实实现现现现,4BH4BH4BH4BH功能的功能的功能的功能的调调调调用方法是:用方法是:用方法是:用方法是:调调调调用参数:用参数:用参数:用参数:AH=4BH AH=4BH AH=4BH AH=4BH AL=AL=AL=AL=功能功能功能功能类类类类型,其中:型,其中:型,其中:型,其中:AL=00HAL=00HAL=00HAL=00H,加,加,加,加载载载载并并并并执执执执行程序行程序行程序行程序AL=01HAL=01HAL=01HAL=01H,装入子,装入子,装入子,装入子
63、进进进进程程程程AL=03HAL=03HAL=03HAL=03H,加,加,加,加载载载载覆盖覆盖覆盖覆盖AL=05HAL=05HAL=05HAL=05H,设设设设置置置置执执执执行状行状行状行状态态态态DS:DX=DS:DX=DS:DX=DS:DX=子子子子进进进进程程程程的的的的文文文文件件件件说说说说明明明明(文文文文件件件件说说说说明明明明所所所所在在在在的的的的段段段段基基基基址址址址:偏偏偏偏移移移移量)量)量)量)ES:BX=ES:BX=ES:BX=ES:BX=参数参数参数参数块块块块的段基址:偏移量的段基址:偏移量的段基址:偏移量的段基址:偏移量返回参数:返回参数:返回参数:返回
64、参数:若若若若调调调调用成功,用成功,用成功,用成功,则则则则CFCFCFCF0 0 0 0;若;若;若;若调调调调用失用失用失用失败败败败,则则则则CFCFCFCF1 1 1 1,AXAXAXAX错误错误错误错误代代代代码码码码。 重要提示:与其它的重要提示:与其它的重要提示:与其它的重要提示:与其它的DOSDOSDOSDOS功能功能功能功能调调调调用不同,用不同,用不同,用不同,调调调调用用用用EXECEXECEXECEXEC功能在返回功能在返回功能在返回功能在返回时时时时除了保除了保除了保除了保护护护护代代代代码码码码段寄存器段寄存器段寄存器段寄存器CSCSCSCS和指令指和指令指和指令
65、指和指令指针针针针IPIPIPIP外,所有其它寄存器的内容全部被破坏,因此在使用外,所有其它寄存器的内容全部被破坏,因此在使用外,所有其它寄存器的内容全部被破坏,因此在使用外,所有其它寄存器的内容全部被破坏,因此在使用该该该该功能功能功能功能时时时时要特要特要特要特别别别别注意寄存器的保存与恢复。注意寄存器的保存与恢复。注意寄存器的保存与恢复。注意寄存器的保存与恢复。 2. 2. 子子进进程返回程返回码码的的检查检查 若若EXECEXEC功功能能执执行行成成功功,父父进进程程可可以以调调用用INT INT 21H21H中中断断的的4DH4DH功功能能获获取取返返回回码码,以以便便了了解解子子进
66、进程程的的返返回回类类型。型。4DH4DH功能功能简简介如下:介如下:调调调调 用:用:用:用: AHAHAHAH4DH4DH4DH4DH返回返回值值:AHAH返回返回类类型,其型,其AHAH可以是:可以是: 00H 00H 表示子表示子进进程正常程正常结结束束 01H 01H 表示子表示子进进程由程由CTRL-CCTRL-C结结束束 02H 02H 表示子表示子进进程由程由标标准准设备错误结设备错误结束束 03H 03H 表示子表示子进进程程结结束并束并驻驻留留注意:若注意:若调调用用EXECEXEC功能失功能失败败或未或未调调用用EXECEXEC功能,功能,则调则调用用4DH4DH功能返回的功能返回的值值没有意没有意义义。 3. 3. 用用EXECEXEC功能加功能加载载并并执执行程序行程序举举例例 见见程序程序8.9(p273)8.9(p273)1. 实现实现程序退出并程序退出并驻驻留功能的方法留功能的方法MOV AHMOV AH,31H31HMOV ALMOV AL,返回,返回码码; ;正常退出正常退出时时返回返回码为码为0 0MOV DXMOV DX,以,以节为单节为单位要保留的内存量位要保留的内存量INT 21HINT 21H8.4 TSR8.4 TSR程序程序设计设计