汇编语言05

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第5章高级汇编语言程序设计2教学重点在掌握基本的汇编语言程序设计方法之后,进一步学习如何提高编程效率的各种实用方法:高级语言特性宏结构模块化35.1高级语言特性MASM6.0引入高级语言的程序设计特性条件控制伪指令.IF.ELSE.ENDIF循环控制伪指令.WHILE.ENDW.REPEAT.UNTIL过程声明和过程调用伪指令.PROTO.INVOKE45.1.1条件控制伪指令类似高级语言中IF、THEN、ELSE和ENDIF的相应功能在汇编时要展开,自动生成相应的比较和条件转移指令序列,实现程序分支5.IF条件表达式;条件为真(值为非0)分支体;执行分支体[.ELSEIF条件表达式;前面IF[以及前面ELSEIF]条件为假(值为0)分支体][.ELSE;前面IF[以及前面ELSEIF]条件为假分支体].ENDIF;分支结束7操作符的优先关系为逻辑非!最高,然后是表中左的比较类操作符,最低的是逻辑与“&&”和逻辑或“||”;单分支结构.IFAX0negax.ENDIFmovresult,ax;双分支结构.IFax==5movbx,axmovax,0.ELSEdecax.ENDIF;双分支结构.IFax==5*cmpax,05h*jne@C0001movbx,axmovax,0.ELSE*jmp@C0003*@C0001:decax.ENDIF*@C0003:例题9对于条件表达式中的变量,若是用DB,DW,DD定义的,则一律作为无符号数。若需要进行有符号数的比较时,用SBYTE,SWORD,SDWORD来定义。采用寄存器或常数作为条件表达式的数值参加比较时,默认是无符号数。如果作为有符号数,可以用SBYTEPTR或SWORDPTR操作符指明。若其中一个数值为有符号数,则条件表达式强制另外一个数据作为有符号数进行比较。.data_asbyte?_bsbyte?_csbyte?tagbyte?.code.startupmoval,_bimulalmovbx,ax;bx中为b2moval,_aimul_cmovcx,4imulcx;ax中为4ac例5.1-1/2.ifswordptrbx=ax;比较二者大小movtag,1;第一分支体:条件满足,tag←1.elsemovtag,0;第二分支体:条件不满足,tag←0.endif.exit0例5.1-2/2125.1.2循环控制伪指令WHILE结构的循环控制伪指令.WHILE条件表达式;条件为真循环体;执行循环体.ENDW;循环体结束UNTIL结构的循环控制伪指令.REPEAT;重复执行循环体循环体.UNTIL条件表达式;直到条件为真13WHILE循环结构的流程图14UNTIL循环结构的流程图15另外一种UNTIL结构.REPEAT;重复执行循环体循环体.UNTILCXZ[条件表达式];CX←CX-1,直到CX=0或条件为真;WHILE结构xorax,axmovcx,100.whilecx!=0addax,cxdeccx.endwmovsum,ax求1~100之和;UNTIL结构xorax,axmovcx,100.repeataddax,cxdeccx.untilcx==0movsum,axmovcx,100xorax,axleabx,array.repeat.ifswordptr[bx]=0addax,[bx].else.break.endifincbxincbx.untilcxzmovresult,ax例5.2将array中前若干个非负数求和,结果存入result单元要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐应该采用过程调用伪指令INVOKE使用INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明过程名PROC调用距离语言类型作用范围起始参数USES寄存器列表,参数:类型LOCAL参数表…;汇编语言语句过程名ENDP过程声明伪指令:用于事先声明过程的结构过程名PROTO调用距离语言类型,参数:类型过程调用伪指令INVOKE过程名,参数,...如何调用5.1.3过程声明和过程调用伪指令19过程名:过程名称的唯一标识符。调用距离:NEAR或FAR,表示过程是近调用还是远调用,是可选项。简化段格式中默认值由.MODEL语句选择的存储模式决定。语言类型:可选项,确定过程采用的命名约定和调用约定,可以是MASM6.x支持的任何有效的语言类型,如下表所示。简化的段格式中由.MODEL伪指令指定。作用范围:可选项,表示该过程对其它模块是否可见,有PUBLIC(对外可见)、PRIVATE(对外不可见)、EXPORT(隐含PUBLIC和FAR,表示本程序的变量提供给其他模块调用。)三种。20起始参数:表示传送起始代码的参数,必须用尖括号括起来,多个参数用逗号分隔。汇编程序将自动创建过程的起始代码和收尾代码,用于传递堆栈参数和清除堆栈。起始参数表示传递给起始代码的参数。寄存器列表:通用寄存器名,多个寄存器名用空格分隔。汇编程序将在起始代码产生相应的入栈指令,在收尾代码产生相应的出栈指令。参数:[类型]:表示该过程使用的形式参数及其类型,可以是任何MASM有效的类型;默认类型是字WORD(16位段)和双字DWORD(32位段)。2122在PROC语句格式中,要使用[参数]选项,必须定义[语言类型]选项。◆若定义C、SYSCALL、STDCALL语言类型,则[参数]选项还可以是VARARG(表示长度可变参数)类型。◆[参数]前的各个选项以空格分隔,而[参数]选项必须用逗号与前面选项分割,多个参数相互分割也用逗号。◆过程中使用的局部变量,用PROC行后一条或若干条LOCAL伪指令说明:LOCAL变量名[个数][:类型][,…]可选项[个数]表示同样类型数据的个数。与高级语言一样,汇编系统自动利用堆栈存放局部变量。23过程声明为了更有效地调用过程,MASM6.x引入了PROTO伪指令,事先声明过程结构。过程名PROTO[调用距离][语言类型][:类型][,…]…PROTO语句中各项必须与定义过程伪指令PROC的各项一致。PROTO伪指令对过程声明之后,才可使用具有自动传递参数功能的调用指令INVOKE。过程调用(1)CALL调用语句格式:CALL过程名◆较早MASM版本的PROC伪指令不带参数,直接用CALL指令调用,调用过程只能通过堆栈、寄存器和内存单元来传递参数,编程实现难度较大。24(2)INVOKE带参调用语句格式:INVOKE过程名[,参数…]◆这是简单直接地带参调用过程,实参数可以是数值表达式、寄存器、地址标号(双字类型是段基址和偏移地址,字类型是偏移地址)等。◆本调用语句自动调用过程所需的代码序列,调用前把参数压入堆栈,调用后平衡堆栈,而无须程序员劳神。◆该语句在PROTO声明之后,与之配合使用,调用时汇编系统将进行类型检查,发现参数类型不匹配时将提示出错,以保证调用正确。;汇编语言程序: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.3-1/2列表文件checksumdPROCcUSESbxcx,\countp:word,arrayp:wordmovbx,arrayp;BX←数组的偏移地址movcx,countp;CX←数组的元素个数xoral,alsumd:addal,[bx];求和:AL←AL+DS:[BX]incbxloopsumdretchecksumdendpend例5.3-2/2列表文件295.2宏结构程序设计宏汇编重复汇编条件汇编——统称宏结构宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法30宏——具有宏名的一段汇编语句序列——宏定义时书写宏指令——这段汇编语句序列的缩写——宏调用时书写宏展开——宏指令处用这段宏代替的过程——宏汇编时实现宏的参数功能强大,颇具特色配合宏,还有宏操作符和有关伪指令5.2.1宏汇编311.宏定义宏名macro[形参表]宏定义体endmmainbeginMACRO;;定义名为mainbegin的宏,无参数movax,@data;;宏定义体movds,axENDM;;宏定义结束mainendMACROretnum;;带有形参retnummoval,retnum;;宏定义中使用参数movah,4chint21hENDM宏注释符32DispmsgMACROmessageleadx,messagemovah,09hint21hENDM332.宏调用宏名[实参表]start:mainbegin;宏调用,建立DS内容dispmsgstring;宏调用,显示字符串mainend0;宏调用,返回DOSendstart宏调用的实质是在汇编过程中进行宏展开宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体取代源程序的宏指令,同时用位置匹配的实参对形参进行取代343.宏展开宏展开——在汇编时,用宏定义体的代码序列替代宏指令的过程。start:mainbegin;宏指令1movax,@data;宏展开1movds,axdispmsgstring1Leadx,string1Movah,09h1Int21hmainend0;宏指令1moval,0;宏展开1movah,4ch1int21h354.宏的参数宏的参数使用非常灵活宏定义时,可以无参数,例如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&sopcode&soprand,clpopcxendm;统一移位和循环移位8条指令的宏指令shrotmacrosroprand,srnum,sropcodepushcxmovcl,srnumsropcodesroprand,clpopcxendm例5.5b替换操作符用做操作码的宏定义参数;宏定义dstringmacrostringdb’&string&’,0dh,0ah,’$’endm;宏调用dstringThisisaexample.dstring0!Number!10;宏展开1db’Thisisaexample.’,0dh,0ah,’$’1db’0Number10’,0dh,0ah,’$’例5.6转义注释符传递注释符字符串用做宏定义参数39宏操作符;;——宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现&——替换操作符,用于将参数与其他字符分开。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符40——字符串传递操作符,用于括起字符串。在宏调用中,如果传递的字符串实参数含有逗号、空格等间隔符号,则必须用这对操作符,以保证字符串的完整!——转义操

1 / 110
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功