收藏 分销(赏)

汇编语言高级编程技巧.pptx

上传人:快乐****生活 文档编号:4224256 上传时间:2024-08-26 格式:PPTX 页数:64 大小:274.95KB
下载 相关 举报
汇编语言高级编程技巧.pptx_第1页
第1页 / 共64页
汇编语言高级编程技巧.pptx_第2页
第2页 / 共64页
汇编语言高级编程技巧.pptx_第3页
第3页 / 共64页
汇编语言高级编程技巧.pptx_第4页
第4页 / 共64页
汇编语言高级编程技巧.pptx_第5页
第5页 / 共64页
点击查看更多>>
资源描述

1、汇编语言程序设计汇编语言程序设计第八章第八章第八章第八章 汇编语言高级编程技巧汇编语言高级编程技巧汇编语言高级编程技巧汇编语言高级编程技巧8.1 8.1 8.1 8.1 模块化程序设计模块化程序设计模块化程序设计模块化程序设计8.2 8.2 汇编语言程序与高级语言程序的连接汇编语言程序与高级语言程序的连接8.3 8.3 使用使用DOS EXECDOS EXEC功能执行程序功能执行程序8.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 模块通信模块通信1.1.外部引用与全局符号说明外部引用与全局符号说明 例例实实现现PRICEQTYPRICEQTYTOTALTOTAL的的功功能能。要要求求由由两两个个模模块块实实现现,其其中中主主模模块块给给出出数

3、数据据,子子模模块实现两数相乘。块实现两数相乘。主模块主模块PRICEM.ASMPRICEM.ASMDATADATASEGMENTSEGMENTPRICE PRICE DW 60DW 60QTY QTY DW 80DW 80TOTAL TOTAL DD?DD?DATADATAENDSENDSCODECODESEGMENT SEGMENT ASSUME ASSUME CS:CODE,DS:DATACS:CODE,DS:DATAMAINMAINPROC FARPROC FARMOV AX,DATAMOV AX,DATAMOV DS,AXMOV DS,AX CALL FAR PTRCALL FAR

4、PTR SUBM SUBM MOV AX,4C00H MOV AX,4C00H INT 21H INT 21HMAINMAINENDPENDPCODECODEENDSENDS END MAIN END MAIN子模块子模块PRICES.ASMPRICES.ASMCODE 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,M

5、OV AX,MOV AX,MOV AX,PRICEPRICEPRICEPRICE MUL MUL MUL MUL QTYQTYQTYQTY MOV WORD PTR MOV WORD PTR MOV WORD PTR MOV WORD PTR TOTALTOTALTOTALTOTAL,AX,AX,AX,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 EN

6、DPCODE ENDSCODE ENDSCODE ENDSCODE ENDS END END END END(1)(1)外部引用伪指令外部引用伪指令EXTRNEXTRN格式:格式:EXTRN EXTRN 名字名字:类型类型,.,.注注意意:EXTRNEXTRN伪伪指指令令应应该该出出现现在在引引用用该该名名字字之之前前,一一般般放在程序的开头。放在程序的开头。(2)(2)(2)(2)全局符号说明伪指令全局符号说明伪指令全局符号说明伪指令全局符号说明伪指令PUBLICPUBLICPUBLICPUBLIC格式:格式:PUBLIC PUBLIC 名字名字,.,.例例8.18.1 实实现现PRICEP

7、RICEQTYQTYTOTALTOTAL的的功功能能。其其中中数数据据定定义义和乘法实现分别在两个模块中。程序见程序和乘法实现分别在两个模块中。程序见程序8.18.1。程序程序8.1a 8.1a 主模块主模块PRICEM.ASMPRICEM.ASMEXTRN SUBM:FAREXTRN SUBM:FARPUBLIC PRICE,QTY,TOTALPUBLIC PRICE,QTY,TOTALstacksg segment stack stkstacksg segment stack stk dw 32 dup(s)dw 32 dup(s)stacksg endsstacksg endsdata

8、segmentdata segmentPRICE DW 60PRICE DW 60QTY 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

9、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 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 e

10、nds end mainend mainend mainend main返回程序程序8.1b 8.1b 子模块子模块PRICES.ASMPRICES.ASMEXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDEXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDPUBLIC SUBMPUBLIC SUBMCODE SEGMENTCODE SEGMENTSUBM PROC FARSUBM PROC FAR ASSUME CS:CODE ASSUME CS:CODE MOV AX,PRICEMOV AX,PRICE MUL QTY MUL QTY MOV

11、word ptr TOTAL,AX MOV word ptr TOTAL,AX MOV word ptr TOTAL+2,DX MOV word ptr TOTAL+2,DX RETRETSUBM ENDPSUBM ENDPCODE ENDSCODE ENDS END END返回2.2.使用公用数据段实现过程通信使用公用数据段实现过程通信COMMONCOMMON功功能能:告告诉诉连连接接程程序序把把多多个个同同名名数数据据段段在连接时重叠形成一个段,产生段覆盖。在连接时重叠形成一个段,产生段覆盖。说说明明:具具有有COMMONCOMMON组组合合类类型型的的最最长长段段决决定定了了公公共共段段

12、的的长长度度,重重叠叠部部分分的的内内容容取取决决于于连连接接时时最最后后一一个个公公共段的内容。共段的内容。例例8.28.2 实实现现例例8.18.1的的功功能能,但但使使用用公公用用数数据据段段实实现过程通信,见程序现过程通信,见程序8.28.2。程序程序8.2a8.2a(主程序):(主程序):EXTRN SUBM:FAREXTRN SUBM:FARSTACKSG SEGMENT STACK STKSTACKSG SEGMENT STACK STK DW 32 DUP(S)DW 32 DUP(S)STACKSG ENDSSTACKSG ENDSDATA SEGMENT DATA SEGME

13、NT COMMONCOMMONPRICE DW 60PRICE DW 60QTY DW 80QTY DW 80TOTAL DD?TOTAL DD?DATA 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 SUBM MOV AX,4C00H MOV AX,4C00H INT 21

14、H INT 21HMAIN ENDPMAIN ENDPCODE ENDSCODE ENDS END MAIN END MAIN程序程序8.2b8.2b(子程序)(子程序)PUBLIC SUBMPUBLIC SUBMDATA SEGMENT DATA SEGMENT COMMONCOMMONPRICE DW 80PRICE DW 80QTY DW 60QTY DW 60TOTAL DD?TOTAL DD?REM DBREM DB123123 ;局部变量;局部变量DATA ENDSDATA ENDSCODE SEGMENT CODE SEGMENT SUBM PROC FARSUBM PROC F

15、AR 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 DS,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 A

16、X POP DS POP DS RET RETSUBM ENDPSUBM ENDPCODE ENDSCODE ENDS END END 返回3.3.使用寄存器或堆栈实现过程通信使用寄存器或堆栈实现过程通信 在在模模块块化化程程序序设设计计中中,也也可可以以使使用用寄寄存存器器或或堆堆栈栈传传递递参参数数或或参参数数地地址址,从从而而实实现现过过程程通通信信。例例如如,通通过过AXAX、DXDX寄寄存存器器把把PRICEPRICE和和QTYQTY的的值传递给子程序实现过程通信。值传递给子程序实现过程通信。EXTRN EXTRN SUBM:FARSUBM:FARPUBLIC PUBLIC TOTA

17、LTOTALdata data segmentsegmentPRICE PRICE DW 60DW 60QTY QTY DW 80DW 80TOTAL TOTAL DD?DD?data data endsends MOVMOV AX AX,PRICEPRICE MOVMOV DX DX,QTYQTY CALL FAR PTR SUBMCALL FAR PTR SUBM end mainend main可以把程序可以把程序8.1b8.1b改为:改为:EXTRN TOTAL:DWORDEXTRN TOTAL:DWORDPUBLIC SUBMPUBLIC SUBM MUL MUL DXDX MOV

18、word ptr TOTAL,AX MOV word ptr TOTAL,AX MOV word ptr TOTAL+2,DX MOV word ptr TOTAL+2,DX END END8.1.2 8.1.2 模块连接模块连接一一个个程程序序可可以以由由若若干干个个模模块块组组成成,一一个个模模块块又又可可以以包包含含多多个个段段,这这些些模模块块经经过过分分别别调调试试后后,最最终终要要组组装装到到一一起起,形形成成一一个个大大系系统。统。一、多模块程序设计上机步骤一、多模块程序设计上机步骤以以以以程程程程序序序序8.18.18.18.1的的的的PRICEM.ASMPRICEM.ASMP

19、RICEM.ASMPRICEM.ASM和和和和PRICES.ASMPRICES.ASMPRICES.ASMPRICES.ASM两两两两个个个个独独独独立立立立模模模模块块块块为为为为例,讨论多模块程序设计上机步骤。例,讨论多模块程序设计上机步骤。例,讨论多模块程序设计上机步骤。例,讨论多模块程序设计上机步骤。对各模块分别处理以保证其功能的正确性对各模块分别处理以保证其功能的正确性对各模块分别处理以保证其功能的正确性对各模块分别处理以保证其功能的正确性 构造主模块构造主模块 例如把第例如把第例如把第例如把第步所得到的步所得到的步所得到的步所得到的PRICES.ASMPRICES.ASMPRICE

20、S.ASMPRICES.ASM修改成主模块形式。修改成主模块形式。修改成主模块形式。修改成主模块形式。键入命令:键入命令:键入命令:键入命令:edit prices.asmedit prices.asmedit prices.asmedit prices.asm 如程序如程序如程序如程序8.1a8.1a8.1a8.1a所示。所示。所示。所示。构造子模块构造子模块 例如把第例如把第例如把第例如把第步所得到的步所得到的步所得到的步所得到的PRICES.ASMPRICES.ASMPRICES.ASMPRICES.ASM修改成子程序的形式。修改成子程序的形式。修改成子程序的形式。修改成子程序的形式。键

21、入命令:键入命令:键入命令:键入命令:edit prices.asmedit prices.asmedit prices.asmedit prices.asm 如程序如程序如程序如程序8.1b8.1b8.1b8.1b所示。所示。所示。所示。对所有模块分别汇编,生成各自的对所有模块分别汇编,生成各自的.obj.obj文件文件键入命令:键入命令:masm pricem masm pricem 生成生成pricem.objpricem.obj等文件等文件键入命令:键入命令:masm prices masm prices 生成生成prices.objprices.obj等文件等文件若若汇汇编编过过程程

22、出出现现错错误误,应应修修改改源源程程序序,直到汇编通过。直到汇编通过。连接与本系统相关的所有连接与本系统相关的所有.obj.obj文件文件键入命令:键入命令:link pricem+prices,price;link pricem+prices,price;于是生成了于是生成了price.exeprice.exe文件。文件。调试及运行程序调试及运行程序调试及运行程序调试及运行程序用用DEBUGDEBUG调调试试price.exeprice.exe文文件件及及运运行行的的过过程同第程同第4 4章。章。二、连接对程序设计的要求二、连接对程序设计的要求段定义伪指令的完整格式:段定义伪指令的完整格式

23、:段名段名 SEGMENT SEGMENT 定位类型定位类型组合类型组合类型类别类别 段名段名 ENDSENDS其中其中 中的内容是可选的,各项含义如下:中的内容是可选的,各项含义如下:1 1定位类型定位类型确定段的起始边界。确定段的起始边界。BYTEBYTE:字节边界,从任意地址开始。:字节边界,从任意地址开始。WORDWORD:字边界,从偶地址开始。:字边界,从偶地址开始。DWORDDWORD:双字边界,从可以被:双字边界,从可以被4 4整除的地址开始。整除的地址开始。PARAPARA(缺省值):节边界,从可以被(缺省值):节边界,从可以被1616整除的地整除的地 址开始。址开始。PAGE

24、PAGE:页边界,从可以被:页边界,从可以被256256整除的地址开始。整除的地址开始。2 2 2 2类别类别类别类别说明本段归于哪一类。说明本段归于哪一类。3 3组合类型组合类型说明段之间的关系。可以是:说明段之间的关系。可以是:缺省值缺省值 PUBLICPUBLIC STACK STACK COMMON COMMON AT AT 段基址表达式段基址表达式例:例:VIDEOVIDEORAM SEGMENT AT 0B800HRAM SEGMENT AT 0B800H三、模块连接举例三、模块连接举例1 1使用缺省的组合类型和定位类型使用缺省的组合类型和定位类型程序程序程序程序8.38.38.3

25、8.3主模块主模块主模块主模块PRICEM.ASMPRICEM.ASMPRICEM.ASMPRICEM.ASMEXTRN 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 DW 60PRICE DW 60QTY DW 80

26、QTY 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 SUBM MOV AX,4C00H MOV AX,4C00

27、H INT 21H INT 21Hmain endpmain endpcode endscode ends end main end main子模块子模块PRICES.ASMPRICES.ASMEXTRN 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 SEGMEN

28、TCODE 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 TOTAL,AX

29、 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程序程序8.38.3连接后生成的连接后生成的.MAP.MAP文件文件主、子模块的code segmentcode segment效果效果 StartStop

30、LengthNameClass00000H0003FH00040HSTACKSGSTK00040H00047H00008HDATA00050H0005EH0000FHCODE00060H00072H00013HCODEProgramentrypointat0005:0000主、子模块的CODE段均无任何可选项的.MAP文件2 2使用使用PUBLICPUBLIC组合类型组合类型若若把把程程序序8.38.3两两个个模模块块的的代代码码段段均均定定义义为为PUBLICPUBLIC组合类型且同段名同类别名,例如组合类型且同段名同类别名,例如:CODE SEGMENT PARA PUBLIC CODEC

31、ODE SEGMENT PARA PUBLIC CODE 则则连连接接后后生生成成的的.MAP.MAP文文件件中中只只有有一一个个代代码码段段CODECODE,其其总总长长度度为为00023H00023H,它它是是主主、子子模模块块代代码码段段长长度的总和。度的总和。StartStopLengthNameClass00000H0003FH00040HSTACKSGSTK00040H00047H00008HDATA00050H00072H00023HCODECODEProgramentrypointat0005:00003 3堆栈段使用堆栈段使用STACKSTACK组合类型组合类型在在程程序序8

32、.38.3的的主主、子子模模块块中中均均增增加加同同段段名名同同类类别名且具有别名且具有STACKSTACK组合类型的段,例如:组合类型的段,例如:STACKSG SEGMENT STACK STKSTACKSG SEGMENT STACK STK DW 32 DUP(S)DW 32 DUP(S)STACKSG ENDSSTACKSG ENDS则则连连接接后后生生成成的的堆堆栈栈段段长长度度为为两两个个模模块块中中的的栈栈长度之和长度之和80H80H,.MAP.MAP文件如下:文件如下:StartStopLengthNameClass00000H0007FH00080HSTACKSGSTK00

33、080H00087H00008HDATA00090H0009EH0000FHCODE000A0H000B2H00013HCODEProgramentrypointat0009:00004 4数据段使用数据段使用COMMONCOMMON组合类型组合类型COMMONCOMMON组组合合类类型型的的程程序序示示例例见见程程序序8.28.2,其其.MAP.MAP文文件件如如下下所所示示。其其数数据据段段的的长长度度为为0BH0BH(具具有有COMMONCOMMON组合类型的最长段),产生了段的覆盖。组合类型的最长段),产生了段的覆盖。StartStopLengthNameClass00000H0003

34、FH00040HSTACKSGSTK00040H0004AH0000BHDATA00050H0005EH0000FHCODE00060H00079H0001AHCODEProgramentrypointat0005:0000设设新新局局部部数数据据段段名名为为NEW_DATANEW_DATA,原原局局部部数数据据段名为段名为OLD_DATAOLD_DATAASSUME DS:NEW_DATAASSUME DS:NEW_DATAPUSH DS PUSH DS ;保存原局部数据段基址保存原局部数据段基址MOV AXMOV AX,NEW_DATA NEW_DATA;建立新局部数据段寻址建立新局部数据

35、段寻址MOV DSMOV DS,AXAX ;访问访问NEW_DATANEW_DATA段的数据段的数据POP DSPOP DS;恢复原局部数据段基址恢复原局部数据段基址8.1.3 8.1.3 模块组织建议模块组织建议当当全全部部堆堆栈栈数数据据的的总总长长度度不不超超过过段段长长限限定定时时,通通常常使使用用STACKSTACK组组合合类类型型且且同同段段名名同同类类别别名名定定义义所所有有堆堆栈栈段段,使使其其连连接接后后生生成成一一个个堆堆栈栈段段,这这样样使使用用起起来来十十分分方方便便。但但在在必必须须使使用用多多个个独独立立堆堆栈栈段段的的场场合合,需需要要注注意意堆堆栈栈的的切切换换

36、,即即堆堆栈栈段段寄寄存存器器SSSS和和堆堆栈栈指指针针SPSP的的保保存存与与恢恢复复,此此时需要用内存变量保存原值,如程序时需要用内存变量保存原值,如程序8.48.4所示。所示。程序程序8.48.4EXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDEXTRN PRICE:WORD,QTY:WORD,TOTAL:DWORDPUBLIC SUBMPUBLIC SUBMSTACKSG SEGMENTSTACKSG SEGMENT DW 16 DUP(a)DW 16 DUP(a)TOP LABEL WORDTOP LABEL WORDSTACKSG ENDSSTACKSG

37、 ENDSCODE SEGMENTCODE SEGMENTSUBM PROC FARSUBM PROC FAR ASSUME CS:CODE,SS:STACKSG ASSUME CS:CODE,SS:STACKSG mov cs:sav_ss,ssmov 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 top sti sti push AX push AX PUSH DX

38、 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 clicli mov ss,cs:sav_ss mov ss,cs:sav_ss mov sp,cs:sav_sp mov sp,cs:sav_sp sti sti RET RETsav_ss dw?sav_ss dw?sav_sp dw?sav_sp dw

39、?SUBM ENDPSUBM ENDPCODE ENDSCODE ENDS END END设程序设程序8.38.3的主模块的主模块PRICEMPRICEM有以下堆栈段定义,把有以下堆栈段定义,把程序程序8.48.4与程序与程序8.38.3连接,则生成图连接,则生成图8-68-6的的.MAP.MAP文件。文件。stacksg segment stack stacksg segment stack stkstk dw 32 dup(dw 32 dup(s s)stacksg endsstacksg ends StartStopLengthNameClass00000H0003FH00040HSTA

40、CKSGSTK00040H00047H00008HDATA00050H0005EH0000FHCODE00060H0007FH00020HSTACKSG00080H000B6H00037HCODEProgramentrypointat0005:0000图图8-6 8-6 含有多个堆栈段的含有多个堆栈段的.MAP.MAP文件文件8.1.4 8.1.4 模块程序设计上机步骤模块程序设计上机步骤 各个模块独立调试以确保功能的正确性。各个模块独立调试以确保功能的正确性。构造主模块。构造主模块。构造子模块。构造子模块。对第对第和第和第步得到的所有模块分别汇编,生步得到的所有模块分别汇编,生成各自的成各自

41、的.obj.obj等文件。等文件。把第把第步产生的所有步产生的所有.obj.obj文件连接到一起。文件连接到一起。运行及调试程序。运行及调试程序。8.1.5 8.1.5 综合举例综合举例 略(见书略(见书254254页)。页)。8.2.1 C8.2.1 C语言程序中直接嵌入汇编代码语言程序中直接嵌入汇编代码 1.内嵌汇编语句格式内嵌汇编语句格式 格式:格式:asm asm 内嵌汇编语句的操作数可以是:内嵌汇编语句的操作数可以是:l lC C程序中的符号程序中的符号 l l汇编指令操作数可以是结构数据汇编指令操作数可以是结构数据 8.2 8.2 汇编语言程序与高级语言程序的连接汇编语言程序与高级

42、语言程序的连接 2.转移指令的执行转移指令的执行内嵌汇编指令可以使用转移指令和内嵌汇编指令可以使用转移指令和LOOP LOOP 循循环指令,但是它们只能在函数体内有效,不允环指令,但是它们只能在函数体内有效,不允许进行段间转移。由于许进行段间转移。由于asm asm 语句中不能给出标语句中不能给出标号,因而转移指令只能使用号,因而转移指令只能使用C C语言程序中语言程序中GOTOGOTO语句使用的标号。语句使用的标号。3.3.直接嵌入汇编代码的直接嵌入汇编代码的C C语言程序示例语言程序示例程序程序8.78.7 main()main()asm mov ah,2;asm mov ah,2;asm

43、 mov dl,*;asm mov dl,*;asm int 21h;asm int 21h;printf(n printf(n The The&above above is is printed printed in in inline Assembly statement);inline Assembly statement);对对于于TURBO TURBO C C,假假设设源源程程序序、LIBLIB库库均均在在当当前前TCTC子目录下,相应的编译连接命令为:子目录下,相应的编译连接命令为:TCC TCC B B L:LIB EXAMPLE.CL:LIB EXAMPLE.C1.1.编写汇编

44、子程序注意事项编写汇编子程序注意事项 (1)(1)变量和函数的使用变量和函数的使用 (2)(2)参数传递参数传递 (3)(3)汇编语言子程序的返回值汇编语言子程序的返回值 (4)(4)汇编语言子程序中寄存器的使用汇编语言子程序中寄存器的使用 8.2.2 8.2.2 在在C C程序中直接调用汇编子程序程序中直接调用汇编子程序 2.2.使用使用C C和汇编语言混合编程的编译及连接和汇编语言混合编程的编译及连接 有两种方法可以采用:有两种方法可以采用:(1)(1)(1)(1)以工程(以工程(以工程(以工程(PROJECTPROJECTPROJECTPROJECT)的方式进行)的方式进行)的方式进行)

45、的方式进行在在在在DOSDOSDOSDOS下下下下,用用用用汇汇汇汇编编编编程程程程序序序序将将将将汇汇汇汇编编编编语语语语言言言言子子子子程程程程序序序序汇汇汇汇编生成相应的目标文件编生成相应的目标文件编生成相应的目标文件编生成相应的目标文件.OBJ.OBJ.OBJ.OBJ。在在在在工工工工程程程程文文文文件件件件(设设设设文文文文件件件件名名名名为为为为X.PRJX.PRJX.PRJX.PRJ)中中中中加加加加入入入入将将将将要要要要编编编编译译译译连连连连接接接接的的的的C C C C语语语语言言言言程程程程序序序序及及及及其其其其调调调调用用用用的的的的汇汇汇汇编编编编子子子子程程程程

46、序序序序目目目目标文件名。标文件名。标文件名。标文件名。对对对对工工工工程程程程文文文文件件件件进进进进行行行行编编编编译译译译连连连连接接接接,生生生生成成成成一一一一个个个个.EXE.EXE.EXE.EXE可可可可执行文件。执行文件。执行文件。执行文件。使用这种方法要注意使用这种方法要注意使用这种方法要注意使用这种方法要注意C C C C语言对大小写敏感的问语言对大小写敏感的问语言对大小写敏感的问语言对大小写敏感的问题,最好关闭大小写敏感开关。题,最好关闭大小写敏感开关。题,最好关闭大小写敏感开关。题,最好关闭大小写敏感开关。(2)(2)(2)(2)采用命令行的方式进行编译连接采用命令行的

47、方式进行编译连接采用命令行的方式进行编译连接采用命令行的方式进行编译连接3.3.混合编程实例混合编程实例 具体实例见教材例具体实例见教材例8.88.8(p266p266)。)。8.2.3 8.2.3 汇编语言程序调用汇编语言程序调用C C函数函数 在汇编源程序中,对所使用的在汇编源程序中,对所使用的在汇编源程序中,对所使用的在汇编源程序中,对所使用的C C C C函数和变量在其名字函数和变量在其名字函数和变量在其名字函数和变量在其名字均应加下划线。均应加下划线。均应加下划线。均应加下划线。对调用的对调用的对调用的对调用的C C C C函数用函数用函数用函数用EXTRNEXTRNEXTRNEXT

48、RN伪指令进行说明。伪指令进行说明。伪指令进行说明。伪指令进行说明。对对对对汇汇汇汇编编编编语语语语言言言言中中中中使使使使用用用用的的的的C C C C函函函函数数数数变变变变量量量量用用用用“EXTRN EXTRN EXTRN EXTRN 变变变变量量量量名名名名:sizesizesizesize”说说说说明明明明,其其其其中中中中sizesizesizesize视数据类型而定,例如视数据类型而定,例如视数据类型而定,例如视数据类型而定,例如intintintint型为型为型为型为2 2 2 2。参数传递有两种:一种是在参数传递有两种:一种是在参数传递有两种:一种是在参数传递有两种:一种是

49、在C C C C程序中定义变量,在汇编源程序中把程序中定义变量,在汇编源程序中把程序中定义变量,在汇编源程序中把程序中定义变量,在汇编源程序中把它说明成它说明成它说明成它说明成EXTRNEXTRNEXTRNEXTRN型;另一种是采用堆栈传递,这时要注意参数压入堆型;另一种是采用堆栈传递,这时要注意参数压入堆型;另一种是采用堆栈传递,这时要注意参数压入堆型;另一种是采用堆栈传递,这时要注意参数压入堆栈的顺序。栈的顺序。栈的顺序。栈的顺序。8.3.1 DOS8.3.1 DOS的内存分配与释放功能简介的内存分配与释放功能简介 8.3 8.3 使用使用DOS EXECDOS EXEC功能执行程序功能执

50、行程序 1 1分配内存块功能分配内存块功能48H48H调用参数:调用参数:AHAHAHAH48H48H48H48H BXBXBXBX以节(以节(以节(以节(16161616字节)为单位的附加内存字节)为单位的附加内存字节)为单位的附加内存字节)为单位的附加内存 块的大小块的大小块的大小块的大小返回参数:返回参数:调用成功调用成功调用成功调用成功 CFCFCFCF0 0 0 0,AXAXAXAX分配的内存块的段地址;分配的内存块的段地址;分配的内存块的段地址;分配的内存块的段地址;调用失败调用失败调用失败调用失败 CFCFCFCF1 1 1 1,AXAXAXAX错误码,错误码,错误码,错误码,B

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服