欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

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

    • 资源ID:5993789       资源大小:336KB        全文页数:56页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    汇编语言程序设计,主讲:江苏苏,第9周 大课,本周 主要内容,宏汇编与宏指令 高级汇编伪指令*重复汇编 条件汇编 汇编控制语句*汇编语言和C/C+语言混合编程*C语言程序的汇编输出 多模块程序设计的基本方法 程序库的建立,汇编语言程序设计,2,汇编语言程序设计,3,第7章 高级汇编语言技术,主要内容,宏汇编与宏指令 重复汇编 条件汇编 汇编控制语句*,汇编语言程序设计,4,宏汇编、重复汇编、条件汇编 统称宏结构,宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法。,宏(宏定义)具有宏名的一段汇编语句序列宏定义时书写宏指令宏名作为一条指令直接使用,相当于宏定义体的缩写宏调用时书写宏展开汇编时用宏体代替宏指令的过程宏汇编时实现,宏汇编的概念,汇编语言程序设计,5,宏定义的格式,宏名macro 形参表宏定义体endm,汇编语言程序设计,6,宏定义例:,mainbeginMACRO;定义名为mainbegin的宏,无参数mov ax,data;宏定义体mov ds,axENDM;宏定义结束mainendMACRO retnum;带有形参retnummov al,retnum;宏定义中使用参数mov ah,4chint 21hENDMdispmsg MACRO stringlea dx,offset stringmov ah,09hint 21hENDM,汇编语言程序设计,7,宏调用的格式,宏名实参表,msgdb this is a macro instruction.,$start:mainbegin;宏调用,建立DS内容dispmsg msg;宏调用,显示字符串mainend 0;宏调用,返回DOSend start 宏调用的实质是在汇编过程中进行宏展开 宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体取代源程序的宏指令,同时用位置匹配的实参取代形参,汇编语言程序设计,8,宏展开,在汇编时,用宏定义体的代码序列替代宏指令的过程。,start:mainbegin;宏指令 1mov ax,data;宏展开 1mov ds,axdispmsg msg;宏指令 1 lea dx,offset string;宏展开 1mov ah,09h 1int 21hmainend 0;宏指令 1mov al,0;宏展开 1mov ah,4ch 1int 21h,汇编语言程序设计,9,宏定义例 shlextmacro shlreg,shlnumpush cxmov cl,shlnumshl shlreg,clpop cxendm 宏指令shlext ax,6 宏展开 1push cx 1mov cl,06 1shl ax,cl 1pop cx,灵活使用宏的参数-1,宏定义时,参数可以是常数、变量、存储单元、指令(操作码)或它们的一部分,也可以是表达式;宏定义体可以是任何合法的汇编语句,既可以是硬指令序列,又可以是伪指令序列。,汇编语言程序设计,10,统一4条移位指令的宏指令shiftmacro soprand,snum,sopcodepush cxmov cl,snums&sopcode soprand,clpop cxendm统一移位和循环移位8条指令的宏指令shrotmacro sroprand,srnum,sropcodepush cxmov cl,srnumsropcode sroprand,clpop cxendm,灵活使用宏的参数-2,此时sopcode的取值范围是:hl、hr、al、ar可以得到指令SHL、SHR、SAL、SAR,此时sropcode的取值范围是:SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR,汇编语言程序设计,11,;宏定义dstringmacro stringdb&string&,0dh,0ah,$endm;宏调用dstringdstring;宏展开 1db This is a example.,0dh,0ah,$1db 0 Number 10,0dh,0ah,$,转义操作符,传递操作符,灵活使用宏的参数-3,替换操作符,汇编语言程序设计,12,宏操作符,;宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现&替换操作符,用于将参数与其他字符分开。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符;又称为哑元前缀,在宏定义中连接前后符号构成一个符号 字符串传递操作符,用于括起字符串。在宏调用时,如果传递的字符串实参数含有逗号、空格等间隔符号,则必须用这对操作符,以保证字符串的完整!转义操作符,用于指示其后的一个字符作为一般字符,不含特殊意义%表达式操作符,用在宏调用中,表示将后跟的一个表达式的值作为实参,而不是将表达式本身作为参数,汇编语言程序设计,13,与宏有关的伪指令,局部标号伪指令LOCAL 标号列表宏定义体采用了标号,应使用LOCAL加以说明它必须是宏定义MACRO语句之后的第一条语句宏展开时会按顺序自动生成唯一的序号式标号宏定义删除伪指令PURGE 宏名表当不需要某个宏定义时,可以把它删除;该指令后相关宏定义不再起作用中止宏扩展/宏定义退出伪指令EXITM遇到伪指令EXITM表示结束当前宏调用的展开转移伪指令GOTO标号;用于实现宏定义体内的转移功能,标号:;标号后不能写指令,但可写注释,汇编语言程序设计,14,;宏定义absolmacro oprdlocal nextcmp oprd,0jge nextneg oprdnext:endm;有二条宏调用absol word ptr bxabsol bx,;宏展开1 1cmp word ptr bx,0 1jge?0000 1neg word ptr bx 1?0000:;宏展开2 1cmp bx,0 1jge?0001 1neg bx 1?0001:,必须独占一行,局部标号伪指令例:,汇编语言程序设计,15,宏与子程序的不同,LOCAL在子程序中用于说明局部变量,在不同的子程序调用中,局部变量名不会改变;LOCAL在宏定义中用于说明局部标号,在不同的宏展开中,标号由唯一的序号替代。子程序的工作方式是每次调用执行相同的目标代码段;宏调用的工作方式是每次调用会生成相关的汇编源语句,汇编程序再将它们翻译成位于多处的目标代码段。子程序的参数通过变量或堆栈传递,子程序在调用后还必须返回,因而执行时要花较多的时间;宏的参数通过实参替换形参来传递,参数形式多样,宏调用不需要返回。,汇编语言程序设计,16,比较,仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序,执行速度没有改变通过形参、实参结合实现参数传递,简捷直观、灵活多变,还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢需要利用寄存器、存储单元或堆栈等传递参数,宏,子程序,宏与子程序具有各自的特点,程序员应该根据具体问题选择使用当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序,汇编语言程序设计,17,宏库的建立与调用,宏库的建立当源程序中包含较多的宏定义时,可以把这些宏定义单独建一个文件,使用扩展名.MAC或.INC表示。宏库的调用在使用宏库中的宏定义之前,要象C语言那样用伪指令INCLUDE把有关“宏库”文件包含在用户的源程序中。eg.Include d:mymacros.mac系统定义的宏MASM 6.11系统定义了大量的标准宏,程序员能很方便地使用它们。主要的系统宏库文件有:DOS.INC和BIOS.INC,它们存放在系统的include子目录中。,高级汇编伪指令,重复汇编 条件汇编 汇编控制语句*,汇编语言程序设计,18,这些伪指令会因汇编程序版本的不同而有不同的形式和规则。,汇编语言程序设计,19,重复汇编,重复汇编指在汇编过程中,重复展开一段(基本)相同的语句重复汇编没有名字,不能被调用重复汇编常用在宏定义体中,也可以在一般汇编语句中使用重复汇编伪指令有三个:REPEAT按参数值重复FOR按参数个数重复FORC按参数的字符个数重复最后,均用ENDM结束,或MASM5.0对应写成REPTIRPIRPC,汇编语言程序设计,20,按参数值重复,REPEAT 重复次数 重复体ENDM,char=AREPEAT 26 db char char=char+1ENDM,1db char;等效于db A 1char=char+1 1db char;等效于db B 1char=char+1.1db char;等效于db Z 1char=char+1,汇编后,汇编语言程序设计,21,按参数个数重复,FOR 形参,实参表 重复体ENDM,FOR regad,push regadENDM,1push ax 1push bx 1push cx 1push dx,汇编后,汇编语言程序设计,22,按参数字符个数重复,FORC 形参,字符串 重复体ENDM,FORC regad,dcba pop&regad&xENDM,1pop dx 1pop cx 1pop bx 1pop ax,汇编后,汇编语言程序设计,23,条件汇编,条件汇编伪指令在汇编过程中,根据条件决定汇编的语句IFxx 表达式;满足,汇编分支语句体1分支语句体1 ELSE;不满足,汇编分支语句体2分支语句体2 ENDIF;条件汇编结束,汇编语言程序设计,24,汇编语言程序设计,25,pdatamacro num IF num lt 100;如果num 100,则汇编如下语句db num dup(?)ELSE;否则,汇编如下语句db 100 dup(?)ENDIFendmpdata 12;宏调用db 12 dup(?);宏汇编结果pdata 102;宏调用db 100 dup(?);宏汇编结果,条件汇编例:,汇编语言程序设计,26,mainendMACRO retnum;返回DOS,可不带参数ifb mov ah,4ch;没有参数else mov ax,4c00h+(retnum AND 0ffh);有参数endifint 21hENDM,例:修改宏定义mainend,使其可以不带参数调用,mainendMACRO retnum;带有形参retnummov al,retnum;宏定义中使用参数mov ah,4chint 21hENDM,可以调用mainend也可以调用mainend 6,汇编语言程序设计,27,宏的嵌套和递归*,1、在宏定义体中出现其它宏调用,原则是先定义后调用。例:abs macro opr1,opr2mopm sub,opr1,opr2mopm add,opr1,opr2endm2、在宏定义体中包含其他宏定义,原则是只有先调用外层宏,才能调用内层宏;不推荐此编程方式,降低了源程序的可读性、可维护性!,mopm macro op,v1,v2mov ax,v2op v1,axendm,汇编语言程序设计,28,宏的递归调用例:,书上例7.23:计算数X乘2N,通过宏递归来实现,利用IF语句来结束递归。定义宏:POWER MACRO X,NIFE N EXITMENDIFSAL X,1 COUNT=COUNT+1IF COUNT-N POWER X,NENDIFENDM,调用宏:Count=0POWER X,4宏展开:SAL X,1SAL X,1SAL X,1SAL X,1调用宏:Count=0POWER X,0,汇编语言程序设计,29,灵活运用条件汇编-1,书上例7.25:检查将参与运算的符号有否定义。P.270定义宏:Divide MACRO dividend,divisor,quotientlocal comp,outcntr=0IFNDEF dividendcntr=1ENDIFIFNDEF divisorcntr=1ENDIFIFNDEF quotientcntr=1ENDIFif cntrexitmendif,mov ax,dividendmov bx,divisorsub cx,cx Comp:cmp ax,bxjb outsub ax,bxinc cxjmp compOut:mov quotient,cx ENDM,;数据定义dd1 dw 200ds1 dw 25quo1 dw?dd2 dw 175ds2 dw 35 quo2 dw?宏调用:Divide dd1,ds1,quo1Divide dd2,dss2,quo2,宏展开:Divide dd1,ds1,quo1cntr=0mov ax,dd1mov bx,ds1sub cx,cx?0000:cmp ax,bxjb?0001sub ax,bxinc cxjmp?0000?0001:mov quo1,cx Divide dd2,dss2,quo2cntr=1,汇编语言程序设计,30,灵活运用条件汇编-2,书上例7.28:根据标志生成相应操作指令。P.276定义宏:MOVIF MACRO TAGIFIDN,REP MOVSBEXITMENDIFIFIDN,REP MOVSWELSEREP MOVSBENDIFENDM,宏调用:MOVIF BMOVIF WMOVIF宏展开:REP MOVSB REP MOVSW REP MOVSB,汇编语言程序设计,31,MASM6.0以后引入的高级语言程序设计特性,条件控制伪指令.IF.ELSE.ENDIF循环控制伪指令.WHILE.ENDW.REPEAT.UNTIL过程声明和过程调用伪指令.PROTO.INVOKE,汇编语言程序设计,32,汇编控制:条件控制伪指令,类似高级语言中IF-THEN-ELSE结构语句的相应功能在汇编时将展开,自动生成相应的比较和条件转移指令序列,实现程序分支,条件操作符,格式1:.IF condition 指令序列.ENDIF格式2:.IF condition 指令序列1;condition条件成立时执行.ELSE 指令序列2;condition条件不成立时执行.ENDIF,格式3:.IF condition1 指令序列1.ELSEIF condition2 指令序列2.ENDIF,汇编语言程序设计,33,条件表达式中的操作符,汇编语言程序设计,34,单分支结构:.IF ax 0 neg ax.ENDIFmov result,ax 双分支结构:.IF ax=5 mov bx,ax mov ax,0.ELSE dec ax.ENDIF,;双分支结构的汇编结果.IF ax=5*cmp ax,05h*jne C0001mov bx,axmov ax,0.ELSE*jmp C0003*C0001:dec ax.ENDIF*C0003:,条件控制例:,指示该语句由汇编程序自动生成,汇编语言程序设计,35,汇编控制:循环控制伪指令,WHILE结构的循环控制伪指令.WHILE 条件表达式;条件为真则执行循环体 循环体.ENDW;条件为假,结束循环UNTIL结构的循环控制伪指令.REPEAT;重复执行循环体 循环体.UNTIL 条件表达式;直到条件为真或.REPEAT 循环体.UNTILCXZ condition;直到CX=0或condition成立,汇编语言程序设计,36,WHILE结构xor ax,axmov cx,100.while cx!=0 add ax,cx dec cx.endwmov sum,ax,UNTIL结构xor ax,axmov cx,100.repeat add ax,cx dec cx.until cx=0mov sum,ax,例:求1100之和,汇编语言程序设计,37,mov cx,100 xor ax,axlea bx,array.repeat.if sword ptr bx=0 add ax,bx.else.break.endif inc bx inc bx.untilcxzmov result,ax,例:累加array数组中的正数,汇编语言程序设计,38,调用带较多参数定义的过程时,可不采用CALL指令,因为比较烦琐可采用过程调用伪指令INVOKE使用INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明,过程声明和过程调用伪指令,过程名PROC调用距离 语言类型 作用范围 入口宏USES 寄存器列表,参数:类型LOCAL 参数表;汇编语言语句过程名ENDP,过程声明伪指令:用于事先声明过程的结构过程名 PROTO 调用距离 语言类型,参数:类型过程调用伪指令 INVOKE 过程名,参数,.,汇编语言程序设计,39,.model small checksumd PROTO c:word,a:word;声明过程.stack.dataarraydb 12h,25h,0f0h,0a3h,3db 68h,71h,0cah,0ffh,90hcountequ$-array;数组的元素个数resultdb?;校验和.code.startup INVOKE checksumd,count,offset array;调用过程mov result,al;保存校验和.exit 0,列表文件,例:数组求和的汇编语言源程序-1/2,汇编语言程序设计,40,checksumd PROC c USES bx cx,countp:word,arrayp:wordmov bx,arrayp;BX数组的偏移地址mov cx,countp;CX数组的元素个数xor al,alsumd:add al,bx;求和:ALAL+DS:BXinc bxloop sumdretchecksumd endpend,列表文件,例:数组求和的汇编语言源程序2/2,汇编语言程序设计,41,.INVOKE checksumd,count,offset array*mov ax,word ptr OFFSET array*push ax*mov ax,+000Ah*push ax*call checksumd*add sp,04hmov result,al.,例:数组求和程序的汇编列表-1/2,汇编语言程序设计,42,checksumd PROC c USES bx cx,countp:word,arrayp:word*push bp;起始代码*mov bp,sp*push bx;保护bx和cx*push cxmov bx,arrayp;arrayp=BP+6mov cx,countp;countp=BP+4.ret*pop cx;结尾代码*pop bx*pop bp*ret 0000hchecksumc endp,例:数组求和程序的汇编列表-2/2,补充内容*:,汇编语言和C/C+语言混合编程 C语言程序的汇编输出 多模块程序设计的基本方法 程序库的建立,汇编语言程序设计,43,汇编语言与C/C+语言的混合编程,汇编语言程序设计,44,格式1:单条指令 _asm 助记符 操作数;单句汇编语言指令格式2:指令序列_asm;汇编语言指令序列,单条汇编语言指令:_asm mov ax,1a69h_asm mov dx,378h_asm out dx,ax,指令序列例:_asm mov ax,1a69h mov dx,378h outdx,ax,汇编语言与C/C+语言的混合编程,汇编语言程序设计,45,说明:在嵌入的汇编语言指令中,可以使用C/C+语言的数据格式。例如,1a69h可以书写为0 x1a69。嵌入的汇编语言代码不能使用MASM的伪指令来定义数据。在嵌入的汇编语言代码中,不需要保护寄存器EAX、EBX、ECX、EDX、ESI和EDI的值,必要时由C/C+编译器负责生成保护指令。需要保护寄存器DS、SS、ESP、EBP以及方向标志DF的值。嵌入的汇编语言指令,除了可以使用立即数与寄存器外,还可以使用C/C+程序中定义的标识符,如常量、变量、标号、函数名与函数参数等。C/C+编译器自动将它们转换成相应汇编语言指令的操作数,并在标识符前自动加下划线。,C/C+程序调用汇编语言过程,汇编语言程序设计,46,调用约定 包括_cdecl和_stdcall两种:C/C+函数缺省采用_cdecl调用约定,这种约定在函数名前自动加一个下划线,从右到左将实在参数压入堆栈,由函数的调用者负责堆栈的平衡:_函数名 Win32 API函数采用_stdcall调用约定,这种约定从右到左将实在参数压入堆栈,由函数本身负责移去调用者压入堆栈的参数,函数名在编译后被转换为如下形式:_函数名参数长度 其中,参数长度是指参数表的字节数(十进制)。例如,设函数fun有两个32位参数,则供外部模块调用的名称为 _fun8,C/C+程序调用汇编语言过程,汇编语言程序设计,47,声明约定 在Microsoft Visual C+中,需要用extern C对所要调用的外部过程、函数和变量予以声明。形式:extern C 返回值类型 调用约定 函数名(形式参数表);extern C 变量类型 变量名;在用汇编语言编写的程序中,必须用public声明供外部模块使用的标识符:PUBLIC标识符1,标识符2,不同语言编写的程序模块分别进行汇编或编译,最后把所有的目标文件连接在一起。,C语言程序的汇编输出*,汇编语言程序设计,48,在Turbo C+或Borland C+编程环境下,可用TCC或BCC行命令把一个C语言的源程序转换成汇编语言的源程序。,C语言程序清单:#include int sum(int a,int b,int c)return(a+b+c);void main()int a,b,c;a=b=12;c=32;printf(%d,sum(a,b,c);,_TEXTsegment byte public CODE;代码段语句_TEXTends _DATA segmentwordpublic DATA;数据段的定义_DATAends;下面说明函数的属性public _main end,汇编语言的详细清单:,汇编语言程序设计,49,多模块程序设计,多模块程序的组织,源文件级的连接:使用INCLUDE 缺点:由于合并后的源文件为一个汇编单位,源文件与被包含文件的标识符不能重复。目标文件级的连接:各模块单独汇编。常用的方法:二者结合。根据功能的相对独立性,将整个程序分为若干个.ASM文件,单独编写;将公共的常量定义、宏定义、外部过程声明等组织在一个或多个.INC文件中;.ASM文件根据需要使用INCLUDE。,汇编语言程序设计,50,多模块程序开发的基本步骤,模块的划分;编写源程序;按模块组织成.ASM文件;汇编:将每个.ASM文件分别汇编为.OBJ文件;将所有.OBJ文件连接为一个完整的.EXE文件。,多模块程序设计,汇编语言程序设计,51,多模块间的通信 通过公共标识符的定义和引用,外部过程的参数传递等来实现。,1.PUBLIC伪指令 PUBLIC 标识符,标识符表示这些标识符是本模块定义的、可被外部模块引用的公共标识符,可以是变量名、标号、过程名以及由EQU(或=)定义的符号名。2.EXTRN伪指令 EXTRN 标识符:类型,标识符:类型 表示这些标识符是外部模块定义、本模块要引用的外部标识符,主要类型包括:NEAR和FAR(用于过程)。BYTE、WORD、DWORD等(用于变量)。,多模块程序设计,汇编语言程序设计,52,Make文件的使用,make文件是一个文本文件,用来描述文件之间的依赖关系。make文件由依赖语句和处理该依赖的命令组成。依赖语句的形式如下:目标:依赖文件 若依赖文件已发生变化,则执行依赖语句后面的命令。例如:pgm.exe:pgm1.obj pgm2.objml/Fe pgm.exe pgm1.obj pgm2.obj 表示pgm.exe依赖于pgm1.obj与pgm2.obj,只要pgm1.obj或pgm2.obj发生任何变化,均应重新建立pgm.exe文件。,多模块程序设计,汇编语言程序设计,53,子程序库,C/C+语言的程序设计环境提供了大量库文件,库文件中包含了大量的标准函数或过程。用户可以创建自己的库文件。库文件可以看成是子程序的集合。库文件中存储着子程序名、子程序的目标代码以及连接所需要的重定位信息。当某目标文件与库文件相连接时,LINK程序只把目标文件所用到的子程序从库文件中找出来,并合并到最终的可执行文件中,而不是把库中所含的全部子程序都纳入最后的可执行文件。,汇编语言程序设计,54,建立库文件命令LIB,MS-DOS系统中显示命令LIB的用法:lib/?Windows系统中显示命令LIB的用法:D:MASM611BINLIB/?,汇编语言程序设计,55,1)各选项的解释,2)命令项的解释:,汇编语言程序设计,56,建立库文件举例,假设现有目标文件sub1.obj、sub2.obj和sub3.obj,要用它们建立库文件mylib.lib。方法1:把所有目标文件一次性加入到库文件中lib mylib+sub1+sub2+sub3方法2:随着目标文件的逐个生成,而依次加入到库文件中lib mylib+sub1lib mylib+sub2lib mylib+sub3假如源文件sub3.asm已修改,并也生成了新的目标文件sub3.obj,这时,就需要把库文件mylib.lib中的sub3.obj替换成新的目标文件。可用下面命令来实现替换:lib mylib-+sub3,

    注意事项

    本文(汇编语言第9周-高级汇编.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开