《第6章汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《第6章汇编语言程序设计.ppt(107页珍藏版)》请在三一办公上搜索。
1、第6章 汇编语言程序设计,6.1汇编源程序的编程格式 汇编源程序有两种编程格式:一种格式只能生成扩展名为EXE的可执行文件,称为EXE文件的编程格式;另一种格式可以生成扩展名为COM的可执行文件,称为COM文件的编程格式。6.1.1 EXE文件的编程格式EXE文件的编程格式允许源程序使用多个逻辑段,在实模式下,每个逻辑段的目标块不超过64KB,适合于编写大型程序。,开 始,6.1.2 COM 文件的编程格式COM文件的编程格式必须必须符合以下规定:(1)源程序只允许使用一个逻辑段,即代码段,不允许设置堆栈段;(2)程序使用的数据,可以集中设置在代码段的开始或末尾;(3)在代码段偏移地址(有效地
2、址)为100H的单元,必须是程序的启动指令;(4)代码段目标小于64KB。,6.1.3EXE文件和COM文件的内存映像 EXE文件包括两部分:一部分为装入模块,另一部分为“重定位信息”。调入后生成PSP(程序段前缀)DOS自动给DS,ES,FS和GS赋值,使DS=ES=存放PSP的段基址,FS=GS=0,并使CS:IP用户程序的启动地址,SS:SP指向用户堆栈段的栈顶,在这以后,DOS才把控制权交给用户程序。COM文件没有重定位信息,因此比EXE文件的体积小的多。DOS装载COM文件时,也生成PSP,然后从偏移地址100H开始依次存放用户程序。DOS自动赋值使CS=DS=ES=SS=PSP段基
3、址,FS=GS=0,并使IP=100H,SP=FFFEH。,6.1.4 程序段前缀6.1.5返回DOS的其他方法对于COM文件有三种方法:(1)直接执行INT20H;(2)调用INT21H的0号功能。(3)执行RET指令对于EXE文件:(1)调用INT 21H的4CH功能(2)执行INT 20H,首先把执行过程包含在一个远过程中;其次在给DS赋值前,用3条指令把PSP首单元的物理地址压入栈顶,即:PUSH DS MOV AX,0 PUSH AX,最后程序在需要返回DOS的地方执行一条RET指令。6.1.6 源程序堆栈段的设置,对8086系列机来说,MS-DOS操作系统是最主要的操作系统。MS-
4、DOS操作系统除了具有较为完整的文件管理功能之外,同时还为各种应用程序、外围设备等提供软件接口。它由三部分组成:IO.SYS、MSDOS.SYS以及COMMAND.COM。DOS系统功能调用的方法一般可分为以下几步:设置所要调用功能的入口参数。在AH寄存器中存入所要调用功能的功能号。INT 21H指令自动转入中断子程序入口。相应中断子程序运行完毕,可按规定取得出口参数。,返回本节,6.2 DOS系统功能调用,6.2 常用的DOS系统功能调用,1单字符输入(1号调用)2单字符显示(2号调用)3打印输出(5号调用)4结束调用(4CH号调用)5显示字符串(9号调用)6字符串输入(10号调用),1单字
5、符输入(1号调用)格式:MOVAH,1INT21H功能:从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。2单字符显示(2号调用)格式:MOV DL,待显示字符的ASCII码MOV AH,2INT 21H功能:将DL寄存器中的字符送显示器显示,如果DL中为CTRL+BREAK的ASCII码,则退出。,3打印输出(5号调用)格式:MOVDL,待打印字符的ASCII码MOVAH,5INT21H功能:将DL寄存器中的字符送打印机打印。4结束调用(4CH号调用)格式:MOVAH,4CH INT21H功能:终止当前程序并返回调用程序。,5显示字符串(9号调用)格式:LEADX,待显示字符串首
6、偏移地址MOVAH,9INT21H功能:将当前数据区中以结尾的字符串送显示器显示。6字符串输入(10号调用)格式:LEADX,缓冲区首偏移地址MOVAH,10INT21H功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。,DATASEGMENTSTRDB 0DH,0AH,Example of string display!DATAENDSSTACKSEGMENT STACKDB100 DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACK,【例3.25】若要在屏幕上显示字符串“Example of string dis
7、play!”,则程序如下:,BEGIN:MOVAX,DATAMOVDS,AXLEADX,STRMOVAH,9INT21HMOVAH,4CH INT21HCODEENDSENDBEGIN,返回本节,综合举例,【例3.27】已知一数据段中的数据为:DATASEGMENTADW MBUFDB AB,0DH,0AHCEQU 500HBDW 0FFAAHDDD BUFMDB 2DUP(1),2DUP(2,B)DATAENDS请画出该数据段数据存储的形式。,返回本章首页,该数据段在主存中的存储形式如左图所示。,DATASEGMENTNUMDB 01000101BBUFDB 0DH,0AH,(NUM)=ST
8、RDB 4 DUP(?)DATAENDSSTACKSEGMENT STACKDB200 DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODE,【例3.28】阅读下列程序,指出此程序所完成的功能以及在显示器上显示的内容。,START:MOVAX,DATA MOVDS,AX LEADI,STRMOVAL,NUM MOVCL,4SHRAL,CLORAL,30HMOVDI,ALINCDIMOVAL,NUM ANDAL,0FHORAL,30HMOVDI,AL,INCDIMOVBYTEPTR DI,HINCDIMOVBYTEPTR DI,LEAD
9、X,BUF MOVAH,9INT21HMOVAH,4CHINT21HCODEENDSENDSTART,DATASEGMENTINFO1DB0DH,0AH,INPUT STRING:INFO2DB0DH,0AH,OUTPUT STRING:BUFADB81DB?,【例3.29】从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。,DB80 DUP(0)BUFBDB81 DUP(0)DATAENDSSTACKSEGMENTDB200 DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,D
10、ATAMOVDS,AX,LEADX,INFO1MOVAH,9;9号调用,显示输入提示信息INT21HLEADX,BUFAMOVAH,10;10号调用,键盘输入字符串到缓 冲区BUFAINT21HLEASI,BUFA+1 MOVCH,0;取字符长度CX MOVCL,SIADDSI,CX;SI 指向字符串尾部LEADI,BUFB;DI指向字符串变量BUFB,NEXT:MOVAL,SIMOVDI,ALDECSIINCDILOOPNEXTMOVBYTE PTR DI,LEADX,INFO2MOVAH,9;9号调用,显示输出提示信息INT21H,LEADX,BUFBMOVAH,9;反向显示字符串INT2
11、1HMOVAH,4CHINT21HCODEENDSENDSTART,返回本节,6.3 BIOS键盘输入功能调用调用模式:MOV AH,功能号设置入口参数INT n分析出口参数BIOS键盘输入功能使用INT 16H1 功能号00H:读取键入的一个字符,无回显,响应CTRL_C,无键入则等待。入口参数:无出口参数:AL=输入字符的ASCII码2 功能号01H:查询键盘缓冲区入口参数:无出口参数:Z=0,表示有键入,否则无键入,3 功能号02H:读取当前转换状态入口参数:无出口参数:AL=键盘状态字(P94)4 功能号10H:读扩展键盘,无回显,响应CTRL_C。入口参数:无出口参数:同00H5 功
12、能号11H:查询键盘缓冲区6 功能号12H:读取扩展键盘的转换状态。,6.4 文本方式BIOS屏幕功能调用6.4.1 显示器6.4.2 文本方式BIOS屏幕调用调用指令 INT 10H1 功能号00H:设置屏幕显示方式2功能号01H:设置光标形状3功能号02H:预置光标位置4功能号03H:读取光标的当前位置5功能号05H:设置当前显示页6功能号06H:窗口上滚7功能号07H:窗口下滚8功能号08H:读取光标所在位置的字符及其属性9功能号09H:从光标所在位置开始,显示若干个相同的字符,10功能号0AH:从光标所在位置开始,显示若干个相同的字符11功能号0EH:显示一个字符12功能号13H:显示
13、字符串,6.5 程序设计方法,1 概述2 顺序程序设计3 分支程序设计4 循环程序设计5 子程序设计6 模块化程序设计7 高级汇编语言技术,开 始,1 概述,(1)汇编语言程序设计的一般步骤(2)流程图,返回本章首页,程序设计方法,汇编语言程序设计的一般步骤,汇编语言程序设计一般有以下几个步骤:1分析问题,确定算法2绘制流程图3根据流程图编制程序4调试程序,返回本节,流程图,1流程图的概念流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。,2流程图符号表示(1)起止框:表示程序的开始和结束。,起止框,(2
14、)判断框,(3)处理框,(4)调用框,(5)指向线,(6)连接框,返回本节,2 顺序程序设计,下面举例说明顺序程序的设计。【例4.1】试编写一程序计算以下表达式的值。=(v-(*+-540)/x式中x、v均为有符号字数据。设、的值存放在字变量、V中,结果存放在双字变量之中,程序的流程图如图4.1所示。,返回本章首页,图4.1 顺序运算程序流程图,源程序如下:DATASEGMENTXDW200YDW100ZDW3000VDW10000WDW2 DUP(?)DATAENDSSTACKSEGMENT STACK DB 200 DUP(0)STACKENDSCODESEGMENTASSUME DS:D
15、ATA,CS:CODE,SS:STACK,START:MOVAX,DATAMOVDS,AX;DATAAXMOVAX,X IMULY;(X)*(Y)DX:AXMOVCX,AXMOVBX,DX;(DX:AX)(BX:CX)MOVAX,ZCWD;(Z)符号扩展ADDCX,AXADCBX,DX;(BX:CX)+(DX:AX)(BX:CX)SUBCX,540SBBBX,0;(BX:CX)-540(BX:CX)MOVAX,V,CWD;(V)符号扩展SUBAX,CXSBBDX,BX;(DX:AX)-(BX:CX)(DX:AX)IDIVX;(DX:AX)/XMOVW,AX;商WMOVW+2,DX;余数DXW+
16、2MOVAH,4CHINT21HCODEENDS;退出DOS 状态ENDSTART,【例4.2】,【例4.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:,STACKSEGMENT STACKDB 200 DUP(0)STACKENDSDATASEGMENTTABDB 80,85,86,71,79,96 DB 83,56,32,66,78。84NO DB 10ENGLISTDB?DATAENDSCODESEGMENT,ASSUME DS:DATA,SS:STACK,CS:CODEBEGI
17、N:MOVAX,DATAMOVDS,AXLEABX,TAB MOVAL,NODELALXLATTABMOVENGLISH,ALMOVAH,4CHINT21HCODEENDSENDBEGIN,6.5 分支程序设计,(1)用条件转移指令实现程序分支(2)用跳转表实现多路分支,返回本章首页,(1)用条件转移指令实现程序分支,【例4.3】编写计算下面函数值的程序:1X0Y=0X=0-1X设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如图4.2所示。程序如下:,DATASEGMENTX DB-10Y DB?DATAENDSSTACKSEGMENT STACK DB 200 DUP(0)STACK
18、ENDSCODESEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATA,MOVDS,AX CMPX,0;与0进行比较 JGEA1;X0转A1 MOVY,-1;X 0时,-1Y JMPEXITA1:JGA2;X0转A2 MOVY,0;X=0时,0Y JMPEXITA2:MOVY,1;X0,1Y EXIT:MOVAH,4CH INT21H CODE ENDS ENDSTART,MOVDS,AX CMPX,0;与0进行比较 JGEA1;X0转A1 MOVY,-1;X 0时,-1Y JMPEXITA1:JGA2;X0转A2 MOVY,0;X=0时,
19、0Y JMPEXITA2:MOVY,1;X0,1Y EXIT:MOVAH,4CH INT21H CODE ENDS ENDSTART,图4.2 分支运算程序流程图,【例4.4】,【例4.4】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如图4.3所示,图4.3例4.4程序流程图,程序如下:STACSEGMENT STACK DB 200 DUP(0)STACKENDSDATASEGMENTX DW 00ABHY DW 5Z DW 200MAXDW?DATAENDSCODESEGMENT,ASSUME DS:DA
20、TA,SS:STACK,CS:CODE START:MOVAX,DATA MOVDS,AX MOVAX,X CMPAX,Y;XY?JGL1 MOVAX,Y;YZ?CMPAX,Z JGEXITL2:MOVAX,Z JMPEXIT,L1:CMPAX,Z;XZ?JLEL2EXIT:MOVMAX,AX MOVAH,4CH INT21HCODEENDS ENDSTART,返回本节,(2)用跳转表实现多路分支,【例4.5】设某程序有8路分支,试根据给定的N值(18),将程序的执行转移到其中的一路分支。程序流程如图4.4所示。,程序如下:DATASEGMENTTABDW P1,P2,P3,P4,P5,P6,
21、P7,P8N DB 5DATAENDSSTACKSEGMENT DB 200 DUP(0)STACKENDSCODESEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE,START:MOVAX,DATAMOVDS,AXMOVAL,NDELALADDAL,ALMOVBM,ALMOVBH,0JMPTABBX,P1:JMPEXITP2:JMPEXITP2:JMPEXITP3:,JMPEXITP8:EXIT:MOVAH,4CH INT21HCODEENDS ENDSTART上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻
22、址,读者可自行考虑。,返回本节,6.6 循环程序设计,6.1 循环程序的结构6.2 单重循环程序设计6.3 多重循环程序设计,返回本章首页,6.6 循环程序的结构,1初始化部分2循环体部分3循环控制部分,循环程序的常见结构形式如图4.5(a)、(b)所示。,返回本节,一、单重循环程序设计,1计数控制2条件控制,1计数控制,【例4.7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。其程序流程图如图4.6所示。,图4.6 程序流程图,【例4.8】,【例4.8】试编写一程序,要求比较两个字符串S
23、TR1和STR所含字符是否相同,若相同则显示MATCH!,若不相同则显示NO MATCH!。(程序略)其流程图如图4.7所示。,图4.7 程序流程图,【例4.9】试编一个程序将字单元BUF中所含1的个数存入COUNT单元中。要测出BUF字单元所含1的个数,首先将BUF中的数送给寄存器AX,然后将AX寄存器逻辑左移一次,如果CF=1,则表明AX中的最高位为1,则计数器CL计数1次,如果CF=0,表明AX最高位为0,这样依次将最高位移入CF中去测试。移位之后,判断AX的值是否为0,如果为0则结束循环,不为0,则继续循环。其流程图如图4.8所示。,2条件控制,程序如下:STACKSEGMENT ST
24、ACK DB 200 DUP(0)STACKEDNSDATASEGMENTBUFDW 0011110010101011BCOUNTDB?DATAENDSCODESEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK,START:MOVAX,DATAMOVDS,AXMOVAX,BUFMOVCL,0;计数器为0COPA:ANDAX,AXJEEXIT;(AX)=0,结束循环SHLAX,1;AX 左移一位JNCLOPAINCCL;产生进位,(CL)+1CLJMPLOPAEXIT:MOVCOUNT,CLMOVAH,4CHINT21HCODEENDSENDSTART,返回本节,二、
25、多重循环程序设计,【例4.10】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,整个排序过程最多需(N-1)遍。如下面的4个数即是采用冒泡排序比较的例子。,数108169032第一遍101690328第二遍169032108第三遍903216108程序流程图如图
26、4.9所示。,程序如下:DATASEGMENTBUFDW 3,-4,6,7,9,2,0,-8,-9,-10,20N=(-BUF)/2DATAENDSSTACKSEGNMENT STACKDB 200 DUP(0)STACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,START:MOVAX,DATAMOVDS,AXMOVCX,NDECCXLOOP1:MOVDX,CXMOVBX,0LOOP2:MOVAX,BUFBXCMPAX,BUFBX+2JGELXCHGAX,BUFBX+2MOVBUFBX,AX,L:ADDBX,2DECCXJNELOOP2MOV
27、CX,DXLOOPLOOP1MOVAH,4CHINT21HCODEENDSENDSTART,程序运行后,BUF区中的内容如下:20,9,7,6,3,2,0,-4,-8,-9,-10若要对N个无符号数按由大到小的顺序排列,只需将指令“JGE L”改为“JAE L”即可。,返回本节,6.7 子程序设计,1 子程序的概念2 子程序的定义3 子程序设计方法4 子程序应用举例5 子程序的嵌套与递归调用,返回本章首页,1 子程序的概念,在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,
28、子程序又称过程。调用子程序的程序称为主调程序或主程序。,返回本节,2 子程序的定义,子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程名 PROC NEAR/FAR 过程名 ENDP其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。,返回本节,3 子程序设计方法,(1)信息的保护与恢复(2)主程序与子程序参数传递方式,(1)信息的保护与恢复,例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。PROGPROCPUSH
29、AXPUSH BX PUSH CX;保护现场PUSH DX,POP DXPOPCXPOPBX;恢复现场POPAXRET;返回断点处PROCENDP,(2)主程序与子程序参数传递方式,(1)寄存器法(2)约定内存单元单元法(3)堆栈法,返回本节,4 子程序应用举例,【例4.12】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为10010011。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。,入口参数:DX存放待转换的二进制数CX存放待转换数的位数(8位或16位)DI存放AS
30、CII码首地址出口参数:转换后的字符串存放在以DI作指针的字节存贮区中程序如下:DATASEGMENTNUM8DB93HNUM16DW0ABCDHASCBUFDB20DUP(0)DATAENDS,CODESEGMENTASSUME DS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDX,0MOVDL,NUM8;转换二进制数送DXMOVCX,8;置位数8LEADI,ASCBUF;字符串首址DICALLBTASC;调用子程序BTASCMOVDI,BYTE PTR 0DHMOVDI+1,BYTE PTR 0AH,MOVDI+2,BYTE PTR$L
31、EADX,ASCBUFMOVAH,9INT21HMOVDX,NUM16MOVCX,16;置位数16LEADI,ASCBUFCALLBTASC MOVDL,BYTE PTR 0DHMOVDL+1,BYTE PTR 0AHMOVDL+2,BYTE PTR;显示转换后的字符串LEADX,ASCBUF MOVAH,9 INT21H,BTASCPROCPUSHAX;保存AXMOVAL,0CMPCX,8;比较8位数JNEL1;直接转换16位数MOVDH,DL;8位数转换送DHL1:ROLDX,,1;DX最高位移入CFRCLAL,1;CF移入AL最低位ADDAL,30HMOVDI,AL,INCDILOOPL
32、1POPAXRETBTASCENDPCODEENDSENDSTART,返回本节,5 子程序的嵌套与递归调用,1子程序的嵌套子程序不但可以被主程序调用,而且也可以被其他子程序调用。我们把一个子程序调用另一个子程序称为子程序的嵌套调用。2子程序的递归调用子程序的递归调用是指一个子程序直接或间接地调用自己。递归子程序一般对应于数学上对函数的递归定义,它往往能设计出效率较高的程序,完成相当复杂的计算,因而是很有用的。,【例4.15】,【例4.15】试编制计算N!(N0)的程序。N!=N*(N-1)*(N-2)*1其递归定义如下:0!=1N!=N*(N-1)!(N1)计算N!的子程序FACT的流程图如图
33、4.10所示。,【例4.16】计算5!的程序示例,RESULT是保存阶乘的存储单元。程序如下:STACKSEGMENT STACKDB 200 DUP(0)STACKENDSDATASEGMENTNDW 5RESULTDW?DATAENDSCODESEGMENTASSUME CS:CODE,SS:STACK,DS:DATA,START:MOVAX,DATAMOVDS,AXMOVAX,NCALLFACTMOVAX,RESULTMOVAH,4CHINT21HFACTPROCCMPAX,0JNEL1,MOVRESULT,1JMPEXITL1:PUSHAXDECAXCALLFACTPOPAXMOVRE
34、SULTMOVRESNLT,AXEXIT:RETFACTENDPCODEENDSENDSTART,返回本节,6.8 宏指令与条件汇编宏指令是程序员自己设计的命令,是若干指令的集合,用以完成某种操作。1 无参数宏指令的定义与调用宏指令格式:名称 MACRO 宏体 ENDM2 LOCAL伪指令如果宏体中有分支、循环,必然有标号,两次以上调用这样的宏指令必然出现标号重复定义的错误,可以用LOCAL解决这类错误。,3 有参数宏定义与调用格式:4宏指令与子程序的区别6.8.2条件汇编格式1:IF 条件 指令集合1ELSE指令集合2ENDIF格式2:IF 条件指令集合ENDIF,6.9 代码转换 代码转换
35、是凶横许设计的常见课题,由于键盘输入、屏幕显示、打印机输出都使用字符ASCII码,而指令的运算对象及其结果都是一串0、1代码。输出显示的格式可能是二进制数、十进制数或十六进制数,因此许多场合都要进行代码转换。例6.9.1 键盘输入的一位十进制数ASCII码转换为二进制数显示。(P113)例6.9.2 二进制数转换为十六进制数显示。(P116)例6.9.3 二进制数转换为十进制数显示。(P116)例6.9.4 BCD码转换为二进制数显示。(P120),6.10 数值计算在汇编语言中,可进行数值计算的仅有加、减、乘、除、移位等作为基本的指令。运用这些基本指令哪怕是完成稍微复杂一些的数值计算都是比较
36、困难的。首先要探讨计算方法,要把某一些问题分解成能够用加、减、乘、除完成的基本操作,然后才能着手编程。例 6.10.1 求正整数N的开平方近似值。(P121)例6.10.2 多字节BCD码数相加。计算两个组合的四字节BCD码数之和。(P122),6.11 数据处理数据处理涉及地面比较广,其中字符处理和表格处理都属于数据处理范畴。6.12 字符串地动态显示技术例6.12.1,6.13 模块化程序设计,1PUBLIC伪指令格式:PUBLIC 符号,符号功能:说明其后的符号是全局符号。全局符号能被其他模块引用。2EXTRN伪指令格式:EXTRN 符号:类型,符号:类型功能:说明在本模块中需要引用的、
37、由其他模块定义的符号,即外部符号。,返回本章首页,3INCLUDE 伪指令格式:INCLUDE 盘符:路径文件名.扩展名功能:通知汇编程序把指定的文件“拷贝”一份,插入到该语句的下方供汇编时使用6.13.2 模块化程序设计考虑(1)在模块化程序设计之前要有一个总体规划,合理地划分模块,使每一个模块有相对独立地功能,尽量减少模块之间的调用。(2)在实模式下,链接之后的同类型逻辑段的体积不能超过64K。(3)模块之间,同类型逻辑段的组合与否,是需要重点考虑的问题。,(4)模块之间的转移和调用(5)模块之间出现符号名引用的时候必须用PUBLIC,EXTRN语句说明。6.13.4 宏指令共享,【例4.
38、17】,【例4.17】用模块化程序设计方法编制一个把十进制数N(16bit)转换成十六进制数的程序,要求待转换数N由键盘输入,转换结果在屏幕上显示出来。首先建立两个模块A:READ.ASM和模块B:SCREEN.ASM。其中模块A:完成转换功能,模块B完成显示功能。模块A:READ.ASMPUBLICcrlf,mEXTRNdisp:neardata SEGMENTPUBLIC datanDB0ah,0dh,input=$mDBoutput=$crlfDB0ah,0data ENDS,code SEGMENTPUBLICcodeASSUME cs:code,ds:datastart PROC f
39、arPUSH dsMOV ax,0PUSH ax MOV ax,data MOV ds,axREPEat:MOV bx,0MOV ah,9LEA dx,nINT 21hCALL DECibinCALL dispMOV ah,1INT 21h CMP al,0dhJZ END1JMP REPEatEND1:RETstart ENDP,DECibin PROC near newchar:MOV ah,1INT 21hSUB al,30hJL exitCMP al,39hJG exitCBWXCHG ax,bxMOV cx,10MUL cxXCHG ax,bxADD bx,axJMP newchar
40、exit:RETDECibin ENDPcode ENDSEND start,模块B:PUBLIC dispEXTRN crlf:byte,m:bytecode SEGMENT PUBLIC codeASSUME cs:codedisp PROC nearMOV ah,09hLEA dx,mINT 21h MOV ch,4,rotate:MOV cl,4ROL bx,clMOV al,blAND al,0fhADD al,30hCMP al,3ahJL printitADD al,07hprintit:MOV dl,alMOV ah,2INT 21hDEC chJNZ rotateRETdisp ENDPcode ENDSEND,