




已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章,教学重点,在掌握基本的汇编语言程序设计方法之后,进一步学习如何提高编程效率的各种实用方法:高级语言特性宏结构模块化,5.1高级语言特性,MASM6.0引入高级语言的程序设计特性条件控制伪指令.IF.ELSE.ENDIF循环控制伪指令.WHILE.ENDW.REPEAT.UNTIL过程声明和过程调用伪指令.PROTO.INVOKE,要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐应该采用过程调用伪指令INVOKE使用INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明,5.1.3过程声明和过程调用伪指令,过程名PROC调用距离语言类型作用范围USES寄存器列表,参数:类型LOCAL参数表;汇编语言语句过程名ENDP,过程声明伪指令:用于事先声明过程的结构过程名PROTO调用距离语言类型,参数:类型过程调用伪指令INVOKE过程名,参数,.,如何调用,;汇编语言程序:lt503.asm.modelsmallchecksumdPROTOc,:word,:word;声明过程.stack.dataarraydb12h,25h,0f0h,0a3h,3db68h,71h,0cah,0ffh,90hcountequ$-array;数组的元素个数resultdb?;校验和.code.startupINVOKEchecksumd,count,offsetarray;调用过程movresult,al;保存校验和.exit0,例5.31/2,列表文件,checksumdPROCcUSESbxcx,countp:word,arrayp:wordmovbx,arrayp;BX数组的偏移地址movcx,countp;CX数组的元素个数xoral,alsumd:addal,bx;求和:ALAL+DS:BXincbxloopsumdretchecksumdendpend,例5.32/2,列表文件,;lt503.asm的列表文件(lt503.lst).INVOKEchecksumd,count,offsetarray*movax,wordptrOFFSETarray*pushax*movax,+000Ah*pushax*callchecksumd*addsp,04hmovresult,al.,例5.31/2,checksumdPROCcUSESbxcx,countp:word,arrayp:word*pushbp;起始代码*movbp,sp*pushbx;保护bx和cx*pushcxmovbx,arrayp;arrayp=BP+6movcx,countp;cuontp=BP+4.ret*popcx;结尾代码*popbx*popbp*ret0000hchecksumcendp,例5.32/2,5.2宏结构程序设计,宏汇编重复汇编条件汇编统称宏结构,宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法,宏具有宏名的一段汇编语句序列宏定义时书写宏指令这段汇编语句序列的缩写宏调用时书写宏展开宏指令处用这段宏代替的过程宏汇编时实现宏的参数功能强大,颇具特色配合宏,还有宏操作符和有关伪指令,5.2.1宏汇编,宏定义,宏名macro形参表宏定义体endm,mainbeginMACRO;定义名为mainbegin的宏,无参数movax,data;宏定义体movds,axENDM;宏定义结束mainendMACROretnum;带有形参retnummoval,retnum;宏定义中使用参数movah,4chint21hENDM,宏注释符,宏调用,宏名实参表,start:mainbegin;宏调用,建立DS内容dispmsgstring;宏调用,显示字符串mainend0;宏调用,返回DOSendstart宏调用的实质是在汇编过程中进行宏展开宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体取代源程序的宏指令,同时用位置匹配的实参对形参进行取代,宏展开,宏展开在汇编时,用宏定义体的代码序列替代宏指令的过程。,start:mainbegin;宏指令1movax,data;宏展开1movds,axmainend0;宏指令1moval,0;宏展开1movah,4ch1int21h,宏的参数,宏的参数使用非常灵活,宏定义时,可以无参数,例如5.4a的mainbegin可以带有一个参数,例如5.4a的mainend也可以具有多个参数;例如5.5a的shlext参数可以是常数、变量、存储单元、指令(操作码)或它们的一部分,也可以是表达式;例如5.5b的shift和shrot宏定义体可以是任何合法的汇编语句,既可以是硬指令序列,又可以是伪指令序列;例如5.6的dstring,;宏定义shlextmacroshloprand,shlnumpushcxmovcl,shlnumshlshloprand,clpopcxendm;宏指令shlextax,6;宏展开1pushcx1movcl,061shlax,cl1popcx,例5.5a,;统一4条移位指令的宏指令shiftmacrosoprand,snum,sopcodepushcxmovcl,snums;宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现等效于dbA1char=char+11dbchar;等效于dbB1char=char+1.1dbchar;等效于dbZ1char=char+1,按参数个数重复,FOR形参,实参表重复体ENDM,FORregad,pushregadENDM,1pushax1pushbx1pushcx1pushdx,按参数字符个数重复,FORC形参,字符串重复体ENDM,FORCregad,dcbapop满足,汇编分支语句体1分支语句体1ELSE;不满足,汇编分支语句体2分支语句体2ENDIF;条件汇编结束,pdatamacronumIFnumlt100;如果num100,则汇编如下语句dbnumdup(?)ELSE;否则,汇编如下语句db100dup(?)ENDIFendmpdata12;宏调用db12dup(?);宏汇编结果pdata102;宏调用db100dup(?);宏汇编结果,例5.10,宏结构的作用,宏汇编、重复汇编和条件汇编为源程序的编写提供了很多方便,灵活运用它们可以编写出非常良好的源程序来汇编系统中有些以圆点起始的伪指令(如.startup、.exit等)实际上是一种宏结构,dstringMACROstring;定义字符串db设置数据段地址movax,dssegmovds,axENDMdispmsgMACROmessagemovdx,offsetmessagemovah,09hint21hENDM,例题5.41/3,mainendMACROretnum;返回DOS,可不带参数ifbmovah,4ch;没有参数elsemovax,4c00h+(retnumAND0ffh);有参数endifint21hENDM,例题5.42/3,.modelsmall.stack256.datamsg1equthisbytedstringmsg2equthisbytedstring.codestart:mainbegindata;建立DS内容dispmsgmsg1;显示msg1字符串dispmsgmsg2;显示msg2字符串mainend;返回DOSendstart,例题5.43/3,2019/12/14,34,可编辑,将程序分段、采用子程序或宏结构都是进行模块化程序设计本节介绍开发大型程序时采用的方法:源程序文件的包含目标模块连接子程序库,5.3模块化程序设计,例题5.12将键盘输入的数据按升序输出,把源程序分放在几个文本文件中,在汇编时通过包含伪指令INCLUDE结合成一体INCLUDE文件名可将常用的子程序形成.ASM汇编语言源文件可将常用的宏定义存放在.MAC宏库文件中可将常量定义、声明语句组织在.INC包含文件中例5.12a宏库文件lt512a.mac主程序文件lt512a.asm子程序文件sub512a.asm,5.3.1源程序文件的包含,dispcharmacrochar;显示char字符movdl,charmovah,2int21hendmdispmsgmacromessage;显示message字符串movdx,offsetmessagemovah,9int21hendm,Lt512a.mac,includelt512a.mac.dispmsgmsg1;提示输入数据movbx,offsetbufcallinput;数据输入cmpcx,0jestart4;没有输入数据则退出movcount,cx.;显示输入的数据.;数据排序.;显示经排序后的数据start4:.exit0includesub512a.asmend,Lt512a.asm,子程序源文件有3个子程序ALdisp;显示2位16进制数子程序(例4.10)sorting;排序子程序(例4.8)input;键盘输入子程序还包含一个宏convert;将DX两位ASCII码转换为两位16进制数,sub512a.asm,让我们重点分析键盘输入子程序input,;键盘输入子程序;入口参数:ds:bx=存放数据的缓冲区;出口参数:cx=数据个数inputprocpushaxpushdxxorcx,cx;数据个数清0input01:xordx,dx;输入字符清0input02:movah,1;键盘输入一个字符int21h,input之一,input10:cmpal,0dhjeinput30;是回车,结束整个数据的输入cmpal,jeinput20;是空格和逗号,确认输入了一个数据cmpal,jeinput20cmpal,08hjeinput17;是退格,丢弃本次输入的数据,出错,input之二,cmpal,0;有效数字判断(图5.2b)jbinput17;小于0,不是有效数字,出错cmpal,fjainput17;大于f,不是有效数字cmpal,ajbinput11subal,20h;af转换成大写AFjmpinput12input11:cmpal,Fjainput17;字符小于a、大于F,出错cmpal,Ajaeinput12;是AF,有效字符cmpal,9jainput17;是09,有效字符,input之三,input12:cmpdl,0;有效字符的处理jneinput13movdl,al;dl=0,输入了一个数据的低位,则dlaljmpinput02;转到字符输入input13:cmpdh,0jneinput17;dl0,dh0输入3位数据,出错movdh,dl;dl0,dh0输入了一个数据的高位movdl,al;dhdl,dlaljmpinput02;转到字符输入,input之四,input17:movdl,7;输入错误处理movah,2int21hmovdl,?movah,2int21hjmpinput01;转到输入一个数据,input之五,;转换正确的输入数据(图5.2c)input20:convertjmpinput01;转到输入一个数据input30:convertpopdxpopaxret;返回,出口参数已设定inputendp,input之六,;将DX两位ASCII码转换为两位16进制数(图5.2c)convertmacrolocalinput21,input22localinput24,input25cmpdl,0;dl=0,没有要转换的数据,退出jeinput25,convert之一,cmpdl,9jbeinput21subdl,7;字符AF,则减7input21:anddl,0fh;转换低位cmpdh,0;dh=0,没有高位数据jeinput24cmpdh,9jbeinput22subdh,7input22:shldh,1shldh,1shldh,1shldh,1;转换高位ordl,dh;合并高、低位,convert之二,源文件包含的操作步骤:分别编辑生成各个文件汇编、连接主程序文件,input24:movbx,dl;存入缓冲区incbxinccx;数据加1input25:endm,convert之三,把常用子程序写成独立的源程序文件,单独汇编,形成子程序的目标文件.OBJ主程序也经过独立汇编之后形成目标文件连接程序将所有目标文件连接起来,最终产生可执行文件需要遵循的原则:声明共用的变量、过程等实现正确的段组合处理好参数传递问题,5.3.2目标代码文件的连接,声明共用的变量、过程,各个模块间共用的变量、过程等要说明PUBLIC标识符,标识符.;定义标识符的模块使用EXTERN标识符:类型,标识符:类型.;调用标识符的模块使用标识符是变量名、过程名等类型是byte/word/dword(变量)或near/far(过程)在一个源程序中,public/extern语句可以有多条各模块间的public/extern伪指令要互相配对,并且指明的类型互相一致,实现正确的段组合,子程序文件必须定义在代码段中,也可以具有局部的数据变量采用简化段定义格式,只要采用相同的存储模式,容易实现正确的近或远调用完整段定义格式中,为了实现模块间的段内近调用(near类型),各自定义的段名、类别必须相同,组合类型都是public。实际的程序开发中,各个模块往往由不同的程序员完成,不易实现段同名或类别相同,所以索性定义成远调用(far类型)定义数据段时,同样也要注意这个问题。当各个模块的数据段不同时,要正确设置数据段DS寄存器的段基地址,处理好参数传递问题,少量参数可用寄存器或堆栈直接传送数据本身大量数据可以安排在缓冲区,用寄存器或堆栈传送数据的存储地址还可利用变量传递参数,但是要采用public/extern声明为公共(全局)变量这些也是子程序间的参数传递方法另外,第7章混合编程介绍了更好的堆栈传递参数方法,可以采用,例5.12b,主程序lt512b.asm并入宏定义子程序文件sub512b.asm,要加上段定义语句、声明语句等,但不需要起始点和结束点,模块连接的操作步骤:分别编辑生成各个文件分别汇编各个文件连接各个目标文件,形成可执行文件,.;宏定义.codepubliccount;定义count共用externALdisp:near,sorting:near,input:far;声明其他模块中的子程序.startup.exit0;去掉(lt512a.asm中的)包含语句end,Lt512b.asm,.modelsmall;定义同样的存储模式externcount:word;在其他模块定义了字变量count.code;子程序在代码段中publicaldisp,sorting,input;3个子程序是共用的Aldispproc;仍然作为近调用sortingproc;仍然作为近调用inputprocfar;修改为远调用.movcount,cx;提供出口参数.inputendpend;结束汇编,sub512b.asm,把常用子程序写成独立的源文件,单独汇编形成OBJ文件后,存入子程序库主程序也单独汇编形成OBJ文件主程序连接时,调入子程序库中的子程序模块,产生最终的可执行文件例5.12c主程序文件lt512c.asm子程序文件sub512c1.asm子程序文件sub512c2.asm子程序文件sub512c3.asm,5.3.3子程序库的调入,子程序库,子程序库文件(.LIB)是子程序模块的集合,其中存放着各子程序的名称、目标代码及有关定位信息存入库的子程序的编写与目标文件连接方法中的要求一样,只是为方便调用,更加严格子程序文件编写完成后,汇编形成目标文件;然后利用库管理工具程序LIB.EXE,把子程序目标模块逐一加入到库中LIB库文件名+子程序目标文件名库管理程序LIB帮助创建、组织和维护子程序模块库,例如增加、删除、替换、合并库文件等,.;宏定义.codeexternALdisp:near,sorting:near,input:near;声明其他模块中的子程序.startup.exit0end,Lt512c.asm,.modelsmall.codepublicaldispAldispproc.Aldispendpend,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司新年开班活动方案
- 公司福利拼图活动方案
- 公司组织打排球活动方案
- 公司现场抢红包活动方案
- 公司春节团队活动方案
- 2025年影响力与传播学综合能力考试试题及答案
- 2025年文化遗产保护与管理考试题及答案
- 2025年摩托车驾驶技术培训和考核试卷及答案
- 2025年农村经济管理考试试卷及答案
- 2025年计算机设计师职业资格考试题及答案
- 保密管理与商业机密保护
- 【低保政策执行过程中产生的消极效果及优化建议分析11000字(论文)】
- 医院护理培训课件:《妊娠剧吐的护理查房》
- 深圳小学六年级下册英语单词表(带音标)
- 幼儿园小班数学《图形王国历险记》课件
- GB/T 22461.1-2023表面化学分析词汇第1部分:通用术语及谱学术语
- 造林(乔木林、灌木林、经济林)单元工程质量评定表(2023版)
- 必修2册重点知识点提纲 高中地湘教版
- 2023春国开个人与团队管理1-32章自测试题及答案
- 2023-2024学年四川省凉山州小学数学五年级下册期末自测试卷
- 微小病变肾病指南解读
评论
0/150
提交评论