汇编语言第9周-高级汇编.ppt

上传人:za****8 文档编号:14127633 上传时间:2020-07-04 格式:PPT 页数:56 大小:686.56KB
收藏 版权申诉 举报 下载
汇编语言第9周-高级汇编.ppt_第1页
第1页 / 共56页
汇编语言第9周-高级汇编.ppt_第2页
第2页 / 共56页
汇编语言第9周-高级汇编.ppt_第3页
第3页 / 共56页
资源描述:

《汇编语言第9周-高级汇编.ppt》由会员分享,可在线阅读,更多相关《汇编语言第9周-高级汇编.ppt(56页珍藏版)》请在装配图网上搜索。

1、汇编语言程序设计,主讲:江苏苏,第9周大课,本周主要内容,宏汇编与宏指令高级汇编伪指令*重复汇编条件汇编汇编控制语句*汇编语言和C/C+语言混合编程*C语言程序的汇编输出多模块程序设计的基本方法程序库的建立,汇编语言程序设计,2,汇编语言程序设计,3,第7章高级汇编语言技术,主要内容,宏汇编与宏指令重复汇编条件汇编汇编控制语句*,汇编语言程序设计,4,宏汇编、重复汇编、条件汇编统称宏结构,宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法。,宏(宏定义)具有宏名的一段汇编语句序列宏定义时书写宏指令宏名作为一条指令直接使用,相当于宏定义体的缩写宏调用时书写宏

2、展开汇编时用宏体代替宏指令的过程宏汇编时实现,宏汇编的概念,汇编语言程序设计,5,宏定义的格式,宏名macro形参表宏定义体endm,汇编语言程序设计,6,宏定义例:,mainbeginMACRO;定义名为mainbegin的宏,无参数movax,data;宏定义体movds,axENDM;宏定义结束mainendMACROretnum;带有形参retnummoval,retnum;宏定义中使用参数movah,4chint21hENDMdispmsgMACROstringleadx,offsetstringmovah,09hint21hENDM,汇编语言程序设计,7,宏调用的格式,宏名实参表,

3、msgdbthisisamacroinstruction.,$start:mainbegin;宏调用,建立DS内容dispmsgmsg;宏调用,显示字符串mainend0;宏调用,返回DOSendstart宏调用的实质是在汇编过程中进行宏展开宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体取代源程序的宏指令,同时用位置匹配的实参取代形参,汇编语言程序设计,8,宏展开,在汇编时,用宏定义体的代码序列替代宏指令的过程。,start:mainbegin;宏指令1movax,data;宏展开1movds,axdispmsgmsg;宏指令1leadx,offsetstr

4、ing;宏展开1movah,09h1int21hmainend0;宏指令1moval,0;宏展开1movah,4ch1int21h,汇编语言程序设计,9,宏定义例shlextmacroshlreg,shlnumpushcxmovcl,shlnumshlshlreg,clpopcxendm宏指令shlextax,6宏展开1pushcx1movcl,061shlax,cl1popcx,灵活使用宏的参数-1,宏定义时,参数可以是常数、变量、存储单元、指令(操作码)或它们的一部分,也可以是表达式;宏定义体可以是任何合法的汇编语句,既可以是硬指令序列,又可以是伪指令序列。,汇编语言程序设计,10,统一4

5、条移位指令的宏指令shiftmacrosoprand,snum,sopcodepushcxmovcl,snums;宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现标号后不能写指令,但可写注释,汇编语言程序设计,14,;宏定义absolmacrooprdlocalnextcmpoprd,0jgenextnegoprdnext:endm;有二条宏调用absolwordptrbxabsolbx,;宏展开11cmpwordptrbx,01jge?00001negwordptrbx1?0000:;宏展开21cmpbx,01jge?00011negbx1?0001:,必须独占一行,

6、局部标号伪指令例:,汇编语言程序设计,15,宏与子程序的不同,LOCAL在子程序中用于说明局部变量,在不同的子程序调用中,局部变量名不会改变;LOCAL在宏定义中用于说明局部标号,在不同的宏展开中,标号由唯一的序号替代。子程序的工作方式是每次调用执行相同的目标代码段;宏调用的工作方式是每次调用会生成相关的汇编源语句,汇编程序再将它们翻译成位于多处的目标代码段。子程序的参数通过变量或堆栈传递,子程序在调用后还必须返回,因而执行时要花较多的时间;宏的参数通过实参替换形参来传递,参数形式多样,宏调用不需要返回。,汇编语言程序设计,16,比较,仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需

7、要返回;不减小目标程序,执行速度没有改变通过形参、实参结合实现参数传递,简捷直观、灵活多变,还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢需要利用寄存器、存储单元或堆栈等传递参数,宏,子程序,宏与子程序具有各自的特点,程序员应该根据具体问题选择使用当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序,汇编语言程序设计,17,宏库的建立与调用,宏库的建立当源程序中包含较多的宏定义时,可以把这些宏定义单独建一个文件,使用扩展名.MAC或.INC表示。宏库的调用在使用宏库中的宏定义之前,要象C语言那样用伪指

8、令INCLUDE把有关“宏库”文件包含在用户的源程序中。eg.Included:mymacros.mac系统定义的宏MASM6.11系统定义了大量的标准宏,程序员能很方便地使用它们。主要的系统宏库文件有:DOS.INC和BIOS.INC,它们存放在系统的include子目录中。,高级汇编伪指令,重复汇编条件汇编汇编控制语句*,汇编语言程序设计,18,这些伪指令会因汇编程序版本的不同而有不同的形式和规则。,汇编语言程序设计,19,重复汇编,重复汇编指在汇编过程中,重复展开一段(基本)相同的语句重复汇编没有名字,不能被调用重复汇编常用在宏定义体中,也可以在一般汇编语句中使用重复汇编伪指令有三个:R

9、EPEAT按参数值重复FOR按参数个数重复FORC按参数的字符个数重复最后,均用ENDM结束,或MASM5.0对应写成REPTIRPIRPC,汇编语言程序设计,20,按参数值重复,REPEAT重复次数重复体ENDM,char=AREPEAT26dbcharchar=char+1ENDM,1dbchar;等效于dbA1char=char+11dbchar;等效于dbB1char=char+1.1dbchar;等效于dbZ1char=char+1,汇编后,汇编语言程序设计,21,按参数个数重复,FOR形参,实参表重复体ENDM,FORregad,pushregadENDM,1pushax1push

10、bx1pushcx1pushdx,汇编后,汇编语言程序设计,22,按参数字符个数重复,FORC形参,字符串重复体ENDM,FORCregad,dcbapop满足,汇编分支语句体1分支语句体1ELSE;不满足,汇编分支语句体2分支语句体2ENDIF;条件汇编结束,汇编语言程序设计,24,汇编语言程序设计,25,pdatamacronumIFnumlt100;如果num100,则汇编如下语句dbnumdup(?)ELSE;否则,汇编如下语句db100dup(?)ENDIFendmpdata12;宏调用db12dup(?);宏汇编结果pdata102;宏调用db100dup(?);宏汇编结果,条件汇

11、编例:,汇编语言程序设计,26,mainendMACROretnum;返回DOS,可不带参数ifbmovah,4ch;没有参数elsemovax,4c00h+(retnumAND0ffh);有参数endifint21hENDM,例:修改宏定义mainend,使其可以不带参数调用,mainendMACROretnum;带有形参retnummoval,retnum;宏定义中使用参数movah,4chint21hENDM,可以调用mainend也可以调用mainend6,汇编语言程序设计,27,宏的嵌套和递归*,1、在宏定义体中出现其它宏调用,原则是先定义后调用。例:absmacroopr1,opr

12、2mopmsub,opr1,opr2mopmadd,opr1,opr2endm2、在宏定义体中包含其他宏定义,原则是只有先调用外层宏,才能调用内层宏;不推荐此编程方式,降低了源程序的可读性、可维护性!,mopmmacroop,v1,v2movax,v2opv1,axendm,汇编语言程序设计,28,宏的递归调用例:,书上例7.23:计算数X乘2N,通过宏递归来实现,利用IF语句来结束递归。定义宏:POWERMACROX,NIFENEXITMENDIFSALX,1COUNT=COUNT+1IFCOUNT-NPOWERX,NENDIFENDM,调用宏:Count=0POWERX,4宏展开:SALX

13、,1SALX,1SALX,1SALX,1调用宏:Count=0POWERX,0,汇编语言程序设计,29,灵活运用条件汇编-1,书上例7.25:检查将参与运算的符号有否定义。P.270定义宏:DivideMACROdividend,divisor,quotientlocalcomp,outcntr=0IFNDEFdividendcntr=1ENDIFIFNDEFdivisorcntr=1ENDIFIFNDEFquotientcntr=1ENDIFifcntrexitmendif,movax,dividendmovbx,divisorsubcx,cxComp:cmpax,bxjboutsubax,

14、bxinccxjmpcompOut:movquotient,cxENDM,;数据定义dd1dw200ds1dw25quo1dw?dd2dw175ds2dw35quo2dw?宏调用:Dividedd1,ds1,quo1Dividedd2,dss2,quo2,宏展开:Dividedd1,ds1,quo1cntr=0movax,dd1movbx,ds1subcx,cx?0000:cmpax,bxjb?0001subax,bxinccxjmp?0000?0001:movquo1,cxDividedd2,dss2,quo2cntr=1,汇编语言程序设计,30,灵活运用条件汇编-2,书上例7.28:根据标

15、志生成相应操作指令。P.276定义宏:MOVIFMACROTAGIFIDN,REPMOVSBEXITMENDIFIFIDN,REPMOVSWELSEREPMOVSBENDIFENDM,宏调用:MOVIFBMOVIFWMOVIF宏展开:REPMOVSBREPMOVSWREPMOVSB,汇编语言程序设计,31,MASM6.0以后引入的高级语言程序设计特性,条件控制伪指令.IF.ELSE.ENDIF循环控制伪指令.WHILE.ENDW.REPEAT.UNTIL过程声明和过程调用伪指令.PROTO.INVOKE,汇编语言程序设计,32,汇编控制:条件控制伪指令,类似高级语言中IF-THEN-ELSE结

16、构语句的相应功能在汇编时将展开,自动生成相应的比较和条件转移指令序列,实现程序分支,条件操作符,格式1:.IFcondition指令序列.ENDIF格式2:.IFcondition指令序列1;condition条件成立时执行.ELSE指令序列2;condition条件不成立时执行.ENDIF,格式3:.IFcondition1指令序列1.ELSEIFcondition2指令序列2.ENDIF,汇编语言程序设计,33,条件表达式中的操作符,汇编语言程序设计,34,单分支结构:.IFax0negax.ENDIFmovresult,ax双分支结构:.IFax=5movbx,axmovax,0.ELS

17、Edecax.ENDIF,;双分支结构的汇编结果.IFax=5*cmpax,05h*jneC0001movbx,axmovax,0.ELSE*jmpC0003*C0001:decax.ENDIF*C0003:,条件控制例:,指示该语句由汇编程序自动生成,汇编语言程序设计,35,汇编控制:循环控制伪指令,WHILE结构的循环控制伪指令.WHILE条件表达式;条件为真则执行循环体循环体.ENDW;条件为假,结束循环UNTIL结构的循环控制伪指令.REPEAT;重复执行循环体循环体.UNTIL条件表达式;直到条件为真或.REPEAT循环体.UNTILCXZcondition;直到CX=0或condi

18、tion成立,汇编语言程序设计,36,WHILE结构xorax,axmovcx,100.whilecx!=0addax,cxdeccx.endwmovsum,ax,UNTIL结构xorax,axmovcx,100.repeataddax,cxdeccx.untilcx=0movsum,ax,例:求1100之和,汇编语言程序设计,37,movcx,100 xorax,axleabx,array.repeat.ifswordptrbx=0addax,bx.else.break.endifincbxincbx.untilcxzmovresult,ax,例:累加array数组中的正数,汇编语言程序设计

19、,38,调用带较多参数定义的过程时,可不采用CALL指令,因为比较烦琐可采用过程调用伪指令INVOKE使用INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明,过程声明和过程调用伪指令,过程名PROC调用距离语言类型作用范围入口宏USES寄存器列表,参数:类型LOCAL参数表;汇编语言语句过程名ENDP,过程声明伪指令:用于事先声明过程的结构过程名PROTO调用距离语言类型,参数:类型过程调用伪指令INVOKE过程名,参数,.,汇编语言程序设计,39,.modelsmallchecksumdPROTOc:word,a:word;声明过程.stack.dataarraydb12h,25

20、h,0f0h,0a3h,3db68h,71h,0cah,0ffh,90hcountequ$-array;数组的元素个数resultdb?;校验和.code.startupINVOKEchecksumd,count,offsetarray;调用过程movresult,al;保存校验和.exit0,列表文件,例:数组求和的汇编语言源程序-1/2,汇编语言程序设计,40,checksumdPROCcUSESbxcx,countp:word,arrayp:wordmovbx,arrayp;BX数组的偏移地址movcx,countp;CX数组的元素个数xoral,alsumd:addal,bx;求和:A

21、LAL+DS:BXincbxloopsumdretchecksumdendpend,列表文件,例:数组求和的汇编语言源程序2/2,汇编语言程序设计,41,.INVOKEchecksumd,count,offsetarray*movax,wordptrOFFSETarray*pushax*movax,+000Ah*pushax*callchecksumd*addsp,04hmovresult,al.,例:数组求和程序的汇编列表-1/2,汇编语言程序设计,42,checksumdPROCcUSESbxcx,countp:word,arrayp:word*pushbp;起始代码*movbp,sp*p

22、ushbx;保护bx和cx*pushcxmovbx,arrayp;arrayp=BP+6movcx,countp;countp=BP+4.ret*popcx;结尾代码*popbx*popbp*ret0000hchecksumcendp,例:数组求和程序的汇编列表-2/2,补充内容*:,汇编语言和C/C+语言混合编程C语言程序的汇编输出多模块程序设计的基本方法程序库的建立,汇编语言程序设计,43,汇编语言与C/C+语言的混合编程,汇编语言程序设计,44,格式1:单条指令_asm助记符操作数;单句汇编语言指令格式2:指令序列_asm;汇编语言指令序列,单条汇编语言指令:_asmmovax,1a69

23、h_asmmovdx,378h_asmoutdx,ax,指令序列例:_asmmovax,1a69hmovdx,378houtdx,ax,汇编语言与C/C+语言的混合编程,汇编语言程序设计,45,说明:在嵌入的汇编语言指令中,可以使用C/C+语言的数据格式。例如,1a69h可以书写为0 x1a69。嵌入的汇编语言代码不能使用MASM的伪指令来定义数据。在嵌入的汇编语言代码中,不需要保护寄存器EAX、EBX、ECX、EDX、ESI和EDI的值,必要时由C/C+编译器负责生成保护指令。需要保护寄存器DS、SS、ESP、EBP以及方向标志DF的值。嵌入的汇编语言指令,除了可以使用立即数与寄存器外,还可

24、以使用C/C+程序中定义的标识符,如常量、变量、标号、函数名与函数参数等。C/C+编译器自动将它们转换成相应汇编语言指令的操作数,并在标识符前自动加下划线。,C/C+程序调用汇编语言过程,汇编语言程序设计,46,调用约定包括_cdecl和_stdcall两种:C/C+函数缺省采用_cdecl调用约定,这种约定在函数名前自动加一个下划线,从右到左将实在参数压入堆栈,由函数的调用者负责堆栈的平衡:_函数名Win32API函数采用_stdcall调用约定,这种约定从右到左将实在参数压入堆栈,由函数本身负责移去调用者压入堆栈的参数,函数名在编译后被转换为如下形式:_函数名参数长度其中,参数长度是指参数

25、表的字节数(十进制)。例如,设函数fun有两个32位参数,则供外部模块调用的名称为_fun8,C/C+程序调用汇编语言过程,汇编语言程序设计,47,声明约定在MicrosoftVisualC+中,需要用externC对所要调用的外部过程、函数和变量予以声明。形式:externC返回值类型调用约定函数名(形式参数表);externC变量类型变量名;在用汇编语言编写的程序中,必须用public声明供外部模块使用的标识符:PUBLIC标识符1,标识符2,不同语言编写的程序模块分别进行汇编或编译,最后把所有的目标文件连接在一起。,C语言程序的汇编输出*,汇编语言程序设计,48,在TurboC+或Bor

26、landC+编程环境下,可用TCC或BCC行命令把一个C语言的源程序转换成汇编语言的源程序。,C语言程序清单:#includeintsum(inta,intb,intc)return(a+b+c);voidmain()inta,b,c;a=b=12;c=32;printf(%d,sum(a,b,c);,_TEXTsegmentbytepublicCODE;代码段语句_TEXTends_DATAsegmentwordpublicDATA;数据段的定义_DATAends;下面说明函数的属性public_mainend,汇编语言的详细清单:,汇编语言程序设计,49,多模块程序设计,多模块程序的组织,

27、源文件级的连接:使用INCLUDE缺点:由于合并后的源文件为一个汇编单位,源文件与被包含文件的标识符不能重复。目标文件级的连接:各模块单独汇编。常用的方法:二者结合。根据功能的相对独立性,将整个程序分为若干个.ASM文件,单独编写;将公共的常量定义、宏定义、外部过程声明等组织在一个或多个.INC文件中;.ASM文件根据需要使用INCLUDE。,汇编语言程序设计,50,多模块程序开发的基本步骤,模块的划分;编写源程序;按模块组织成.ASM文件;汇编:将每个.ASM文件分别汇编为.OBJ文件;将所有.OBJ文件连接为一个完整的.EXE文件。,多模块程序设计,汇编语言程序设计,51,多模块间的通信通

28、过公共标识符的定义和引用,外部过程的参数传递等来实现。,1.PUBLIC伪指令PUBLIC标识符,标识符表示这些标识符是本模块定义的、可被外部模块引用的公共标识符,可以是变量名、标号、过程名以及由EQU(或=)定义的符号名。2.EXTRN伪指令EXTRN标识符:类型,标识符:类型表示这些标识符是外部模块定义、本模块要引用的外部标识符,主要类型包括:NEAR和FAR(用于过程)。BYTE、WORD、DWORD等(用于变量)。,多模块程序设计,汇编语言程序设计,52,Make文件的使用,make文件是一个文本文件,用来描述文件之间的依赖关系。make文件由依赖语句和处理该依赖的命令组成。依赖语句的

29、形式如下:目标:依赖文件若依赖文件已发生变化,则执行依赖语句后面的命令。例如:pgm.exe:pgm1.objpgm2.objml/Fepgm.exepgm1.objpgm2.obj表示pgm.exe依赖于pgm1.obj与pgm2.obj,只要pgm1.obj或pgm2.obj发生任何变化,均应重新建立pgm.exe文件。,多模块程序设计,汇编语言程序设计,53,子程序库,C/C+语言的程序设计环境提供了大量库文件,库文件中包含了大量的标准函数或过程。用户可以创建自己的库文件。库文件可以看成是子程序的集合。库文件中存储着子程序名、子程序的目标代码以及连接所需要的重定位信息。当某目标文件与库文

30、件相连接时,LINK程序只把目标文件所用到的子程序从库文件中找出来,并合并到最终的可执行文件中,而不是把库中所含的全部子程序都纳入最后的可执行文件。,汇编语言程序设计,54,建立库文件命令LIB,MS-DOS系统中显示命令LIB的用法:lib/?Windows系统中显示命令LIB的用法:D:MASM611BINLIB/?,汇编语言程序设计,55,1)各选项的解释,2)命令项的解释:,汇编语言程序设计,56,建立库文件举例,假设现有目标文件sub1.obj、sub2.obj和sub3.obj,要用它们建立库文件mylib.lib。方法1:把所有目标文件一次性加入到库文件中libmylib+sub1+sub2+sub3方法2:随着目标文件的逐个生成,而依次加入到库文件中libmylib+sub1libmylib+sub2libmylib+sub3假如源文件sub3.asm已修改,并也生成了新的目标文件sub3.obj,这时,就需要把库文件mylib.lib中的sub3.obj替换成新的目标文件。可用下面命令来实现替换:libmylib-+sub3,

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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