汇编语言与接口技术课件 h3-8 源程序的结合_第1页
汇编语言与接口技术课件 h3-8 源程序的结合_第2页
汇编语言与接口技术课件 h3-8 源程序的结合_第3页
汇编语言与接口技术课件 h3-8 源程序的结合_第4页
汇编语言与接口技术课件 h3-8 源程序的结合_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、13.8 源程序的结合源程序的结合 在源程序中使用INCLUDE伪指令,汇编时汇编程序会将多个文本文件中源程序结合到一起。 格式:格式:INCLUDE 文件名文件名 (文件名可带有盘符和路径,采用DOS 有关规则表示)。 伪指令INCLUDE指示汇编程序将指定的文本文件从本行起加入汇编, 直到该文本文件的最后一行汇编完后,继续汇编随后的语句。 2例3.72 (1) MAIN.ASM 文件文件 MODEL SMALL STACK 100 DATA INCLUDE DATAASM CODE STARTUP MOV BX,OFFSET BUF ;BUF在DATAASM中 CALL DISP ;DIS

2、P在DATASUBASM中 EXIT INCLUDE DATASUBASM END3 (2) 本文件DATA.ASM包含的数据部分如下: BUF DB 20 DUP(?) LPO DW 20H (3) 文本文件DATASUB.ASM包含的过程部分如下: DISP PROC RET DISP ENDP 可以将常用的宏指令存储在同一个文件中,在程序中使用INCLUDE指令将此文件包含进来。 包含宏的INCLUDE指令一般放在代码段之前特别是必须在使用宏之前插入。 4 例3.73 假设程序中定义了5个宏:CLC、SHIFT、UP、DONE、READ。 这5个宏存放在ABCINC文件中。 在START

3、.ASM文件中可以使用INCLUDE ABC.INC指令,汇编程序则可以从ABC.INC文件中找到START.ASM文件中使用的宏的定义。(P106) 5 CLC MACRO ENDMSHIFT MACRO ENDM UPMACRO ENDMDONE MACRO ENDMREAD MACRO ENDM (2) ABC.INC文件6 .MODEL SMALL .STACK 100 INCLUDE ABC.INC .DATABUF DB 20 DUP(?) .CODE .STARTUP CLCMOV AL,BLSHIFTCMP AL,0JZ LP1UPJMP LP2 LP1: DONE LP2:

4、.EXITEND (2) START.ASM文件73 39 9 多模块程序设计多模块程序设计 将程序分为多个模块,分别编译为多个OBJ文件,再通过连接程序连接为一个EXE文件。模块之间数据或者参数的正确传递,需要使用PUBLIC和EXTRN伪指令。 PUBLIC伪指令:(公用的)表明数据、代码的标号或整个段在其他程序模块中都是可用的。 EXTERN伪指令:(外部的)表明它对应的语句标号处于别的模块中。 8 1PUBLIC伪指令 PUBLIC伪指令用以表明一个标号是公共的,它可以被其他模块使用。 该标号可以是跳转地址、一个数据地址或整个段。 一般格式如下: PUBLIC NAME ,NAME,

5、PUBLIC伪指令需要放在NAME说明之前。 9 例3.74 PUBLIC伪指令使用举例1 PUBLIC DATA1 ;定义 DATA1、DATA2 是公共的 PUBLIC DATA2 PUBLIC DISP ;定义全局变量 DATA DISP EQU 5 DATA1 DB 100 DUP(?) DATA2 DB 100 DUP(?) 10 例3.75 PUBLIC伪指令使用举例2 MODEL SMALL PUBLIC READ ;定义 READ是公共的 CODE READ PROC FAR MOV AH,6 ;读取键值 INT 21H RET READ ENDP EXIT END11 2EX

6、TERN伪指令 EXTERN伪指令用法和C类似,一般格式如下: EXTERN NAME :TYPE 功能:说明NAME在外部程序中,编译时先将NAME的地址空着,连接时再填入。 NAME为子程序或者标号; TYPE表示和NAME相关的属性,参见表3.10(P108)。 12 例3.76 (1) MAIN.ASM文件 MODEL SMALL STACK 100 EXTERN NUM: BYTE EXTERN DISP: NEAR CODE MAIN PROC STARTUP MOV AL,NUM CALL DISP MOV BUF,AL MOV DL,AL MOV AH,2 INT 21H EX

7、IT MAIN ENDP DATA BUF DB ? END (2) DISP.ASM文件 MODEL SMALL PUBLIC DISP PUBLIC NUM DATA NUM DB ? CODE DISP PROC STARTUP RET EXIT DISP ENDP END 主程序和外部子程序的内存模式应该一致,外部子程序最后的END指令不指明其对应那个程序入口点,则可为任何程序调用。133.10 3.10 库库文件 库文件是适用于各种程序中的常用过程的集合,这些过程的OBJ文件由MASM汇编程序中的LIB程序连接到一个LIBRARY文件中,库文件形式为FILENAME.LIB。 过程名

8、在库文件中必须定义成公用的,但过程名不一定与文件名一致,在每个文件均汇编完后,使用LIB程序将这些文件加入到库文件中。 当库文件与源程序连接时,与库中相关的过程由库中移出来并添加到程序之中。14 例3.77 将READ.OBJ和WRITE.OBJ文件添加到RW库中。C:MASM611 BIN LIBMicrosoft (R) Library Manager Version 3.20.010Copyright (C) Microsoft Corp 1983-1992.All rights reserved.Library name: RW ;输入库文件名Library file does not

9、 exist. Create? (y/n) ;若库文件不存在,建立Operations: READWRITEList file: RWOut Library : RW 15 若要再加入一个文件到库中,在使用LIB之后,输入同样的库文件名,在Operations提示后,输入:+文件名; 若想删去库中某个文件,则在operations提示后的输入:文件名(该文件名是你想删去的文件)。 一旦库文件与你的程序连接后,可应用于程序中的过程调用,被调用的过程必须为库文件名前加上EXTERN说明的过程。163 311 11 汇编语言与高级语言的接汇编语言与高级语言的接 汇编程序可以通过过程和高级语言如C/C

10、,BASIC,PASCAL及FORTRAN一起使用,通过调用协议实现调用。 调用协议分为两种: C语言调用协议语言调用协议,适用于C/C; PASCAL语言调用协议语言调用协议,适用于BASIC、PASCAL、FORTRAN语言。 173 311111 C1 C语言调用协议语言调用协议(参数传递原则) 在C语言调用协议中,C语言调用汇编函数按照从右到左的顺序向堆栈压入参数。例3.78 C/C函数调用 void test (2,3) ; 这个函数调用可以汇编成 MOV AX,3 PUSH AX MOV AX,2 PUSH AX 图3. 18 参数传递时的堆栈 CALL TEST ADD SP,4

11、 ;释放参数18 Micosoft C调用汇编语言函数的声明形式: EXTERN INT TEST ( int,int );/ * in C* / EXTERN C int TEST ( int,int ); inC 在汇编语言函数TEST中,要使用堆栈帧中C调用传递的参数,可按如下编程: PUSH BP MOV BP,SP MOV AX,WORD PTR BP4 ;取参数i MOV BX,WORD PTR BP6 ;取参数j ADD AX, BX ;AX中为返回值 POP BP RET ;不带参数,C编译程序自动进行栈的调整 19 在MASM中使用PROTO语句来定义堆栈帧参数地址,其格式如

12、下: 过程名 PROTO 调用协议 形参:类型 , PROTO语句将过程声明为外部函数,并指定该过程形式参数的名称和类型,C声明了调用协议。 例如,TEST PROTO C i:SWORD,j:SWORD20 3 311112 2 内存模式和段的约定内存模式和段的约定 要实现MASM和C的连接,MASM要遵守与C兼容的段命名约定。例如兼容的代码段允许C调用MASM过程,兼容的数据段允许C访问MASM中的数据。 MASM与C的内存模式必须一致,使用MASM中简化的段定义结构,可以具有和C语言一致的内存模式和兼容的段命名,汇编程序可以自动完成与C的内存模式和段兼容的全部工作。 21 伪指令MODE

13、L 指明用简化的段定义伪指令创建的段,应当与选定的内存方式TINY、SMALL、C O M PA C T 、 M E D I U M 、 L A R G E 等 兼容,CODE、DATA等简化的段定义伪指令产生的段与C/C兼容。 (C程序编译前,在TC集成环境下,可在Compiler 项下的Model子菜单下选择内存模式) BASIC、PASCAL、FORTRAN采用远程调用,则不存在内存模式兼容问题,可以不需要特别指定内存模式。 223 311113 3 数据类型与结果返回数据类型与结果返回 MASM使用的数据类型与高级语言不同,其区别见表3. 11(P111)。 C函数调用汇编程序,汇编程

14、序一般将返回值放在AL,AX或DX:AX中,当返回值大于4个字节时(如结构、实数获双精度数),则存放在静态变量存储区,这个存储区的指针在AX寄存器中(近程),若指针是远程的,段地址存放在DX中,段内偏移地址存放在AX中。 堆栈帧的释放工作,在C调用时,由C释放堆栈帧;在其它高级语言调用时,由汇编程序在返回前,作释放堆栈帧的工作。 23返回到Turbo C的数据类型与存放的寄存器数据类型数据类型寄存器寄存器charAXunsigned charAXintAXunsigned intAXlong高位在DX中,低位在AX中unsigned long高位在DX中,低位在AX中float高位在DX中,低

15、位在AX中double值的地址在AX中struct和union地址在AX中near指针AXfar指针DX中为段地址,AX为偏移地址24 3114 PASCAL语言调用协议语言调用协议 PASCAL语言调用协议也适用于BASIC、FORTRAN、PASCAL语言函数调用MASM。 按照从左到右的顺序向堆栈压入参数,远程调用堆栈帧结构如图3.20所示。例3.79 PASCAL调用汇编程序举例。 FOUND ( i,j ) MASM定义过程也使用PROTO语句。例如:FOUND PROTO PASCAL i:WORD, j:WORD 参数 i 参数 j 返回地址 CS 返回地址 IP BP=SP 返

16、回地址 IP BP 25 3115 MASM调用高级语言 通过伪指令INVOKE, MASM可以实现对C/C、PASCAL、BASIC、FORTRAN等语言的调用。 INVOKE伪指令与CALL指令不同之处: INVOKE伪指令要根据调用时协议的要求来释放堆栈帧中的参数(自动隐含此操作)。 INVOKE伪指令格式为 INVOKE 过程名,参数1,参数2, 26 3116 C调用MASM举例举例 例:C程序从键盘接受输入的整数,然后调用汇编子程序对接收的数进行检查, 若是0 9之间的数,则将其转换为ASCII 码,并将其存放在由C程序传递来的地址指针&ch指出的地址中,同时将0送AX作为返回参数

17、。 若从键盘接收的是字符,则汇编语言子程序返回非零值,C程序继续循环,直到接收到的是数字为止。 最后C程序从&ch地址中取出ASCII 码显示。27C程序如下:#includeint extern num(char *ch,int k);main() int in; char ch; doprintf(nplease input); scanf(%d,&in); getchar(); while( num(&ch,in); printf(n%c,ch);28汇编子程序如下:.model small public _num ;说明子程序_num是公用的.code_num proc push bp

18、 mov bp,sp mov bx,bp+4 ;取指针偏移量&ch mov ax,bp+6 ;取数据in cmp ax,9 ja exit add ax,30h mov bx, ax mov ax,0exit: pop bp ret_num endp end29 例3.80 打印两数之和 主模块为C语言程序SUN.C,该程序功能为打印两数之和; 被调用汇编程序SUN.ASM,该程序功能为实现两数和。 / * SUNC Procedure is in SUN.ASM * / / * Compile with CL SUN.C SUN. OBJ * # include stdio.h extern int SUNC (int a,int b) ; void main ( ) printf (SUM is %d n,SUNC(5,50); ;Called from Main Program in SUM.C;Assemble With ML/c SUN.ASM MODEL SMALL,C SUNC PROTO C a:SWORD,b:SWORD CODE SUNC PROC C a:SWORD,b:SWORD MOV AX,a MOV BX,b

温馨提示

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

评论

0/150

提交评论