汇编语言第十章:模块化程序设计PPT课件下载推荐.ppt
《汇编语言第十章:模块化程序设计PPT课件下载推荐.ppt》由会员分享,可在线阅读,更多相关《汇编语言第十章:模块化程序设计PPT课件下载推荐.ppt(32页珍藏版)》请在冰点文库上搜索。
排序子程序(例4.8)input;
键盘输入子程序还包含一个宏convert;
将DX两位ASCII码转换为两位16进制数,sub421a.asm,让我们重点分析键盘输入子程序input,;
键盘输入子程序;
入口参数:
ds:
bx=存放数据的缓冲区;
出口参数:
cx=数据个数inputprocpushaxpushdxxorcx,cx;
数据个数清0input01:
xordx,dx;
输入字符清0input02:
movah,1;
键盘输入一个字符int21h,input之一,input10:
cmpal,0dhjeinput30;
是回车,结束整个数据的输入cmpal,jeinput20;
是空格和逗号,确认输入了一个数据cmpal,jeinput20cmpal,08hjeinput17;
是退格,丢弃本次输入的数据,出错,input之二,cmpal,0;
有效数字判断(图4.5b)jbinput17;
小于0,不是有效数字,出错cmpal,fjainput17;
大于f,不是有效数字cmpal,ajbinput11subal,20h;
af转换成大写AFjmpinput12input11:
cmpal,Fjainput17;
字符小于a、大于F,出错cmpal,Ajaeinput12;
是AF,有效字符cmpal,9jainput17;
是09,有效字符,input之三,input12:
cmpdl,0;
有效字符的处理jneinput13movdl,al;
dl=0,输入了一个数据的低位,则dlaljmpinput02;
转到字符输入input13:
cmpdh,0jneinput17;
dl0,dh0输入3位数据,出错movdh,dl;
dl0,dh0输入了一个数据的高位movdl,al;
dhdl,dlaljmpinput02;
转到字符输入,input之四,input17:
movdl,7;
输入错误处理movah,2int21hmovdl,?
movah,2int21hjmpinput01;
转到输入一个数据,input之五,;
转换正确的输入数据(图4.5c)input20:
convertjmpinput01;
转到输入一个数据input30:
convertpopdxpopaxret;
返回,出口参数已设定inputendp,input之六,;
将DX两位ASCII码转换为两位16进制数(图4.5c)convertmacrolocalinput21,input22localinput24,input25cmpdl,0;
dl=0,没有要转换的数据,退出jeinput25,convert之一,cmpdl,9jbeinput21subdl,7;
字符AF,则减7input21:
anddl,0fh;
转换低位cmpdh,0;
dh=0,没有高位数据jeinput24cmpdh,9jbeinput22subdh,7input22:
shldh,1shldh,1shldh,1shldh,1;
转换高位ordl,dh;
合并高、低位,convert之二,源文件包含的操作步骤:
分别编辑生成各个文件汇编、连接主程序文件,input24:
movbx,dl;
存入缓冲区incbxinccx;
数据加1input25:
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,要加上段定义语句、声明语句等,但不需要起始点和结束点,模块连接的操作步骤:
分别编辑生成各个文件分别汇编各个文件连接各个目标文件,形成可执行文件,.;
宏定义.codepubliccount;
定义count共用externALdisp:
near,sorting:
near,input:
far;
声明其他模块中的子程序.startup.exit0;
去掉(lt421a.asm中的)包含语句end,Lt421b.asm,.modelsmall;
定义同样的存储模式externcount:
word;
在其他模块定义了字变量count.code;
子程序在代码段中publicaldisp,sorting,input;
3个子程序是共用的Aldispproc;
仍然作为近调用sortingproc;
仍然作为近调用inputprocfar;
修改为远调用.movcount,cx;
提供出口参数.inputendpend;
结束汇编,sub421b.asm,把常用子程序写成独立的源文件,单独汇编形成OBJ文件后,存入子程序库主程序也单独汇编形成OBJ文件主程序连接时,调入子程序库中的子程序模块,产生最终的可执行文件例主程序文件lt421c.asm子程序文件sub421c1.asm子程序文件sub421c2.asm子程序文件sub421c3.asm,10.3子程序库的调入,子程序库,子程序库文件(.LIB)是子程序模块的集合,其中存放着各子程序的名称、目标代码及有关定位信息存入库的子程序的编写与目标文件连接方法中的要求一样,只是为方便调用,更加严格子程序文件编写完成后,汇编形成目标文件;
然后利用库管理工具程序LIB.EXE,把子程序目标模块逐一加入到库中LIB库文件名+子程序目标文件名库管理程序LIB帮助创建、组织和维护子程序模块库,例如增加、删除、替换、合并库文件等,.;
宏定义.codeexternALdisp:
near;
声明其他模块中的子程序.startup.exit0end,Lt421c.asm,.modelsmall.codepublicaldispAldispproc.Aldispendpend,sub421c1.asm,.modelsmall.codepublicsortingsortingproc.sortingendpend,sub421c2.asm,.modelsmall.codepublicinputinputproc.inputendpend,sub421c3.asm,库文件调入的操作步骤:
分别编辑生成各个文件分别汇编各个文件用库管理文件,将子程序模块添加到库文件(.LIB)中连接主程序,提供库文件,形成可执行文件,补充例题,将子程序补充例题13的子程序编写成模块,供主程序调用实现功能:
从键盘输入有符号10进制数,求它们的平均值,然后输出源程序文件进行简单修改主程序文件子程序文件利用目标代码文件的连接形成可执行文件,.modelsmallexternread:
near,write:
near,mean:
外部子程序publicwtemp;
变量共用.stack.data;
数据定义.code;
输入、计算和输出end,主程序文件,.modelsmallpublicread,write,mean;
子程序共用externwtemp:
外部变量.code;
代码段readproc;
输入子程序readwriteproc;
输出子程序writemeanproc;
计算平均值子程序meanend,子程序文件,第一章基础知识,汇编语言和C语言编程,C/C+语言是一个被广泛使用的程序设计语言,它不仅具有良好的高级语言特征,而且还具有一些低级语言的特点,如:
寄存器变量、位操作等。
所以,C语言的程序与汇编语言程序之间能很平滑地衔接。
另外,目前主要的C语言程序开发环境,如:
TurboC/C+、BorlandC/C+等,也都提供了很好的混合编程手段。
一、汇编指令的嵌入,为了提高C语言程序内某特殊功能段的处理效率,我们可以在其源程序中嵌入一段汇编语言程序段。
这样做,虽然能达到提高了程序处理效率的目的,但它无疑以丧失源程序的可移植性为代价。
所以,当想用C语言和汇编语言混合编程时,程序员需要权衡采用这种方法的利与弊。
在C语言中,嵌入汇编语言的语法如下(*):
asm注意:
这里的分号;
不是汇编语言中起注释作用的分号,而是作为语句的分隔符。
若C语言源程序中嵌入一条汇编语句,则可按下列方式来做:
asmmovax,data若要嵌入一组汇编语句,则需要用括号和把它们括起来。
asmmovax,data1xchgax,data2movdata1,ax/实现整型变量data1和data2之值的交换,第一章基础知识,汇编语言和C语言编程,例在C语言源程序中嵌入汇编语言语句实现赋值语句A=A+B+C,其中:
A、B、C都是整型变量。
解:
asmpushax/实现整型变量A=A+B+Cmovax,Aaddax,Baddax,CmovA,axpopax,二、C语言程序的汇编输出,