【4-3】宏汇编语言程序设计 (NXPowerLite).ppt

上传人:hyn****60 文档编号:70970327 上传时间:2023-01-31 格式:PPT 页数:41 大小:266.50KB
返回 下载 相关 举报
【4-3】宏汇编语言程序设计 (NXPowerLite).ppt_第1页
第1页 / 共41页
【4-3】宏汇编语言程序设计 (NXPowerLite).ppt_第2页
第2页 / 共41页
点击查看更多>>
资源描述

《【4-3】宏汇编语言程序设计 (NXPowerLite).ppt》由会员分享,可在线阅读,更多相关《【4-3】宏汇编语言程序设计 (NXPowerLite).ppt(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、4-5 程序设计方法和上机调试内容提要程序设计方法顺序结构分支结构循环结构子程序结构汇编语言上机调试过程宏汇编和条件汇编【子程序结构】4-5 程序设计方法四、子程序结构1子程序使用子程序将多次使用的程序段写成一个相对独立的程序段。子程序结构的定义使用过程定义语句PROCENDP属性调用程序和过程在同一代码段中,则用NEAR属性调用程序和过程不在同一代码段中,使用FAR属性主过程定义为FAR属性,看作DOS调用的一个子过程子程序说明 功能描述:名称,功能及性能 寄存器和存储单元 入口参数,出口参数 调用其它子程序的名称例:有一个子程序说明如下:;名称:BCD2BIN;功能:将一个字节的BCD码转

2、换成二进制数;所用寄存器:CX;入口参数:AL存放两位BCD码;出口参数:AL存放二进制数;调其它子程序:无子程序形式如下;4-5 程序设计方法【子程序结构】BCD2BINPROC NEAR(或FAR)PUSH CX;保存CXMOVCH,ALCH,0FHCL,4AL,CLCL,10CLAL,CHCX;存低8位 CH;高8位右移4位后乘10;高8位加低8位;恢复CXANDMOVSHRMOVMULADDPOPRETBCD2BINENDP4-5 程序设计方法【子程序结构】注意:保护调用程序的断点:由CALL指令本身完成。要注意堆栈的使用,防止弹出地址值错误。保护某些寄存器内容:在子程序开头,用一组P

3、USH指令,保护的寄存器原来(先进后出)。主程序与子程序相互之间参数的传递:参数传递的方法有3种:用寄存器传递参数:参数较少,速度较快。用存储器传递参数:参数较多,需事先在存储器中建立一个参数表。用堆栈传递参数:参数较多,多用在子程序嵌套与递归调用中。4-5 程序设计方法【子程序结构】例475:数据段定义两个数组,编程序实现数组段分别求和(不计溢出)。解:本例通过存储器来传递参数。相应程序如下:DATASEGMENT;定义数组1;定义数组2ARY1SUM1ARY2SUM2DW 100 DUP(?)DW?DW 100 DUP(?)DW?DATASTACKENDSSEGMENT STACKDW 5

4、0 DUP(?)EQU LENGTH SASATOPSTACK ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK4-5 程序设计方法【子程序结构】MAINPROC FARSTART:MOVMOVMOVMOVMOVAX,DATADS,AXAX,STACKSS,AXSP,TOP;数组1首地址,入口参数;数组1长度,入口参数;调用求和子程序;数组2首地址,入口参数;数组2长度,入口参数;调用求和子程序SI,ARY1CX,LENGTH ARY1SUMSI,ARY2CX,LENGTH ARY2SUMAH,4CH21HLEAMOVCALLLEAMOVCALLMO

5、VINTRETMAINENDP4-5 程序设计方法【子程序结构】SUMPROC NEAR;子程序;AX清0;加数组元素XORLP1:ADDINCINCAX,AXAX,WORD PTRSISISILOOP LP1WORD PTRSI,AX;数组和送入SUMMOVRETSUMENDP;子程序返回CODE EDNSENDSTART4-5 程序设计方法【子程序结构】例476 :通过堆栈传递参数,实现十进制数数组求和。要求主程序和过程不在同一个代码段中,要进行段间调用。相应程序如下:MDATASEGMENT;定义数组1;定义数组2ARY1SUM1ARY2SUM2DW 20 DUP(?)DW?DW 20

6、DUP(?)DW?MDATAMSTACKENDSSEGMENT STACKSBTOPDW 100 DUP(?)LABEL WORDMSTACKENDSMCODESEGMENT;主程序段ASSUME CS:MCODE,DS:MDATA,SS:MSTACKMAINSTART:PROCMOVFARAX,MSTACKMOVMOVSS,AXSP,OFFSET TOP4-5 程序设计方法【子程序结构】;初始化DS,SS,SP;PADD过程入口参数进栈PUSHMOVPUSHMOVMOVMOVPUSHDSAX,0AXAX,MDATADS,AXAX,OFFSET ARY1AXMOVPUSHCALLMOVPUSH

7、MOVPUSHCALLAX,SIZE ARY1AXFAR PTR PADDAX,OFFSET ARY2AXAX,SIZE ARY2AXFAR PTR PADDRETMAINENDPMCODE ENDS4-5 程序设计方法【子程序结构】SPIPCSSIZE1ARY1PCODESEGMENT;过程段ASSUME CS:PCODE,DS:MDATA,SS:MSTACKPADDPROCFARPUSHBX;寄存器保护PUSHPUSHMOVPUSHFMOVMOVMOVCXBPBP,SPCX,BP+10BX,BP+12AX,0NEXT:ADDAL,BX;数组相加DAAMOVMOVDL,ALAL,04-5 程

8、序设计方法【子程序结构】SPBP;数组长度CX;数组ARY起始地址BXARY113SIZE1PSWBPCXBXIPCSADCDAAMOVMOVINCLOOPAL,AHAH,ALAL,DLBXNEXT;送数组和SUMMOVPOPFPOPBX,AXBPCXBX4;返回作废参数PADDPCODEPOPPOPRETENDPENDSEND START4-5 程序设计方法【子程序结构】SPIPCSSIZE1ARY1该例用堆栈传递参数,堆栈中数据变化如图所示。总结:调用前通过堆栈传递两个参数:数组的偏移地址值,数组长度。进入过程时重新定义CS段:指向当前代码段PCODE。因为程序设计要求段间过程调用。过程返

9、回时:用返回指令RET 4,将通过堆栈传递的4个参数作废。4-5 程序设计方法【子程序结构】4-5 程序设计方法【子程序结构】(1)初始化SP(2)过程调用之前SPSIZE1ARY1(4)执行4个PUSH 指令后SPBPIPCSSIZE1ARY1PSWBPCXBX(5)执行4个POP 指令后(6)RET4 指令执行后 SPSPARY1(3)第一个CALL指令后SIZE1IPCSSPIPCSSIZE1ARY1堆栈的变化:初始化后,SP指向堆栈底,堆栈为空;主程序调用过程前,二个参数(数组偏移地址及数组长度)已入栈;执行CALL指令时,返回地址自动入栈;过程中:BX,CX,BP,标志寄存器入栈;继

10、续执行过程段PCODE程序,利用BP,在堆栈中位置BP12处获取数组偏移地址,在堆栈中位置BP10处获取数组长度。过程运行到RET 4之前,由POP指令将PSW,BP,CX及BX相继弹出。堆栈中还有4个字节的参数SIZE1和ARY1会影响下次过程调用参数的正确传递,用RET 4将此4个字节的参数弹出作废。4-5 程序设计方法【子程序结构】2子程序嵌套与递归调用:子程序嵌套:子程序本身又调用其它子程序。只要堆栈空间足够嵌套的层数不限。图给出了子程序嵌套示意图。递归调用:子程序调用子程序本身。4-5 程序设计方法【子程序结构】主程序CALL A子程序 ACALL BRET子程序 BRET例:己知两

11、个无符号数125及468,求它们的和并将和转换成十六进制数在屏幕上显示。DATADATASEGMENTPDW 125,368SUMDW?ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAINPROCFARDSAX,AXAXAX,DATADS,AXSI,OFFSET PPADDSTART PUSHXORPUSHMOVMOVMOVCALLRETMAINENDP4-5 程序设计方法【子程序结构】PADD;两数相加子程序PROCPUSHPUSHPUSHPUSHMOVADDMOVCALLPOPPOPPOPPOPNEARAXBXCXDXAX,SIAX,SI+2SUM,AXDI

12、SPDXCXBXAXRETPADDENDP4-5 程序设计方法【子程序结构】DISPL1:PROCMOVMOVMOVROLMOVANDADDCMPJLADDNEARBX,SUMCH,4CL,4BX,CLAL,BLAL,0FHAL,30HAL,3AHL2AL,07H;显示子程序;循环左移4次;化成ASCII码;AFL2:MOV DL,AL;显示一个字符(DL)AH,221HCHL1DISPCODEMOVINTDECJNZRETENDPENDSENDSTART4-5 程序设计方法【子程序结构】计算核心:N!子程序。注意入栈信息。N!子程序说明:;名称:FACT;功能:阶乘子程序;入口参数:ALN;

13、出口参效:DXN!;使用寄存器:CX4-5 程序设计方法例4-47 要求计算N!(N0)解:递归调用的应用:N!N*(N一1)*(N一2)*1N!1,N!N*(N一1)!,【子程序结构】N0N0ADATASEGMENTD1D2DB 4DW 2 DUP(?);N=4;存放运算结果ADATAASTACKENDSSEGMENT PARA STACK STACKSATOPDW 100 DUP(?)LABEL WORDASTACKACODEENDSSEGMENTASSUME CS:ACODE,DS:ADATA,SS:ASTACK4-5 程序设计方法具体程序如下:【子程序结构】MAINSTART:PROC

14、MOVMOVMOVPUSHMOVPUSHFARAX,ASTACKSS,AXSP,OFFSET TOPDSAX,0AX;初始化 DS,SS,SP;AL=NAX,ADATADS,AXDX,0AH,0BX,OFFSET D1AL,BXFACTBX+1,DXMOVMOVMOVMOVMOVMOVCALLMOVRETMAINENDP4-5 程序设计方法【子程序结构】FACT;N!子程序PROCCMPJNZAL,0CHNDL,1;N=0,N!=1MOVRETCHN:PUSHDECCALLPOPMULMOVAXALFACTAXDLDX,AX;N入栈;N1;递归调用FACT子程序;N弹出;N逐层返回相乘;送结果

15、到内存RETFACTACODEENDPENDSENDSTART4-5 程序设计方法【子程序结构】五、综合举例1代码转换:例:将十六位二进制数转换成4位压缩型BCD码算法:将AX中的二进制数先后除以1000、100和10,每次除法所得的商,即是BCD数的千位、百位和十位数,余数是个位数。子程序名:B2TOBCD输入参数:AX十六位二进制数输出参数:CF0,则AX4位压缩型BCD码;CF1,则要转换的数大于9999,AX不变。使用寄存器:CX:存放除数;DX:存放中间结果。4-5 程序设计方法【子程序结构】B2TOBCDPROCFAR;AX9999,则CF置1CMPJBESTCJMPAX,9999

16、TRANEXITTRAN:PUSHPUSHSUBMOVDIVCXDXDX,DXCX,1000CX;保存CX,DX;DX清0;计算千位数;AX(DX,AX)/CX的商;DX(DX,AX)/CX的余数XCHGMOVSHLMOVAX,DXCL,4DX,CLCL,100;商在DX中,余数在AX中;DX左移4位;计算百位数DIVCL4-5 程序设计方法【子程序结构】;百位数加到DL中,DX左移4位;余数保留在AL中;计算十位数;十位数加到DL中,DX左移4位;加个位数;结果送到AX中;恢复DX、CXADDMOVSHLXCHGSUBMOVDIVADDMOVSHLADDMOVPOPPOPDL,ALCL,4D

17、X,CLAL,AHAH,AHCL,10CLDL,ALCL,4DX,CLDL,AHAX,DXDXCXEXIT:B2TOBCDRETENDP4-5 程序设计方法【子程序结构】4-5 程序设计方法【子程序结构】例 将十进制数的ASCII字符串转换成有符号二进制数算法:首先检测字符串为正还是为负,若是为负,将标识符MINU置1,然后进行字符串转换,转换结束判别标识符MINU,若MINU是1,把AX中的数取补。字符串转换方法采用累加和(DX)乘10,然后读取下一个字符并转换成二进制数加到累加和中。子程序名:AS2BIN输入参数:DX=字符串偏移量;CX字符串字符个数输出参数:CF=0,则AX=二进制数;

18、CF=1,则字符串非法,AX0。使用寄存器:SI,BXAS2BINPROCPUSHPUSHPUSHFARCXDXSI;DX存到SI中;查符号MOVCMPJACLDMOVCMPJNEMOVJMPSI,DXCX,6ERRAL,SIAL,CHKMINU,1DECSCHK:DECS:CMPJNEDECINCAL,CLRDCXSICLRD:SUBDX,DX;DX清0,放结果4-5 程序设计方法【子程序结构】NEXT:CALLCHE;DX乘10ERRJCLODSB;读下一个字符到AL;字符不在09之间,出错;转换成二进制数;累加和超过65535出错;结果送入AX;负数求补CMPJBCMPJAANDADDJ

19、CLOOPMOVCMPJNENEGJMPAL,0ERRAL,9ERRAX,000FHDX,AXERRNEXTAX,DXMINU,1EXITAXEXITERR:STC;字符串为非法4-5 程序设计方法【子程序结构】MOVAX,0EXIT:SIDXCXPOPPOPPOPRETCHE;乘10子程序;DX乘2;DX乘2;相当于DX乘5;相当于DX乘10PROCPUSHMOVSHLSHLADDSHLPOPNEARBXBX,DXDX,1DX,1DX,BXDX,1BXRETCHEAS2BINENDPENDP4-5 程序设计方法【子程序结构】2算术运算:例4-80:完成两个多位十进制数相乘,并将结果送屏幕显示

20、。解:该程序包含三个过程:MMUL过程:两个多位十进制数相乘,并输出结果;MULS过程:两个一位十进制数相乘,结果以非压缩型BCD码形式保留在AX中;DOUT过程:累加部分积,采用过程嵌套调用的方法。4-5 程序设计方法【子程序结构】NAMEMULTDATASEGMENT;数据段XN1YDB 4,5,6,7EQU$XDB 1,2,3,4;定义被乘数;定义乘数N2EQU$YZPDB 30H DUP(?)DB 45671234=DB 30HDUP(?)DATAQENDSSTACK;堆栈段SEGMENT STACKDW 50H DUP(?)TOP LABEL WORDSTACKENDS4-5 程序设

21、计方法【子程序结构】CODESEGMENT;代码段ASSUME CS:CODE,DS:DATA,,SS:STACKMAINSTART:LOOP1:PROCMOVMOVMOVMOVMOVMOVMOVMOVMOVFARAX,DATADS,AXAX,STACKSS,AXSP,OFFSET TOPCL,4SI,0BX,N2CH,YBX1CALLINCDECJNZMMULSIBXLOOP14-5 程序设计方法【子程序结构】SI,DXBX,0ASC:DISP:MOVANDORMOVINCDECCMPJNLMOVMOVMOVINTMOVAL,ZSIAL,0FHAL,30HQBX,ALBXSISI,0ASCQ

22、BX,$AH,9DX,OFFSET P21HAH,4CH21H;主程序结束INTRETMAINENDP4-5 程序设计方法MOVMOV【子程序结构】MMUL;两个多位十进制数相乘,并输出结果PROCPUSHPUSHMOVNEARSIBXBX,N1LOOP2:AL,XBX1MULSDOUTSIBXLOOP2BXSIMOVCALLCALLINCDECJNZPOPPOPRETMMULENDP4-5 程序设计方法【子程序结构】MULS;两个一位十进制数相乘,结果以;非压缩型BCD码形式保留在AX中PROCPUSHMOVANDANDMULNEARBXBL,CHAL,0FHBL,0FHBLAAMBXPOP

23、RETMULSENDP4-5 程序设计方法【子程序结构】;累加部分积DOUTNEXT:PROCPUSHADDNEARSIAL,ZSIAAAZSI,ALAL,AHAH,AHSIDX,SIAL,0NEXTSIMOVMOVXORINCMOVCMPJNZPOPRETDOUTCODEENDPENDSENDSTART4-5 程序设计方法【子程序结构】4-6 汇编语言上机调试过程概述汇编语言源程序生成目标文件的步骤:建立:源程序。生成ASM文件。汇编:源文件。产生浮动的二进制目标文件(OBJ文件)及列表文件(LST文件)。链接:连接OBJ文件,形成可执行文件。链接程序有LINK.EXE。运行。4-6 汇编语

24、言上机调试过程调试:在汇编、链接、运行中出现问题,可用调试程序来跟踪检查,然后返回去修改源程序,重新汇编连接,直到运行正确。调试程序有DEBUG.EXE。可根据需要,可用EXE2BIN文件将EXE文件转换成C0M文件。编辑程序E.ASM文件汇编程序E.OBJ文件连接文件E.EXE文件ASMLINK4-7 宏汇编和条件汇编宏:源程序中一段独立的程序段。首先进行定义,然后可用宏指令语句多次调用。宏的应用:子程序段本身较短,而传递的参数较多的情况。条件汇编:根据给定的条件进行测试,以确定汇编或不汇编。第四章 宏汇编语言程序设计本章小结【重点】程序设计方法顺序结构分支结构循环结构子程序结构作业:P206:7、8、9、10、14、19、22

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁