汇编语言第9周-高级汇编.ppt_第1页
汇编语言第9周-高级汇编.ppt_第2页
汇编语言第9周-高级汇编.ppt_第3页
汇编语言第9周-高级汇编.ppt_第4页
汇编语言第9周-高级汇编.ppt_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语言程序设计 主讲:江苏苏 第9周 大课 本周 主要内容 宏汇编与宏指令 高级汇编伪指令* 重复汇编 条件汇编 汇编控制语句* 汇编语言和C/C+语言混合编程* C语言程序的汇编输出 多模块程序设计的基本方法 程序库的建立 汇编语言程序设计2 汇编语言程序设计3 第7章 高级汇编语言技术 主要内容 宏汇编与宏指令 重复汇编 条件汇编 汇编控制语句* 汇编语言程序设计4 宏汇编、重复汇编、条件汇编 统称宏结构 宏(Macro)是汇编语言的一个特点,它是与子程序 类似又独具特色的另一种简化源程序的方法。 宏(宏定义)具有宏名的一段汇编语句序列 宏定义时书写 宏指令宏名作为一条指令直接使用,相当于宏定 义体的缩写 宏调用时书写 宏展开汇编时用宏体代替宏指令的过程 宏汇编时实现 宏汇编的概念 汇编语言程序设计5 MACRO和ENDM是二个必须成对出现的关键字,它们分别表 示宏定义的开始和结束; MACRO和ENDM之间的部分是宏的定义体,它是由指令、伪 指令或引用其它宏所组成的程序片段,是宏所包含的具体内容 “宏名”是由程序员指定的一个合法的标识符,它代表该宏 宏名可以与指令助忆符、伪指令名相同。在这种情况下,宏指 令优先,而同名的指令或伪指令都失效;此方法不提倡 在ENDM的前面不要再写一次宏名,这与段或子程序定义的结 束方式有所不同; 在宏定义的首部可以列举若干个形式参数,每个参数之间要用 逗号分隔。 宏定义的格式 宏名macro 形参表 宏定义体 endm 汇编语言程序设计6 宏定义例: mainbeginMACRO ;定义名为mainbegin的宏,无参数 mov ax,data;宏定义体 mov ds,ax ENDM;宏定义结束 mainendMACRO retnum;带有形参retnum mov al,retnum;宏定义中使用参数 mov ah,4ch int 21h ENDM dispmsg MACRO string lea dx, offset string mov ah, 09h int 21h ENDM 宏注释符 汇编语言程序设计7 宏调用的格式 宏名实参表 msgdb this is a macro instruction., $ start: mainbegin;宏调用,建立DS内容 dispmsg msg;宏调用,显示字符串 mainend 0;宏调用,返回DOS end start 宏调用的实质是在汇编过程中进行宏展开 宏展开的具体过程是:当汇编程序扫描源程序遇到已有定 义的宏调用时,即用相应的宏定义体取代源程序的宏指令, 同时用位置匹配的实参取代形参 汇编语言程序设计8 宏展开 在汇编时,用宏定义体的代码序 列替代宏指令的过程。 start: mainbegin;宏指令 1mov ax, data;宏展开 1mov ds, ax dispmsg msg;宏指令 1 lea dx, offset string;宏展开 1mov ah, 09h 1int 21h mainend 0;宏指令 1mov al, 0;宏展开 1mov ah, 4ch 1int 21h 汇编语言程序设计9 宏定义例 shlextmacro shlreg, shlnum push cx mov cl, shlnum shl shlreg, cl pop cx endm 宏指令 shlext ax, 6 宏展开 1push cx 1mov cl, 06 1shl ax, cl 1pop cx 灵活使用宏的参数 -1 宏定义时,参数可以 是常数、变量、存储单 元、指令(操作码)或 它们的一部分,也可以 是表达式; 宏定义体可以是任何 合法的汇编语句,既可 以是硬指令序列,又可 以是伪指令序列。 汇编语言程序设计10 统一4条移位指令的宏指令 shiftmacro soprand, snum, sopcode push cx mov cl, snum s标号后不能写指令,但可写注释 汇编语言程序设计14 ;宏定义 absolmacro oprd local next cmp oprd,0 jge next neg oprd next: endm ;有二条宏调用 absol word ptr bx absol 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对应写成 REPT IRP IRPC 汇编语言程序设计20 按参数值 重复 REPEAT 重复次数 重复体 ENDM char = A REPEAT 26 db char char = char +1 ENDM 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 regad ENDM 1push ax 1push bx 1push cx 1push dx 汇编后 汇编语言程序设计22 按参数字符个数 重复 FORC 形参, 字符串 重复体 ENDM FORC regad,dcba pop 满足,汇编分支语句体1 分支语句体1 ELSE;不满足,汇编分支语句体2 分支语句体2 ENDIF;条件汇编结束 汇编语言程序设计24 伪指令含义 IF exp 若数值表达式exp的值不为0,则语句组1包含在 目标文件中 IFE exp 若数值表达式exp的值为0,则语句组1包含在目 标文件中 IFDEF symb 若符号symb有定义或被说明为EXTRN,则语句 组1包含在目标文件中 IFNDEF symb 若符号symb没有定义,也没被说明为EXTRN, 则语句组1包含在目标文件中 IFB 在宏引用时,若该形参没有相应的实参相对应, 则语句组1包含在目标文件中 IFNB 在宏引用时,若该形参有相应的实参相对应,则 语句组1包含在目标文件中 IFIDN , 若参数1参数2,则语句组1包含在目标文件中 IFDIF , 若参数1参数2,则语句组1包含在目标文件中 IF1 若汇编程序在第一遍扫描时,则语句组1包含在 目标文件中 IF2 若汇编程序在第二遍扫描时,则语句组1包含在 目标文件中 汇编语言程序设计25 pdatamacro num IF num lt 100;如果num mov ah,4ch;没有参数 else mov ax,4c00h+(retnum AND 0ffh) ; 有参数 endif int 21h ENDM 例:修改宏定义mainend, 使其可以不带参数调用 mainendMACRO retnum ;带有形参retnum mov al,retnum;宏定义中使用参数 mov ah,4ch int 21h ENDM 可以调用mainend 也可以调用mainend 6 汇编语言程序设计27 宏的嵌套和递归* 1、在宏定义体中出现其它宏调用,原则 是先定义后调用。 例: abs macro opr1, opr2 mopm sub, opr1, opr2 mopm add, opr1, opr2 endm 2、在宏定义体中包含其他宏定义,原则 是只有先调用外层宏,才能调用内层 宏;不推荐此编程方式,降低了源程 序的可读性、可维护性! mopm macro op, v1, v2 mov ax, v2 op v1, ax endm 汇编语言程序设计28 宏的递归调用例: 书上例7.23:计算数X乘2N,通过宏递归来实现,利用IF 语句来结束递归。 定义宏: POWER MACRO X,N IFE N EXITM ENDIF SAL X,1 COUNT = COUNT +1 IF COUNT - N POWER X, N ENDIF ENDM 调用宏: Count =0 POWER X,4 宏展开: SAL X,1 SAL X,1 SAL X,1 SAL X,1 调用宏: Count =0 POWER X,0 汇编语言程序设计29 灵活运用条件汇编 - 1 书上例7.25:检查将参与运算的符号有否定义。P.270 定义宏: Divide MACRO dividend,divisor, quotient local comp, out cntr = 0 IFNDEF dividend cntr = 1 ENDIF IFNDEF divisor cntr = 1 ENDIF IFNDEF quotient cntr = 1 ENDIF if cntr exitm endif mov ax, dividend mov bx, divisor sub cx, cx Comp:cmp ax, bx jb out sub ax, bx inc cx jmp comp Out:mov quotient, cx ENDM ;数据定义 dd1 dw 200 ds1 dw 25 quo1 dw ? dd2 dw 175 ds2 dw 35 quo2 dw ? 宏调用: Divide dd1, ds1, quo1 Divide dd2, dss2, quo2 宏展开: Divide dd1, ds1, quo1 cntr = 0 mov ax, dd1 mov bx, ds1 sub cx, cx ?0000:cmp ax, bx jb ?0001 sub ax, bx inc cx jmp ?0000 ?0001:mov quo1, cx Divide dd2, dss2, quo2 cntr = 1 汇编语言程序设计30 灵活运用条件汇编 - 2 书上例7.28:根据标志生成相应操作指令。P.276 定义宏: MOVIF MACRO TAG IFIDN , REP MOVSB EXITM ENDIF IFIDN , REP MOVSW ELSE REP MOVSB ENDIF ENDM 宏调用: MOVIF B MOVIF W MOVIF 宏展开: 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 条件表达式中的操作符 操作符功能操作符功能操作符功能 = 等于汇编语言语句 过程名ENDP 过程声明伪指令:用于事先声明过程的结构 过程名 PROTO 调用距离 语言类型, 参数:类型 过程调用伪指令 INVOKE 过程名, 参数,. 汇编语言程序设计39 .model small checksumd PROTO c:word, a:word;声明过程 .stack .data arraydb 12h, 25h, 0f0h, 0a3h, 3 db 68h, 71h, 0cah, 0ffh, 90h countequ $ - 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:word mov bx, arrayp;BX数组的偏移地址 mov cx, countp;CX数组的元素个数 xor al, al sumd:add al, bx;求和:ALAL+DS:BX inc bx loop sumd ret checksumd endp end 列表文件 例:数组求和的汇编语言源程序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,04h mov 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 cx mov bx, arrayp;arrayp=BP+6 mov cx, countp;countp=BP+4 . ret *pop cx;结尾代码 *pop bx *pop bp *ret 0000h checksumc 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 out dx, ax 汇编语言与C/C+语言的混合编程 汇编语言程序设计45 说明: 在嵌入的汇编语言指令中,可以使用C/C+语言的数据格式 。例如,1a69h可以书写为0x1a69。 嵌入的汇编语言代码不能使用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); _TEXT segment byte public CODE ;代码段语句 _TEXT ends _DATA segment word public DATA ;数据段的定义 _DATA ends ;下面说明函数的属性 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.obj ml /Fe pgm.exe pgm1.o

温馨提示

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

评论

0/150

提交评论