10讲:宏汇编、C语言调用汇编

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

*作业6:P124:题3-2,
22
PUBLIC 名字 [,…] 功能:定义可以被其它模块引用的全局名字. 二、外部过程的调用 主模块: EXTRN SUB-PROC:FAR CODE SEGMENT MAIN-PROC PROC FAR … CALL SUB-PROC … RET MAIN-PROC ENDP
12
源自文库
CODE ENDS END MAIN-PROC 子模快: CODE SEGMENT PUBLIC SUB-PROC SUB-PROC PROC FAR … RET SUB-PROC ENDP CODE ENDS END
18
;exm3-16c.asm _text segment word „code‟ assume cs:_text punlic _sort _sort proc far push bp mov bp,sp push si push di …
19
pop di pop si pop bp _sort endp _text ends (三) 汇编与连接 1.对汇编源程序进行汇编. MASM exm#3-16c.asm exm3-16c.obj
20
2.建立exm3-16c.prj工程文件,包括: exm3-16 exm3-16c.obj 3.TURBO C下,用Compile/Build all选项 生成 exm3-16.exe(注意其它选项). 4.在DOS下执行.
21
本章小结
• • • • • 标准汇编源程序结构及程序设计。 PSP及返回DOS方法。 常用伪指令(段定义、常量、变量、标号等) 伪指令与指令、宏定义与子程序的区别。 常用DOS功能调用。
第十讲 宏汇编
3-7 宏汇编与条件汇编 一、宏定义、宏调用和宏扩展 宏定义:将一段反复使用的汇编指令定义 为宏(MACRO)。 例:SHIFT MACRO ;宏定义起始 宏名 MOV CL, 4 宏体 SAL AL, CL ENDM ;宏定义结束
1
宏调用:用宏名(也称宏指令)。 宏扩展:汇编时,将宏指令替换成宏体。 例:源程序 汇编时 … … SHIFT MOV CL, 4 … SAL AL, CL SHIFT … MOV CA, 4 SAL AL, CL 注:与子程序一样,可以简化源程序书写, 但有区别.
4
消除宏定义:PURGE 宏名 [,…] 二 、LOCAL伪指令 汇编时定义变量、标号,并保证唯一。 格式:LOCAL 参量1,参量2 , … 例: CHANGE MACRO;16进制变ASCLL LOCAL P1 CMP AL,10 JL P1 ADD AL, „A‟- „0‟-10 P1: ADD AL, „0‟ ENDM 5
13
三、外部数据变量的引用 主模块中供子模快引用的变量用PUBLIC 说明;而引用该变量的子模块要用EXTRN 说明它引用的变量名和类型。 例3-15 多字节加法并显示,自阅。
14
3-9 高级语言调用汇编语言子程序
混合语言编程:高级语言实现功能;
汇编语言实现速度。 参数传递:传值,传址两种
一、C语言调用汇编语言子程序 (一)调用规则 1.在C中用“EXTRN”对调用函数说明. 2.函数名不超过8个字符,并在前加下划线. 3.参数入栈按反序,即第一个参数最后入栈.
2
源程序:主程序 子程序 … SHIFT PROC CALL SHIFT MOV CL, 4 … SAL AL, CL CALL SHIFT RET 宏定义与子程序的区别: 1.子程序在运行时起作用;而宏定义在汇 编时起作用. 2.相同程序,子程序省目标码,而宏定义执 行速度快.
3
宏定义可以带参数: 例: SHIFT1 MACRO X,Y MOV CL, X SAL Y,CL ENDM 调用时: SHIFT1 2, BX;BX算术左移2位. 例: SHIFT2 MACRO X,Y,Z MOV CL, X S&Z Y,CL ENDM 调用时: SHIFT2 2, SI,HR;SI逻辑右移2位
若两次调用CHANGE,则宏展开为: CMP AL,10 JL ??0000 ADD AL, „A‟-„0‟-10 ??0000: ADD AL „0‟ … CMP AL,10 JL ??0001 ADD AL, „A‟-„0‟-10 ??0001: ADD AL „0‟ 避免标号重复.
6
三、重复伪指令 1.REPT 格式:REPT 表达式(重复次数) … ;指令体 ENDM 例: X=0 REPT 10 X=X+1 DB X ENDM 把1—10分配给10个连续M单元.
15
4.值传递时,参数类型不同,入栈字节数不 同,见表3-5,图3-16. 5.汇编程序中,要有对代码段说明部分, 一般用“_TEXT”说明,过程名用下划线, 且为PUBLIC.若C程序为小模式,汇编用 近(NEAR)过程;大模式,用远(FAR)过程. 6.汇编程序取C的参数时,要跨过栈区的 BP(2字节)值及返回地址(FAR:4字节, NEAR:2字节). 7.C程序允许用SI和DI放局部变量,因此汇 16 编程序中应入栈保护.
7
2.IRP 格式: IRP 形参 <重复参数表> … ;指令体 ENDM 例: IRP X <1,2,3,4,5,6,7,8,9,10> DB X ENDM 将1~10分配给10个连续M单元.
8
3.IRPC 格式: IRPC 形参, 字符串 … ;指令体 ENDM 重复次数为字符串个数. 例: IRPC X, 0123456789 DB X+1 ENDM 将1~10分配给10个连续M单元.
8.数据返回C程序时,类型不同,使用的寄 存器不同,见表3-6. 例: CHAR 型: AL LONG 型: DX,AX (二) 举例 例3-16 气泡排序用汇编;数组元素在C程序 中输入,基本程序结构如下:
17
;exm3-16.c #include “stdio.h” extren void sort(int*,int); Main() { int aa[50]; … sort(aa,n) … }
9
四、条件汇编 有条件地将源程序进行汇编。 格式: IF XX ;条件 … [ELSE]; … ENDIF 条件伪指令见表3-4
10
3-8 外部引用与全局说明 模块化设计需求. 一、EXTRN和PUBLIC伪指令 定义模块间的过程调用和变量引用的相关属性 格式:EXTRN 名字:类型 [,…] 功能:指示在本模块中使用该名字,但这名字的 定义是在要连接的其他模块中定义的. 注:1.名字指过程名,变量(和符号常量). 2.一般放在程序模块最前面. 3.用EXTRN说明的名字要在另一个模块中 用PUBLIC定义. 11
相关文档
最新文档