第八章汇编语言高级编程技巧PPT课件_第1页
第八章汇编语言高级编程技巧PPT课件_第2页
第八章汇编语言高级编程技巧PPT课件_第3页
第八章汇编语言高级编程技巧PPT课件_第4页
第八章汇编语言高级编程技巧PPT课件_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

第八章汇编语言高级编程技巧,8.1模块化程序设计8.2汇编语言程序与高级语言程序的连接8.3使用DOSEXEC功能执行程序8.4TSR程序设计,软件工程开发包括以下步骤:,系统分析;系统设计;细化各模块的功能、确定模块间的关系及通信方法;完成各模块的程序编码及模块调试;连接多个模块组成大系统;调试大系统;系统维护。,8.1模块化程序设计,8.1.1模块通信,1.外部引用与全局符号说明例实现PRICEQTYTOTAL的功能。要求由两个模块实现,其中主模块给出数据,子模块实现两数相乘。,主模块PRICEM.ASM,DATASEGMENTPRICEDW60QTYDW80TOTALDD?DATAENDS,CODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARMOVAX,DATAMOVDS,AXCALLFARPTRSUBMMOVAX,4C00HINT21HMAINENDPCODEENDSENDMAIN,子模块PRICES.ASM,CODESEGMENTSUBMPROCFARASSUMECS:CODEMOVAX,PRICEMULQTYMOVWORDPTRTOTAL,AXMOVWORDPTRTOTAL+2,DXRETSUBMENDPCODEENDSEND,(1)外部引用伪指令EXTRN,格式:EXTRN名字:类型,.注意:EXTRN伪指令应该出现在引用该名字之前,一般放在程序的开头。(2)全局符号说明伪指令PUBLIC格式:PUBLIC名字,.例8.1实现PRICEQTYTOTAL的功能。其中数据定义和乘法实现分别在两个模块中。程序见程序8.1。,程序8.1a主模块PRICEM.ASM,EXTRNSUBM:FARPUBLICPRICE,QTY,TOTALstacksgsegmentstackstkdw32dup(s)stacksgendsdatasegmentPRICEDW60QTYDW80TOTALDD?dataends,codesegmentmainprocfarassumecs:code,ds:datamovax,datamovds,axCALLFARPTRSUBMMOVAX,4C00HINT21Hmainendpcodeendsendmain,返回,程序8.1b子模块PRICES.ASM,EXTRNPRICE:WORD,QTY:WORD,TOTAL:DWORDPUBLICSUBMCODESEGMENTSUBMPROCFARASSUMECS:CODEMOVAX,PRICEMULQTYMOVwordptrTOTAL,AXMOVwordptrTOTAL+2,DXRETSUBMENDPCODEENDSEND,返回,2.使用公用数据段实现过程通信,COMMON功能:告诉连接程序把多个同名数据段在连接时重叠形成一个段,产生段覆盖。说明:具有COMMON组合类型的最长段决定了公共段的长度,重叠部分的内容取决于连接时最后一个公共段的内容。,例8.2实现例8.1的功能,但使用公用数据段实现过程通信,见程序8.2。,程序8.2a(主程序):,EXTRNSUBM:FARSTACKSGSEGMENTSTACKSTKDW32DUP(S)STACKSGENDSDATASEGMENTCOMMONPRICEDW60QTYDW80TOTALDD?DATAENDS,CODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATAMOVAX,DATAMOVDS,AXCALLFARPTRSUBMMOVAX,4C00HINT21HMAINENDPCODEENDSENDMAIN,程序8.2b(子程序),PUBLICSUBMDATASEGMENTCOMMONPRICEDW80QTYDW60TOTALDD?REMDB123;局部变量DATAENDS,CODESEGMENTSUBMPROCFARASSUMECS:CODE,DS:DATAPUSHDSPUSHAXPUSHDXMOVAX,DATAMOVDS,AX,MOVAX,PRICEMULQTYMOVWORDPTRTOTAL,AXMOVWORDPTRTOTAL+2,DXPOPDXPOPAXPOPDSRETSUBMENDPCODEENDSEND,返回,3.使用寄存器或堆栈实现过程通信,在模块化程序设计中,也可以使用寄存器或堆栈传递参数或参数地址,从而实现过程通信。例如,通过AX、DX寄存器把PRICE和QTY的值传递给子程序实现过程通信。,EXTRNSUBM:FARPUBLICTOTALdatasegmentPRICEDW60QTYDW80TOTALDD?dataendsMOVAX,PRICEMOVDX,QTYCALLFARPTRSUBMendmain,可以把程序8.1b改为:,EXTRNTOTAL:DWORDPUBLICSUBMMULDXMOVwordptrTOTAL,AXMOVwordptrTOTAL+2,DXEND,8.1.2模块连接,一个程序可以由若干个模块组成,一个模块又可以包含多个段,这些模块经过分别调试后,最终要组装到一起,形成一个大系统。,一、多模块程序设计上机步骤,以程序8.1的PRICEM.ASM和PRICES.ASM两个独立模块为例,讨论多模块程序设计上机步骤。对各模块分别处理以保证其功能的正确性构造主模块例如把第步所得到的PRICES.ASM修改成主模块形式。键入命令:editprices.asm如程序8.1a所示。构造子模块例如把第步所得到的PRICES.ASM修改成子程序的形式。键入命令:editprices.asm如程序8.1b所示。,对所有模块分别汇编,生成各自的.obj文件,键入命令:masmpricem生成pricem.obj等文件键入命令:masmprices生成prices.obj等文件若汇编过程出现错误,应修改源程序,直到汇编通过。,连接与本系统相关的所有.obj文件,键入命令:linkpricem+prices,price;于是生成了price.exe文件。调试及运行程序用DEBUG调试price.exe文件及运行的过程同第4章。,二、连接对程序设计的要求,段定义伪指令的完整格式:段名SEGMENT定位类型组合类型类别段名ENDS其中中的内容是可选的,各项含义如下:,1定位类型,确定段的起始边界。BYTE:字节边界,从任意地址开始。WORD:字边界,从偶地址开始。DWORD:双字边界,从可以被4整除的地址开始。PARA(缺省值):节边界,从可以被16整除的地址开始。PAGE:页边界,从可以被256整除的地址开始。2类别说明本段归于哪一类。,3组合类型,说明段之间的关系。可以是:缺省值PUBLICSTACKCOMMONAT段基址表达式例:VIDEORAMSEGMENTAT0B800H,三、模块连接举例,1使用缺省的组合类型和定位类型程序8.3主模块PRICEM.ASMEXTRNSUBM:FARPUBLICPRICE,QTY,TOTALdatasegmentPRICEDW60QTYDW80TOTALDD?dataends,codesegmentmainprocfarassumecs:code,ds:datamovax,datamovds,axCALLFARPTRSUBMMOVAX,4C00HINT21Hmainendpcodeendsendmain,子模块PRICES.ASM,EXTRNPRICE:WORD,QTY:WORD,TOTAL:DWORDPUBLICSUBMCODESEGMENTSUBMPROCFARASSUMECS:CODE.MOVAX,PRICEMULQTYMOVwordptrTOTAL,AXMOVwordptrTOTAL+2,DX.RETSUBMENDPCODEENDSEND,程序8.3连接后生成的.MAP文件,主、子模块的codesegment效果,2使用PUBLIC组合类型,若把程序8.3两个模块的代码段均定义为PUBLIC组合类型且同段名同类别名,例如:CODESEGMENTPARAPUBLICCODE则连接后生成的.MAP文件中只有一个代码段CODE,其总长度为00023H,它是主、子模块代码段长度的总和。,StartStopLengthNameClass00000H0003FH00040HSTACKSGSTK00040H00047H00008HDATA00050H00072H00023HCODECODEProgramentrypointat0005:0000,3堆栈段使用STACK组合类型,在程序8.3的主、子模块中均增加同段名同类别名且具有STACK组合类型的段,例如:STACKSGSEGMENTSTACKSTKDW32DUP(S)STACKSGENDS则连接后生成的堆栈段长度为两个模块中的栈长度之和80H,.MAP文件如下:,StartStopLengthNameClass00000H0007FH00080HSTACKSGSTK00080H00087H00008HDATA00090H0009EH0000FHCODE000A0H000B2H00013HCODEProgramentrypointat0009:0000,4数据段使用COMMON组合类型,COMMON组合类型的程序示例见程序8.2,其.MAP文件如下所示。其数据段的长度为0BH(具有COMMON组合类型的最长段),产生了段的覆盖。,StartStopLengthNameClass00000H0003FH00040HSTACKSGSTK00040H0004AH0000BHDATA00050H0005EH0000FHCODE00060H00079H0001AHCODEProgramentrypointat0005:0000,设新局部数据段名为NEW_DATA,原局部数据段名为OLD_DATAASSUMEDS:NEW_DATAPUSHDS;保存原局部数据段基址MOVAX,NEW_DATA;建立新局部数据段寻址MOVDS,AX;访问NEW_DATA段的数据POPDS;恢复原局部数据段基址,8.1.3模块组织建议,当全部堆栈数据的总长度不超过段长限定时,通常使用STACK组合类型且同段名同类别名定义所有堆栈段,使其连接后生成一个堆栈段,这样使用起来十分方便。但在必须使用多个独立堆栈段的场合,需要注意堆栈的切换,即堆栈段寄存器SS和堆栈指针SP的保存与恢复,此时需要用内存变量保存原值,如程序8.4所示。,程序8.4,EXTRNPRICE:WORD,QTY:WORD,TOTAL:DWORDPUBLICSUBMSTACKSGSEGMENTDW16DUP(a)TOPLABELWORDSTACKSGENDSCODESEGMENTSUBMPROCFARASSUMECS:CODE,SS:STACKSG,movcs:sav_ss,ssmovcs:sav_sp,spclimovax,stacksgmovss,axmovsp,offsettopstipushAXPUSHDXMOVAX,PRICEMULQTYMOVWORDPTRTOTAL,AXMOVWORDPTRTOTAL+2,DXPOPDXPOPAX,climovss,cs:sav_ssmovsp,cs:sav_spstiRETsav_ssdw?sav_spdw?SUBMENDPCODEENDSEND,设程序8.3的主模块PRICEM有以下堆栈段定义,把程序8.4与程序8.3连接,则生成图8-6的.MAP文件。stacksgsegmentstackstkdw32dup(s)stacksgends,8.1.4模块程序设计上机步骤,各个模块独立调试以确保功能的正确性。构造主模块。构造子模块。对第和第步得到的所有模块分别汇编,生成各自的.obj等文件。把第步产生的所有.obj文件连接到一起。运行及调试程序。,8.1.5综合举例,略(见书254页)。,8.2.1C语言程序中直接嵌入汇编代码,1.内嵌汇编语句格式格式:asm内嵌汇编语句的操作数可以是:C程序中的符号汇编指令操作数可以是结构数据,8.2汇编语言程序与高级语言程序的连接,2.转移指令的执行内嵌汇编指令可以使用转移指令和LOOP循环指令,但是它们只能在函数体内有效,不允许进行段间转移。由于asm语句中不能给出标号,因而转移指令只能使用C语言程序中GOTO语句使用的标号。,3.直接嵌入汇编代码的C语言程序示例程序8.7main()asmmovah,2;asmmovdl,*;asmint21h;printf(nThe,对于TURBOC,假设源程序、LIB库均在当前TC子目录下,相应的编译连接命令为:TCCBL:LIBEXAMPLE.C,1.编写汇编子程序注意事项(1)变量和函数的使用(2)参数传递(3)汇编语言子程序的返回值(4)汇编语言子程序中寄存器的使用,8.2.2在C程序中直接调用汇编子程序,2.使用C和汇编语言混合编程的编译及连接有两种方法可以采用:,(1)以工程(PROJECT)的方式进行在DOS下,用汇编程序将汇编语言子程序汇编生成相应的目标文件.OBJ。在工程文件(设文件名为X.PRJ)中加入将要编译连接的C语言程序及其调用的汇编子程序目标文件名。对工程文件进行编译连接,生成一个.EXE可执行文件。使用这种方法要注意C语言对大小写敏感的问题,最好关闭大小写敏感开关。(2)采用命令行的方式进行编译连接,3.混合编程实例具体实例见教材例8.8(p266)。,8.2.3汇编语言程序调用C函数,在汇编源程序中,对所使用的C函数和变量在其名字均应加下划线。对调用的C函数用EXTRN伪指令进行说明。对汇编语言中使用的C函数变量用“EXTRN变量名:size”说明,其中size视数据类型而定,例如int型为2。参数传递有两种:一种是在C程序中定义变量,在汇编源程序中把它说明成EXTRN型;另一种是采用堆栈传递,这时要注意参数压入堆栈的顺序。,8.3.1DOS的内存分配与释放功能简介,8.3使用DOSEXEC功能执行程序,1分配内存块功能48H调用参数:AH48HBX以节(16字节)为单位的附加内存块的大小返回参数:调用成功CF0,AX分配的内存块的段地址;调用失败CF1,AX错误码,BX最大可用块的大小。,2释放已分配的内存块功能49H调用参数:AH49HES待释放内存块的段地址返回参数:调用成功CF0,并把0存于该内存块的第二和第三字节,以表示该块未使用;调用失败CF1,AX错误码。,3修改已分配的内存块功能4AH调用参数:AH4AHBX以节为单位新申请内存块的大小ES待修改内存块的段地址返回参数:调用成功CF0;调用失败CF1,AX错误码,BX最大可用内存的大小。,8.3.2使用DOSEXEC功能加载并执行程序,使用DOS的EXEC功能可以实现加载并执行程序等功能。用EXEC功能执行或加载另一个程序的程序称为父进程,由它执行或加载的另一个程序称为子进程。子进程被装入内存或执行时,父进程一直存于内存中。父进程可以通过多种方法把信息传递给子进程。,1.EXEC功能简介DOS的EXEC功能可以通过调用INT21H的4BH功能实现,4BH功能的调用方法是:调用参数:AH=4BHAL=功能类型,其中:AL=00H,加载并

温馨提示

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

评论

0/150

提交评论