资源预览内容
第1页 / 共32页
第2页 / 共32页
第3页 / 共32页
第4页 / 共32页
第5页 / 共32页
第6页 / 共32页
第7页 / 共32页
第8页 / 共32页
第9页 / 共32页
第10页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
,将程序分段、采用子程序或宏结构都是进行模块化程序设计 本节介绍开发大型程序时采用的方法: 源程序文件的包含 目标模块连接 子程序库,第十章 模块化程序设计,把源程序分放在几个文本文件中,在汇编时通过包含伪指令INCLUDE结合成一体 INCLUDE 文件名 可将常用的子程序形成.ASM汇编语言源文件 可将常用的宏定义存放在.MAC宏库文件中 可将常量定义、声明语句组织在.INC包含文件中 例4.21a 宏库文件 lt421a.mac 主程序文件 lt421a.asm 子程序文件 sub421a.asm,10.1 源程序文件的包含,dispcharmacro char;显示char字符 mov dl,char mov ah,2 int 21h endm dispmsgmacro message;显示message字符串 mov dx,offset message mov ah,9 int 21h endm,Lt421a.mac,include lt421a.mac . dispmsg msg1;提示输入数据 mov bx,offset buf call input;数据输入 cmp cx,0 je start4;没有输入数据则退出 mov count,cx .;显示输入的数据 .;数据排序 .;显示经排序后的数据 start4:.exit 0 include sub421a.asm end,Lt421a.asm,子程序源文件有3个子程序 ALdisp;显示2位16进制数子程序(例4.10) sorting;排序子程序(例4.8) input;键盘输入子程序 还包含一个宏 convert;将DX两位ASCII码转换为两位16进制数,sub421a.asm,让我们重点分析键盘输入子程序 input,;键盘输入子程序 ;入口参数:ds:bx=存放数据的缓冲区 ;出口参数:cx=数据个数 inputproc push ax push dx xor cx,cx;数据个数清0 input01:xor dx,dx;输入字符清0 input02:mov ah,1;键盘输入一个字符 int 21h,input之一,input10:cmp al,0dh je input30 ;是回车,结束整个数据的输入 cmp al, je input20 ;是空格和逗号,确认输入了一个数据 cmp al, je input20 cmp al,08h je input17 ;是退格,丢弃本次输入的数据,出错,input之二,cmp al,0;有效数字判断(图4.5b) jb input17;小于0,不是有效数字,出错 cmp al,f ja input17;大于f,不是有效数字 cmp al,a jb input11 sub al,20h;af转换成大写AF jmp input12 input11:cmp al,F ja input17;字符小于a、大于F,出错 cmp al,A jae input12;是AF,有效字符 cmp al,9 ja input17;是09,有效字符,input之三,input12:cmp dl,0;有效字符的处理 jne input13 mov dl,al ;dl=0,输入了一个数据的低位,则dlal jmp input02;转到字符输入 input13:cmp dh,0 jne input17 ;dl0,dh0输入3位数据,出错 mov dh,dl ;dl0,dh0输入了一个数据的高位 mov dl,al;dhdl,dlal jmp input02;转到字符输入,input之四,input17:mov dl,7;输入错误处理 mov ah,2 int 21h mov dl,? mov ah,2 int 21h jmp input01;转到输入一个数据,input之五,;转换正确的输入数据(图4.5c) input20:convert jmp input01;转到输入一个数据 input30:convert pop dx pop ax ret;返回,出口参数已设定 inputendp,input之六,;将DX两位ASCII码转换为两位16进制数(图4.5c) convertmacro local input21,input22 local input24,input25 cmp dl,0 ;dl=0,没有要转换的数据,退出 je input25,convert之一,cmp dl,9 jbe input21 sub dl,7;字符AF,则减7 input21:and dl,0fh;转换低位 cmp dh,0;dh=0,没有高位数据 je input24 cmp dh,9 jbe input22 sub dh,7 input22:shl dh,1 shl dh,1 shl dh,1 shl dh,1;转换高位 or dl,dh;合并高、低位,convert之二,源文件包含的操作步骤: 分别编辑生成各个文件 汇编、连接主程序文件,input24:mov bx,dl;存入缓冲区 inc bx inc cx;数据加1 input25: endm,convert之三,把常用子程序写成独立的源程序文件,单独汇编,形成子程序的目标文件.OBJ 主程序也经过独立汇编之后形成目标文件 连接程序将所有目标文件连接起来,最终产生可执行文件 需要遵循的原则: 声明共用的变量、过程等 实现正确的段组合 处理好参数传递问题,10.2 目标代码文件的连接,声明共用的变量、过程,各个模块间共用的变量、过程等要说明 PUBLIC 标识符 ,标识符. ;定义标识符的模块使用 EXTERN 标识符:类型 ,标识符:类型. ;调用标识符的模块使用 标识符是变量名、过程名等 类型是byte / word / dword(变量)或near / far(过程) 在一个源程序中,public/extern语句可以有多条 各模块间的public/extern伪指令要互相配对,并且指明的类型互相一致,实现正确的段组合,子程序文件必须定义在代码段中,也可以具有局部的数据变量 采用简化段定义格式,只要采用相同的存储模式,容易实现正确的近或远调用 完整段定义格式中,为了实现模块间的段内近调用(near类型),各自定义的段名、类别必须相同,组合类型都是public。实际的程序开发中,各个模块往往由不同的程序员完成,不易实现段同名或类别相同,所以索性定义成远调用(far类型) 定义数据段时,同样也要注意这个问题。当各个模块的数据段不同时,要正确设置数据段DS寄存器的段基地址,处理好参数传递问题,少量参数可用寄存器或堆栈直接传送数据本身 大量数据可以安排在缓冲区,用寄存器或堆栈传送数据的存储地址 还可利用变量传递参数,但是要采用public/extern声明为公共(全局)变量 这些也是子程序间的参数传递方法,例4.21b,主程序lt421b.asm并入宏定义 子程序文件sub421b.asm,要加上段定义语句、声明语句等,但不需要起始点和结束点,模块连接的操作步骤: 分别编辑生成各个文件 分别汇编各个文件 连接各个目标文件,形成 可执行文件,.;宏定义 .code public count;定义count共用 extern ALdisp:near,sorting:near,input:far ;声明其他模块中的子程序 .startup . .exit 0 ;去掉(lt421a.asm中的)包含语句 end,Lt421b.asm,.model small;定义同样的存储模式 extern count:word ;在其他模块定义了字变量count .code;子程序在代码段中 public aldisp,sorting,input ;3个子程序是共用的 Aldispproc;仍然作为近调用 sortingproc;仍然作为近调用 inputproc far;修改为远调用 . mov count,cx;提供出口参数 . inputendp end;结束汇编,sub421b.asm,把常用子程序写成独立的源文件,单独汇编形成OBJ文件后,存入子程序库 主程序也单独汇编形成OBJ文件 主程序连接时,调入子程序库中的子程序模块,产生最终的可执行文件 例 主程序文件 lt421c.asm 子程序文件 sub421c1.asm 子程序文件 sub421c2.asm 子程序文件 sub421c3.asm,10.3 子程序库的调入,子程序库,子程序库文件(.LIB)是子程序模块的集合,其中存放着各子程序的名称、目标代码及有关定位信息 存入库的子程序的编写与目标文件连接方法中的要求一样,只是为方便调用,更加严格 子程序文件编写完成后,汇编形成目标文件;然后利用库管理工具程序LIB.EXE,把子程序目标模块逐一加入到库中 LIB 库文件名 + 子程序目标文件名 库管理程序LIB帮助创建、组织和维护子程序模块库,例如增加、删除、替换、合并库文件等,.;宏定义 .code extern ALdisp:near,sorting:near,input:near ;声明其他模块中的子程序 .startup . .exit 0 end,Lt421c.asm,.model small .code public aldisp Aldispproc . Aldispendp end,sub421c1.asm,.model small .code public sorting sortingproc . sortingendp end,sub421c2.asm,.model small .code public input inputproc . inputendp end,sub421c3.asm,库文件调入的操作步骤: 分别编辑生成各个文件 分别汇编各个文件 用库管理文件,将子程序模块添加 到库文件(.LIB)中 连接主程序,提供库文件, 形成可执行文件,补充例题,将子程序补充例题13的子程序编写成模块,供主程序调用 实现功能:从键盘输入有符号10进制数,求它们的平均值,然后输出 源程序文件进行简单修改 主程序文件 子程序文件 利用目标代码文件的连接形成可执行文件,.model small extern read:near,write:near,mean:near ;外部子程序 public wtemp;变量共用 .stack .data ;数据定义 .code ;输入、计算和输出 end,主程序文件,.model small public read,write,mean;子程序共用 extern wtemp:word;外部变量 .code;代码段 readproc ;输入子程序read writeproc ;输出子程序write meanproc ;计算平均值子程序mean end,子程序文件,第一章 基础知识,汇编语言和C语言编程,C/C+语言是一个被广泛使用的程序设计语言,它不仅具有良好的高级语言特征,而且还具有一些低级语言的特点,如:寄存器变量、位操作等。所以,C语言的程序与汇编语言程序之间能很平滑地衔接。另外,目前主要的C语言程序开发环境,如:Turbo C/C+、Borland C/C+等,也都提供了很好的混合编程手段。,一、汇编指令的嵌入,为了提高C语言程序内某特殊功能段的处理效率,我们可以在其源程序中嵌入一段汇编语言程序段。这样做,虽然能达到提高了程序处理效率的目的,但它无疑以丧失源程序的可移植性为代价。所以,当想用C语言和汇编语言混合编程时,程序员需要权衡采用这种方法的利与弊。,在C语言中,嵌入汇编语言的语法如下(*): asm 注意:这里的分号;不是汇编语言中起注释作用的分号,而是作为语句的分隔符。 若C语言源程序中嵌入一条汇编语句,则可按下列方式
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号