




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 汇编语言高级编程技术,8.1 宏 8.2 汇编高级语法 8.3 模块化程序设计 8.4 C和汇编的混合编程 8.5 程序优化,8.1 宏,8.1.1 宏指令的定义和使用 宏指令的使用有3个步骤: 宏定义 宏调用 宏扩展,宏定义,格式: 宏指令名 MACRO 形式参数表 ;宏指令体 ENDM 形式参数表给出形参,形参之间用逗号隔开。,宏调用和宏扩展,宏调用的格式 : 宏指令名 实参数表 实参应和形参顺序一致 宏扩展 : 用宏指令体的语句序列替换宏指令名 并用实参替换形参,2LOCAL伪操作,程序中多次调用宏指令,展开时其中的标 号重复,导致编译出错。 解决办法 :将宏定义体中的标号说明为
2、局 部标号 格式:local 标号1,标号2, 标号3, ,3PURGE伪指令,PURGE伪指令取消已定义的宏指令 格式为: PURGE 宏指令名 , 宏指令名, 注意: 宏指令被取消的程序就不能再使用这个宏指令 指令取消之前的宏调用已经被展开,不受影响,8.1.2 宏指令中参数的使用,1MOVE宏指令 MOV指令不允许源操作数和目标操作数同时为内存操作数,我们如此定义: dwVarA DWORD ? dwVarB DWORD 50 MOVE MACROX, Y PUSH Y POP X ENDM 调用MOVE dwVarA,dwVarB,可将后者内容赋给前者,2SUBX宏指令,SUB指令执行
3、后,目标操作数中的被减数被“差” 替换掉。我们可以定义一个新的宏指令,它包括 3个参数:被减数(minuend)、减数 (subtrahend)、差(difference)。 SUBX MACRO minuend, subtrahend, difference PUSH EAX MOV EAX, minuend SUB EAX, subtrahend MOV difference, EAX,SUBX宏指令(续),;接上页程序 POP EAX ENDM 要计算ECX=EDX8,就调用SUBX宏: SUBX EDX, 8, ECX,3Idx宏指令,对给定的数组下标i, j,元素的地址为: 数组首地
4、址 + (i * RowSize + j) * ElementSize RowSize表示为数组每行的大小 ElementSize表示为每个元素的大小 横线部分可以用宏指令表示: Idx MACRO I, J, RowSize IMUL EBX,I, RowSize ADD EBX, J,Idx宏指令(续),;接上页程序 ADD EBX, EBX SHL EBX, 2 ENDM 调用上述Idx宏指令就可求得数组元素的位置,8.1.3 特殊的宏操作符,1操作符 重复块 ENDM REPT也可以写做repeat。 数值表达式决定重复次数 重复块中可以是任何有效的汇编语句,重复块中是指令序列 的例子
5、: 打印数字9、99、999、9999的平方数 FmtSqureStrBYTE%d * %d = %d, 0ah, 0 X=9 REPT4 INVOKE printf, offset fmtSqureStr, X, X, X*X X =X*10+9 ENDM,2不定重复伪指令IRP,IRP指令由参数来决定重复次数,格式为: IRP MACRO 形参,实参表 ; 重复块 ENDM IRP也可以写做for 形参只能有一个,实参表中可以有多个参数 实参表中参数个数就是重复次数,按顺序取代形参,下面IRP的实参表中包含3个参数 IRP VALUE, BYTE VALUE, 0 ENDM 其结果相当于:
6、 BYTE USB, 0 BYTE FLOPPY, 0 BYTE CD-ROM, 0,3不定重复伪指令IRPC,参数表用一个字符串来表示 ,格式为 IRPCMACRO 形参,字符串 ; 重复块 ENDM IRPC也可以写做FORC 形参只有一个,字符串可以包括字母、数字等, 字符个数就是重复次数 ; 字符串中的字符按顺序替代形参,例如,使用字符串123,每次用一个字符来代替Z。 IRPC Z, 123 BYTE Z ENDM 展开后的结果为: BYTE 1 BYTE 2 BYTE 3,8.1.6 条件汇编,条件汇编伪指令的格式如下: IFXXYY ; 语句块1 ELSE ; 语句块2 ENDI
7、F ELSE可以不写,对于IFXX YY 条件为真时,将语句块1包含在程序中; 条件为假时,将语句块2包含在程序中。,条件汇编伪指令,条件汇编伪指令大体上分为: 1IF和IFE伪指令 2. IFB和IFNB伪指令 用在宏定义体中,用来确定形参是否为空 3IFDEF和IFNDEF伪指令 用一个符号DEBUG来控制是否包括打印语句 4IFIDNI伪指令 举例:IFIDNI,8.2 汇编高级语法,汇编语言语法问题: 分支和循环程序结构存在标号定义和程序流程复杂的问题 可读性、简洁性、可维护性不如高级语言 编写汇编程序时比较烦琐 MASM引入了一系列伪指令来实现条件测试、分支和循环语句等。,8.2.1
8、 条件测试表达式,条件测试表达式的形式 : 1.寄存器或内存变量 例如:x ;x不等0时为真 EAX ;EAX不等于0时为真 2. 利用关系运算符 (数值表达式1)关系运算符(数值表达式2) 关系运算符比较数值表达式1和数值表达式2的内容,关系运算符列表,条件测试表达式,3. 利用逻辑运算符 (关系或数值表达式1) 逻辑运算符 (关系或数值表达式2) 逻辑运算符对表达式进行逻辑运算。 逻辑运算符和关系运算符的语法基本和C语言基本类似。,逻辑运算符列表,条件测试表达式,4. 根据标志寄存器中的各种标志位符号,8.2.2 分支伪操作,分支语句根据条件表达式的真假执行不同的代码模块,与C语言的if/
9、elseif/else/endif相似。语法如下 .IF条件表达式1 表达式1为“真”时执行的指令 .ELSEIF条件表达式2 表达式2为“真”时执行的指令 .ELSE 上述条件均不满足时执行的指令 .ENDIF,8.2.3 循环伪操作,循环是重复执行的一组指令 ,分3种: 1 WHILE-ENDW循环: .WHILE条件测试表达式 循环体 .ENDW 首先判断条件测试表达式 如果结果是“真”,则执行循环体内的指令,结束后再判断表达式,直到表达式结果为“假”为止。 如果第一次判断结果就为“假”,则直接退出循环,循环伪操作,2 REPEAT-UNTIL循环: .REPEAT 循环体 .UNTIL
10、条件测试表达式 先执行一次循环体内的指令,然后判断条件测试表达式: 如果结果是“假”,则继续执行循环体内的指令,一直到表达式结果为“真”为止 循环体至少会执行一次,循环伪操作,3 REPEAT-UNTILCXZ循环 .REPEAT 循环体 .UNTILCXZ条件测试表达式 如果.UNTILCXZ后面没有条件测试表达式,则循环的次数由ECX指定; 如果.UNTILCXZ后面带有条件测试表达式,循环的次数由ECX和表达式共同控制。 当ECX不等于0且表达式的值为“假”时,ECX减1,继续循环 当ECX等于0或者表达式的值为“真”时,终止循环。,循环伪操作,使用.BREAK语句可以跳出循环; .BR
11、EAK后面可以加.IF ,满足条件才跳出循环。 格式:.BREAK .IF 退出条件 使用.CONTINUE语句可以跳到循环体的最后。,计算0+1+2+8+9的几个例子,例1: .WHILE/.ENDW循环形式 XOR EAX, EAX XOR EBX, EBX .WHILE EBX 10 ADD EAX, EBX INC EBX .ENDW,计算0+1+2+8+9的几个例子,例2:用.BREAK语句来终止循环 XOR EAX, EAX XOR EBX, EBX .WHILE1 ADD EAX, EBX INC EBX .BREAK .IFEBX = 10 .ENDW,计算0+1+2+8+9的
12、几个例子,例3:.REPEAT/.UNTIL循环的形式 XOR EAX, EAX XOR EBX, EBX .REPEAT ADD EAX, EBX INC EBX .UNTILEBX = 10,计算0+1+2+8+9的几个例子,例4:.REPEAT/.UNTILCXZ循环形式 MOV ECX, 10 XOR EAX, EAX XOR EBX, EBX .REPEAT ADD EAX, EBX INC EBX .UNTILCXZ,8.3 模块化程序设计,8.3.1 模块化程序设计基本概念 可以将一个大的系统分解为小的模块,各个模块可并行完成,最后组合成为一个完整的系统。,8.3.2 模块间的通
13、信,1外部引用伪指令EXTRN 格式:EXTRN 变量名:类型,. 功能:说明在本模块中用到的变量是在另一个模块中定义的,同时指出变量的类型 。 说明:EXTRN伪指令应出现在程序引用该名字之前,一般放在程序开头。,模块间的通信,2全局符号说明伪指令PUBLIC 格式:PUBLIC 名字,. 功能:本模块中定义的名字可以被其他模块使用。 说明:名字可以是变量名,也可以是子程序名。,模块间的通信,3子程序声明伪指令PROTO 格式:子程序名 PROTO C | stdcall :第一个参数类型 ,:后续参数类型 功能:说明子程序名字和参数类型,供主程序调用。 程序示例:mod1.asm mod2
14、.asm 结果:100 - 60 = 40,8.4 C和汇编的混合编程,关键:两种语言的接口问题 解决方法: 在C程序中直接嵌入汇编代码 由C语言主程序调用汇编子程序,8.4.1 直接嵌入,C语言程序中直接嵌入汇编语句 格式为:_asm 汇编语句 对于连续的多个汇编语句,格式为: asm 汇编语句 汇编语句 ,内嵌汇编语句的操作码必须是有效的80 x86指令。 不能使用byte,word,dword等语句定义数据。 内嵌汇编语句中的操作数可以是: 寄存器; 局部变量、全局变量和函数参数; 结构成员。 程序清单:inline.c (嵌入汇编),8.4.2 C程序调用汇编子程序,C源程序中所有语句
15、要符合C的语法规则; 汇编源程序的所有语句要符合汇编的语法规则; C模块可调用汇编模块中的子程序,还可以使用汇编模块中定义的全局变量; 汇编模块可调用C模块中的函数,可以使用C模块中定义的全局变量。,1C模块使用汇编模块中的变量,C和汇编有些变量类型是等价的,可以相互转换,C模块使用汇编模块中的变量,C源程序要使用汇编模块中的变量,则在汇编模 块中的变量名必须以下划线开头。 例如: _strFormula sbyte Pythagorean theorem: x*x+y*y=z*z,0 _xval sdword 3 _yval sdword 4 _zval sdword 5 C模块中使用这些变
16、量时,前面的下划线必须去掉,2汇编模块使用C模块中的变量,C模块中,应采用extern来指明变量可以由外部 模块所使用, 例如:extern int x, y, z; 在汇编模块中,要使用这个变量,应该用EXTRN 加以说明, 例如:EXTRN _x:sdword, _y:sdword, _z:sdword 使用变量如:MOV EAX, _x,3C模块调用汇编模块中的子程序,关键功能用汇编语言来编写,再由C语言来调用 程序举例: C/汇编联合编程的主模块 united.c C/汇编联合编程的子模块 unite.asm,4编译链接过程,对C模块和汇编模块分别进行编译,生成各自的.obj文件。 将
17、这些.obj文件链接成一个可执行文件 如图:,5C调用规则,上例的Verify1,Verify2,Verify3,Verify4都采用了C调用规则 , 主程序按照从右至左的顺序,将参数顺序压入堆栈; 子程序返回后,主程序通过“ADD ESP, n”指令调整ESP的值 。 如果在说明子程序时不加调用规则,则应在子程序名前加下划线,参数也应自行定义。,6stdcall调用规则,定义子程序时使用stdcall规则,不用C规则 举例: Verify2 PROC stdcall x:dword, y:dword, z:dword 在C模块中,在说明Verify2时要加上_stdcall: extern
18、int _stdcall Verify2(int x, int y, int z); int ret = Verify2(x, y, z);,7生成map文件,链接过程生成map文件 可以查看共享的变量、函数在目标文件中的真实名字 例如: link united.obj unite.obj /out:united.exe /map:united.map /subsystem:console,8.4.3 汇编调用C函数,使用PROTO说明C函数的名称、调用方式、参数类型等,如: input PROTO C px:ptr sdword, py:ptr sdword, pz:ptr sdword v
19、erify PROTO C x:dword, y:dword, z:dword 举例: C/汇编联合编程中的子模块 mix.c C/汇编联合编程的主模块 mixed.asm,8.4.4 C+与汇编,1使用C方式共享变量和函数 在C+一方,要将与汇编模块共享的变量、函数等用extern “C”的形式说明。 举例: C+/汇编联合编程 ArrSum.cpp C+/汇编联合编程 ArraySum.asm,8.4.4 C+与汇编,2C+类的实例与方法 程序demo.cpp中,有两个类A,B。 A是B的基类,类A和类B各有自己的reset ( ) 方法和output ( ) 方法。程序的输出结果为: A
20、: 1 B: 2, 3 A: 10 B: 10, 0,类A的实例a,类B的实例b所占用的内存单元的内容如图 类的vtable就像一张表格,存放它的虚函数的地址,8.5 程序优化,评价一个程序优劣 的要素: 实现思想是否合理清晰; 书写风格是否符合规范; 程序的执行效率(重要) 程序在多长的时间内能够完成(时间) 程序需要多大的存储空间(空间),8.5.1 运行时间的优化,1选择执行速度快的指令 (1)寄存器清零 将寄存器清零,有以下几种指令: MOV EAX, 0 SUB EAX, EAX XOR EAX, EAX 其中SUB,XOR指令执行速度比MOV指令快,而且所需程序空间少,所以应选这2种指令之一(XOR更常用)。,选择执行速
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 白酒回购合同协议合同书
- 景观绿化工程服务合同
- 购销合同货物清单
- 边坡防护工程劳务合同
- 用图形进行编码(教学设计)2024-2025学年四年级上册信息技术苏科版
- 8 比尾巴(教学设计)2024-2025学年语文一年级上册统编版
- 人教版初中历史与社会七年级下册 6.3.2草原风情 教学设计
- 浙江工商大学杭州商学院《供应链管理》2023-2024学年第二学期期末试卷
- 云南经贸外事职业学院《生物技术专业文献检索与科技论文写作》2023-2024学年第二学期期末试卷
- 中国药科大学《单片机原理》2023-2024学年第二学期期末试卷
- 2023年钢结构深化设计年度总结及年后展望
- 成人住院患者跌倒评估与预防(团体标准)解读
- 石膏固定的护理教学查房
- 孙燕姿所有歌曲歌词大全(11张专辑)
- 2022年学前教育生均公用经费项目绩效评价报告
- 高中英语2024届高考复习群文阅读材料1(School Life 校园生活)
- 上海专科层次自主招生考试习题集①(含答案)
- 班级管理交流-班主任工作经验交流课件(共28张ppt)
- 三聚氰胺 工艺过程概述
- (6)-2.2老虎会唱歌-高密泥叫虎
- 商铺门面分租合同范本
评论
0/150
提交评论