资源描述
第十章模块化程序设计(chn x sh j)第一页,共33页。把源程序分放在几个文本文件(wnjin)中,在汇编时通过包含伪指令INCLUDE结合成一体INCLUDE 文件(wnjin)名可将常用的子程序形成.ASM汇编语言源文件(wnjin)可将常用的宏定义存放在.MAC宏库文件(wnjin)中可将常量定义、声明语句组织在.INC包含文件(wnjin)中例 宏库文件(wnjin)主程序文件(wnjin)子程序文件(wnjin)10.1 源程序文件(wnjin)的包含1第二页,共33页。dispcharmacro char;显示(xinsh)char字符mov dl,charmov ah,2int 21hendmdispmsgmacro message;显示(xinsh)message字符串mov dx,offset messagemov ah,9int 21hendm第三页,共33页。.dispmsg msg1;提示输入数据mov bx,offset bufcall input;数据输入cmp cx,0je start4;没有输入数据则退出(tuch)mov count,cx.;显示输入的数据.;数据排序.;显示经排序后的数据start4:.exit 0 end第四页,共33页。子程序源文件有3个子(g zi)程序ALdisp;显示2位16进制数子程序(例)sorting;排序子程序(例)input;键盘输入子程序还包含一个宏convert;将DX两位ASCII码转换为两位16进制数让我们(w men)重点分析键盘输入子程序 input第五页,共33页。;键盘输入(shr)子程序;入口参数:ds:bx=存放数据的缓冲区;出口参数:cx=数据个数inputprocpush axpush dxxor cx,cx;数据个数清0input01:xor dx,dx;输入(shr)字符清0input02:mov ah,1;键盘输入(shr)一个字符int 21hinputinput之一之一继续:input之二第六页,共33页。input10:cmp al,0dhje input30;是回车,结束整个数据(shj)的输入cmp al,je input20;是空格和逗号,确认输入了一个数据(shj)cmp al,je input20cmp al,08hje input17;是退格,丢弃本次输入的数据(shj),出错inputinput之二之二继续:input之三第七页,共33页。cmp al,0;有效数字判断(pndun)(图)jb input17;小于0,不是有效数字,出错cmp al,fja input17;大于f,不是有效数字cmp al,ajb input11sub al,20h;af转换成大写AFjmp input12input11:cmp al,Fja input17;字符小于a、大于F,出错cmp al,Ajae input12;是AF,有效字符cmp al,9ja input17;是09,有效字符inputinput之三之三继续:input之四第八页,共33页。input12:cmp dl,0;有效字符的处理jne input13mov dl,al;dl=0,输入(shr)了一个数据的低位,则dlaljmp input02;转到字符输入(shr)input13:cmp dh,0jne input17;dl0,dh0输入(shr)3位数据,出错mov dh,dl;dl0,dh0输入(shr)了一个数据的高位mov dl,al;dhdl,dlaljmp input02;转到字符输入(shr)inputinput之四之四继续:input之五第九页,共33页。input17:mov dl,7;输入(shr)错误处理mov ah,2int 21hmov dl,?mov ah,2int 21hjmp input01;转到输入(shr)一个数据inputinput之之五五继续:input之六第十页,共33页。;转换正确的输入数据(图)input20:convertjmp input01;转到输入一个(y)数据input30:convertpop dxpop axret;返回,出口参数已设定inputendpinputinput之六之六继续:convert之一第十一页,共33页。;将DX两位ASCII码转换(zhunhun)为两位16进制数(图)convertmacrolocal input21,input22local input24,input25cmp dl,0;dl=0,没有要转换(zhunhun)的数据,退出je input25convertconvert之之一一继续:convert之二第十二页,共33页。cmp dl,9jbe input21sub dl,7;字符AF,则减7input21:and dl,0fh;转换低位cmp dh,0;dh=0,没有(mi yu)高位数据je input24cmp dh,9jbe input22sub dh,7input22:shl dh,1shl dh,1shl dh,1shl dh,1;转换高位or dl,dh;合并高、低位convertconvert之之二二继续:convert之三第十三页,共33页。源文件包含的操作步骤:分别编辑生成各个文件 汇编(hubin)、连接主程序文件input24:mov bx,dl;存入(cn r)缓冲区inc bxinc cx;数据加1input25:endmconvertconvert之之三三第十四页,共33页。把常用(chn yn)子程序写成独立的源程序文件,单独汇编,形成子程序的目标文件.OBJ主程序也经过独立汇编之后形成目标文件连接程序将所有目标文件连接起来,最终产生可执行文件需要遵循的原则:声明共用的变量、过程等 实现正确的段组合 处理好参数传递问题10.2 目标代码文件(wnjin)的连接2第十五页,共33页。声明(shngmng)共用的变量、过程各个模块间共用的变量、过程等要说明(shumng)PUBLIC 标识符,标识符.;定义标识符的模块使用EXTERN 标识符:类型,标识符:类型.;调用标识符的模块使用标识符是变量名、过程名等类型是byte/word/dword(变量)或near/far(过程)在一个源程序中,public/extern语句可以有多条各模块间的public/extern伪指令要互相配对,并且指明的类型互相一致第十六页,共33页。实现正确(zhngqu)的段组合子程序文件必须定义在代码段中,也可以具有局部的数据变量采用简化段定义格式,只要采用相同的存储模式,容易实现正确(zhngqu)的近或远调用完整段定义格式中,为了实现模块间的段内近调用(near类型),各自定义的段名、类别必须相同,组合类型都是public。实际的程序开发中,各个模块往往由不同的程序员完成,不易实现段同名或类别相同,所以索性定义成远调用(far类型)定义数据段时,同样也要注意这个问题。当各个模块的数据段不同时,要正确(zhngqu)设置数据段DS寄存器的段基地址第十七页,共33页。处理(chl)好参数传递问题少量参数可用寄存器或堆栈直接传送数据本身大量数据可以安排在缓冲区,用寄存器或堆栈传送数据的存储地址还可利用变量传递参数,但是要采用public/extern声明为公共(全局(qunj))变量这些也是子程序间的参数传递方法第十八页,共33页。例主程序并入(bn r)宏定义子程序文件,要加上段定义语句、声明语句等,但不需要起始点和结束点模块连接的操作步骤:分别(fnbi)编辑生成各个文件 分别(fnbi)汇编各个文件 连接各个目标文件,形成可执行文件第十九页,共33页。把常用子程序写成独立的源文件,单独汇编(hubin)形成OBJ文件后,存入子程序库主程序也单独汇编(hubin)形成OBJ文件主程序连接时,调入子程序库中的子程序模块,产生最终的可执行文件例 主程序文件 子程序文件 子程序文件 子程序文件 10.3 子程序库的调入3第二十二页,共33页。.;宏定义.codeextern ALdisp:near,sorting:near,input:near;声明(shngmng)其他模块中的子程序.startup.exit 0end第二十四页,共33页。.model small.codepublic aldispAldispproc.Aldispendpend第二十五页,共33页。.model small.codepublic sortingsortingproc.sortingendpend第二十六页,共33页。.model small.codepublic inputinputproc.inputendpend库文件(wnjin)调入的操作步骤:分别编辑生成各个文件(wnjin)分别汇编各个文件(wnjin)用库管理文件(wnjin),将子程序模块添加到库文件(wnjin)(.LIB)中 连接主程序,提供库文件(wnjin),形成可执行文件(wnjin)第二十七页,共33页。补充(bchng)例题将子程序补充例题13的子程序编写成模块,供主程序调用实现功能:从键盘输入有符号10进制数,求它们的平均值,然后输出(shch)源程序文件进行简单修改主程序文件子程序文件利用目标代码文件的连接形成可执行文件第二十八页,共33页。第一章第一章基础知识基础知识汇编语言汇编语言(hu bin y yn)(hu bin y yn)和和C C语言编语言编程程C/C+语言是一个被广泛使用的程序设计语言,它不仅具有良好的高级语言特征,而且还具有一些低级语言语言是一个被广泛使用的程序设计语言,它不仅具有良好的高级语言特征,而且还具有一些低级语言的特点,如:寄存器变量、位操作等。所以,的特点,如:寄存器变量、位操作等。所以,C语言的程序与汇编语言程序之间能很平滑地衔接。另外,目前语言的程序与汇编语言程序之间能很平滑地衔接。另外,目前(mqin)主要的主要的C语言程序开发环境,如:语言程序开发环境,如:TurboC/C+、BorlandC/C+等,也都提供了很好的混合编程手段。等,也都提供了很好的混合编程手段。一、汇编一、汇编(hubin)指令的嵌入指令的嵌入为了提高为了提高C语言程序内某特殊功能段的处理效率,我们可以在其源程序中嵌入一段汇编语言语言程序内某特殊功能段的处理效率,我们可以在其源程序中嵌入一段汇编语言程序段。这样做,虽然能达到提高了程序处理效率的目的,但它无疑以丧失源程序的可移植程序段。这样做,虽然能达到提高了程序处理效率的目的,但它无疑以丧失源程序的可移植性为代价。所以,当想用性为代价。所以,当想用C语言和汇编语言混合编程时,程序员需要权衡采用这种方法的利与弊。语言和汇编语言混合编程时,程序员需要权衡采用这种方法的利与弊。在在C语言中,嵌入汇编语言的语法如下语言中,嵌入汇编语言的语法如下(*):asm注意:这里的分号注意:这里的分号;不是汇编语言中起注释作用的分号,而是作为语句的分隔符。不是汇编语言中起注释作用的分号,而是作为语句的分隔符。若若C语言源程序中嵌入一条汇编语句,则可按下列方式来做:语言源程序中嵌入一条汇编语句,则可按下列方式来做:asmmovax,data若要嵌入一组汇编语句,则需要用括号若要嵌入一组汇编语句,则需要用括号和和把它们括起来。把它们括起来。asmmovax,data1xchgax,data2movdata1,ax/实现整型变量实现整型变量data1和和data2之值的交换之值的交换第三十一页,共33页。jne input17一、汇编(hubin)指令的嵌入sorting;排序子程序(例)分别(fnbi)汇编各个文件je input24第二十五页,共33页。public aldisp,sorting,inputsub dl,7;字符AF,则减7asm LIB)是子程序模块的集合,其中存放着各子程序的名称、目标代码及有关(yugun)定位信息input17:mov dl,7;输入(shr)错误处理cmp al,9二、C语言程序的汇编(hubin)输出MAC宏库文件(wnjin)中model small第一章第一章基础知识基础知识汇编语言汇编语言(hu bin y yn)(hu bin y yn)和和C C语言编语言编程程例例在在C语言源程序中嵌入汇编语言语句实现语言源程序中嵌入汇编语言语句实现(shxin)赋值语句赋值语句A=A+B+C,其中:,其中:A、B、C都是整型变量。都是整型变量。解:解:asmpushax/实现实现(shxin)整型变量整型变量A=A+B+Cmovax,Aaddax,Baddax,CmovA,axpopax二、二、C语言程序的汇编语言程序的汇编(hubin)输出输出第三十二页,共33页。谢谢谢谢(xi xie)观看观看第三十三页,共33页。
展开阅读全文