《第6章汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《第6章汇编语言程序设计.ppt(107页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第6章汇编语言程序设计 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望6.1.2 COM 文件的编程格式COM文件的编程格式必须必须符合以下规定:(1)源程序只允许使用一个逻辑段,即代码段,不允许设置堆栈段;(2)程序使用的数据,可以集中设置在代码段的开始或末尾;(3)在代码段偏移地址(有效地址)为100H的单元,必须是程序的启动指令;(4)代码段目标小于64KB。6.1.3EXE文件和COM文件的内存映像 EXE文件包括两部分:一部分为装入模块,另一部分为“重定
2、位信息”。调入后生成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段基址,FS=GS=0,并使IP=100H,SP=FFFEH。6.1.4 程序段前缀6.1.5返回DOS的其他方法对于COM文件有三种方法:(1)直接执行
3、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-DOS操作系统除了具有较为完整的文件管理功能之外,同时还为各种应用程序、外围设备等提供软件接口。它由三部分组成:IO.SYS、MSDOS.SYS以及COM
4、MAND.COM。DOS系统功能调用的方法一般可分为以下几步:设置所要调用功能的入口参数。在AH寄存器中存入所要调用功能的功能号。INT 21H指令自动转入中断子程序入口。相应中断子程序运行完毕,可按规定取得出口参数。返回本节返回本节6.2 DOS系统功能调用6.2 常用的DOS系统功能调用1单字符输入(1号调用)2单字符显示(2号调用)3打印输出(5号调用)4结束调用(4CH号调用)5显示字符串(9号调用)6字符串输入(10号调用)1单字符输入(1号调用)格式:MOVAH,1INT21H功能:从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。2单字符显示(2号调用)格式:MOV
5、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,待显示字符串首偏移地址MOVAH,9INT21H功能:将当前数据区中以结尾的字符串送显示器显示。6字符串输入(10号调用)格式:LEADX,缓冲区首偏移地址MOVAH,10I
6、NT 21H功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。DATASEGMENTSTRDB 0DH,0AH,Example of string display!DATAENDSSTACKSEGMENT STACKDB 100 DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACK【例【例3.25】若要在屏幕上显示字符串】若要在屏幕上显示字符串“Example of string display!”,则程序如下:则程序如下:BEGIN:MOV AX,DATAMOV DS,AXLEA DX,STRMOV AH,9INT
7、21HMOV AH,4CH INT21HCODEENDSEND BEGIN返回本节返回本节 综合举例【例3.27】已知一数据段中的数据为:DATASEGMENTADW MBUFDB AB,0DH,0AHCEQU 500HBDW 0FFAAHDDD BUFMDB 2DUP(1),2DUP(2,B)DATAENDS请画出该数据段数据存储的形式。返回本章首页返回本章首页该数据段在主存中的存储形式如左图所示。DATASEGMENTNUMDB 01000101BBUFDB 0DH,0AH,(NUM)=STRDB 4 DUP(?)DATAENDSSTACKSEGMENT STACKDB200 DUP(0)
8、STACKENDSCODESEGMENTASSUME DS:DATA,SS:STACK,CS:CODE【例【例3.28】阅读下列程序,指出此程序所完成的功能以】阅读下列程序,指出此程序所完成的功能以及在显示器上显示的内容。及在显示器上显示的内容。START:MOV AX,DATA MOV DS,AX LEA DI,STRMOV AL,NUM MOV CL,4SHR AL,CLORAL,30HMOV DI,ALINCDIMOV AL,NUM AND AL,0FHORAL,30HMOV DI,ALINCDIMOV BYTEPTR DI,HINCDIMOV BYTEPTR DI,LEA DX,BUF
9、 MOV AH,9INT21HMOV AH,4CHINT21HCODEENDSEND STARTDATASEGMENTINFO1DB0DH,0AH,INPUT STRING:INFO2DB0DH,0AH,OUTPUT STRING:BUFADB81DB?【例【例3.29】从键盘上输入一串字符到输入缓冲区,然后】从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。将输入的字符串在显示器上以相反的顺序显示。DB 80 DUP(0)BUFBDB81 DUP(0)DATAENDSSTACKSEGMENTDB200 DUP(0)STACKENDSCODESEGMENTASSU
10、MEDS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AXLEA DX,INFO1MOV AH,9;9号调用,显示输入提示信息INT21HLEADX,BUFAMOV AH,10;10号 调 用,键 盘 输 入 字 符 串 到 缓 冲区BUFAINT21HLEASI,BUFA+1 MOV CH,0;取字符长度CX MOV CL,SIADDSI,CX;SI 指向字符串尾部LEADI,BUFB;DI指向字符串变量BUFBNEXT:MOV AL,SIMOV DI,ALDEC SIINCDILOOPNEXTMOV BYTE PTR DI,LEADX,INFO
11、2MOV AH,9;9号调用,显示输出提示信息INT21HLEA DX,BUFBMOVAH,9 ;反向显示字符串INT 21HMOVAH,4CHINT 21HCODEENDSENDSTART返回本节返回本节6.3 BIOS键盘输入功能调用调用模式:MOV AH,功能号设置入口参数INT n分析出口参数BIOS键盘输入功能使用INT 16H1 功能号00H:读取键入的一个字符,无回显,响应CTRL_C,无键入则等待。入口参数:无出口参数:AL=输入字符的ASCII码2 功能号01H:查询键盘缓冲区入口参数:无出口参数:Z=0,表示有键入,否则无键入3 功能号02H:读取当前转换状态入口参数:无出
12、口参数:AL=键盘状态字(P94)4 功能号10H:读扩展键盘,无回显,响应CTRL_C。入口参数:无出口参数:同00H5 功能号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:从光标所在位置开始,显示若干
13、个相同的字符10功能号0AH:从光标所在位置开始,显示若干个相同的字符11功能号0EH:显示一个字符12功能号13H:显示字符串6.5 程序设计方法程序设计方法1 概述2 顺序程序设计3 分支程序设计4 循环程序设计5 子程序设计6 模块化程序设计7 高级汇编语言技术开开 始始 1 概述(1)汇编语言程序设计的一般步骤(2)流程图返回本章首页返回本章首页程序设计方法程序设计方法 汇编语言程序设计的一般步骤汇编语言程序设计一般有以下几个步骤:1分析问题,确定算法2绘制流程图3根据流程图编制程序4调试程序返回本节返回本节流程图1流程图的概念流程图是由特定的几何图形、指向线、文字说明来表示数据处理的
14、步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。2流程图符号表示流程图符号表示(1)起止框:表示程序)起止框:表示程序的开始和结束。的开始和结束。起止框起止框(2)判断框(3)处理框)处理框(4)调用框)调用框(5)指向线(6)连接框)连接框 返回本节返回本节2 顺序程序设计下面举例说明顺序程序的设计。【例4.1】试编写一程序计算以下表达式的值。=(v-(*+-540)/x式中x、v均为有符号字数据。设、的值存放在字变量、V中,结果存放在双字变量之中,程序的流程图如图4.1所示。返回本章首页返回本章首页图图4 4.1 1 顺顺序序运运算算程程序序流流程程图图源
15、程序如下:DATASEGMENTXDW200YDW100ZDW3000VDW10000WDW2 DUP(?)DATAENDSSTACKSEGMENT STACK DB 200 DUP(0)STACKENDSCODESEGMENTASSUME DS:DATA,CS:CODE,SS:STACKSTART: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,540S
16、BBBX,0;(BX:CX)-540(BX:CX)MOVAX,V CWD;(V)符号扩展SUBAX,CXSBBDX,BX;(DX:AX)-(BX:CX)(DX:AX)IDIVX;(DX:AX)/XMOV W,AX;商WMOV W+2,DX;余数DXW+2MOV AH,4CHINT21HCODEENDS;退出DOS 状态ENDSTART【例4.2】【例4.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:STACKSEGMENT STACKDB 200 DUP(0)STACKENDSDATA
17、SEGMENTTABDB 80,85,86,71,79,96 DB 83,56,32,66,78。84NO DB 10ENGLIST DB?DATAENDSCODESEGMENT ASSUME DS:DATA,SS:STACK,CS:CODEBEGIN:MOVAX,DATAMOVDS,AXLEABX,TAB MOVAL,NODELALXLATTABMOVENGLISH,ALMOVAH,4CHINT21HCODEENDSENDBEGIN6.5 分支程序设计(1)用条件转移指令实现程序分支(2)用跳转表实现多路分支返回本章首页返回本章首页(1)用条件转移指令实现程序分支【例4.3】编写计算下面函数
18、值的程序:1X0Y=0 X=0 -1 X设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如图4.2所示。程序如下:DATASEGMENTX DB -10Y DB?DATAENDSSTACKSEGMENT STACK DB 200 DUP(0)STACKENDSCODESEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATA MOVDS,AX CMPX,0;与0进行比较 JGEA1;X0转A1 MOVY,-1;X 0时,-1Y JMPEXITA1:JG A2;X0转A2 MOVY,0;X=0时,0Y JMPEXITA2:MOVY,1;X
19、0,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时,0Y JMPEXITA2:MOVY,1;X0,1Y EXIT:MOVAH,4CH INT21H CODE ENDS ENDSTART图图4.2 分支运算分支运算程序流程图程序流程图【例4.4】【例4.4】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如图
20、4.3所示 图图4.3例例4.4程序流程图程序流程图 程序如下:STACSEGMENT STACK DB 200 DUP(0)STACKENDSDATASEGMENTX DW 00ABHY DW 5Z DW 200MAXDW?DATAENDSCODESEGMENT ASSUME DS:DATA,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:MOV MAX,AX MOVAH,
21、4CH INT21HCODEENDS END START返回本节返回本节(2)用跳转表实现多路分支【例4.5】设某程序有8路分支,试根据给定的N值(18),将程序的执行转移到其中的一路分支。程序流程如图4.4所示。程序如下:DATASEGMENTTABDW P1,P2,P3,P4,P5,P6,P7,P8N DB 5DATAENDSSTACKSEGMENT DB 200 DUP(0)STACKENDSCODESEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START:MOV AX,DATAMOV DS,AXMOV AL,NDEL ALADD AL,ALMOV BM
22、,ALMOV BH,0JMP TABBXP1:JMP EXITP2:JMP EXITP2:JMP EXITP3:JMPEXITP8:EXIT:MOV AH,4CH INT21HCODEENDS END START上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻址,读者可自行考虑。返回本节返回本节6.6 循环程序设计6.1 循环程序的结构6.2 单重循环程序设计6.3 多重循环程序设计返回本章首页返回本章首页6.6 循环程序的结构1初始化部分2循环体部分3循环控制部分循环程序的常见结构形式如图4.5(a)、(b)所示。返回本节返回本节一、单
23、重循环程序设计1计数控制2条件控制1计数控制【例4.7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。其程序流程图如图4.6所示。图图4.6 程程序序流流程程图图【例4.8】【例4.8】试编写一程序,要求比较两个字符串STR1和STR所含字符是否相同,若相同则显示MATCH!,若不相同则显示NO MATCH!。(程序略)其流程图如图4.7所示。图图4.7 程程序序流流程程图图【例4.9】试编一个程序将字单元BUF中所含1的个数存入COUNT单元中。要测出BUF字单元所含1的个数,首先将BU
24、F中的数送给寄存器AX,然后将AX寄存器逻辑左移一次,如果CF=1,则表明AX中的最高位为1,则计数器CL计数1次,如果CF=0,表明AX最高位为0,这样依次将最高位移入CF中去测试。移位之后,判断AX的值是否为0,如果为0则结束循环,不为0,则继续循环。其流程图如图4.8所示。2条件控制 程序如下:STACKSEGMENT STACK DB 200 DUP(0)STACKEDNSDATASEGMENTBUFDW 0011110010101011BCOUNTDB?DATAENDSCODESEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK START:MOVAX,DA
25、TAMOVDS,AXMOVAX,BUFMOVCL,0;计数器为0COPA:ANDAX,AXJEEXIT;(AX)=0,结束循环SHLAX,1;AX 左移一位JNCLOPAINCCL;产生进位,(CL)+1CLJMPLOPAEXIT:MOVCOUNT,CLMOVAH,4CHINT21HCODEENDSENDSTART返回本节返回本节二、多重循环程序设计【例4.10】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以看
26、出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,整个排序过程最多需(N-1)遍。如下面的4个数即是采用冒泡排序比较的例子。数 108169032第一遍 101690328第二遍 169032108第三遍 903216108程序流程图如图4.9所示。程序如下:DATASEGMENTBUFDW 3,-4,6,7,9,2,0,-8,-9,-10,20N=(-BUF)/2DATAENDSSTACK SEGNMENT STACKDB 200 DUP(0)STACK ENDSCODESEGMENTASS
27、UME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVCX,NDECCXLOOP1:MOVDX,CXMOVBX,0LOOP2:MOVAX,BUFBXCMPAX,BUFBX+2JGELXCHG AX,BUFBX+2MOVBUFBX,AXL:ADD BX,2DEC CXJNELOOP2MOV CX,DXLOOPLOOP1MOV AH,4CHINT21HCODEENDSEND START程序运行后,BUF区中的内容如下:20,9,7,6,3,2,0,-4,-8,-9,-10若要对N个无符号数按由大到小的顺序排列,只需将指令“JGE L”改为“J
28、AE L”即可。返回本节返回本节6.7 子程序设计1 子程序的概念2 子程序的定义3 子程序设计方法4 子程序应用举例5 子程序的嵌套与递归调用返回本章首页返回本章首页1 子程序的概念在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。调用子程序的程序称为主调程序或主程序。返回本节返回本节2 子程序的定义子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程名 PROC NEAR/FAR 过程名 ENDP其中PROC表示过程定义开始,END
29、P表示过程定义结束。过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。返回本节返回本节3 子程序设计方法(1)信息的保护与恢复(2)主程序与子程序参数传递方式(1)信息的保护与恢复例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。PROGPROCPUSH AXPUSH BX PUSH CX;保护现场PUSH DX POP DXPOP CXPOP BX;恢复现场POP AXRET;返回断点处PROCENDP(2)主程序与子程序参数传递方式(1)寄存器法(2)约定内存单元单元法(3)堆栈法返回本节返
30、回本节4 子程序应用举例【例4.12】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为10010011。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。入口参数:DX存放待转换的二进制数CX存放待转换数的位数(8位或16位)DI存放ASCII码首地址出口参数:转换后的字符串存放在以DI作指针的字节存贮区中程序如下:DATASEGMENTNUM8DB93HNUM16DW0ABCDHASCBUFDB20DUP(0)DATAENDSCODESEGMENTASSUME DS:DAT
31、A,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$LEADX,ASCBUFMOVAH,9INT21HMOVDX,NUM16MOVCX,16;置位数16LEADI,ASCBUFCALLBTASC MOVDL,BYTE PTR 0DHMOVDL+1,BYTE PTR 0AHMOVDL+2,BYTE
32、PTR;显示转换后的字符串LEADX,ASCBUF MOVAH,9 INT21HBTASC PROCPUSHAX;保存AXMOVAL,0CMPCX,8;比较8位数JNEL1;直接转换16位数MOVDH,DL;8位数转换送DHL1:ROLDX,,1;DX最高位移入CFRCLAL,1;CF移入AL最低位ADDAL,30HMOVDI,ALINCDILOOPL1POP AXRETBTASCENDPCODEENDSEND START返回本节返回本节5 子程序的嵌套与递归调用1子程序的嵌套子程序不但可以被主程序调用,而且也可以被其他子程序调用。我们把一个子程序调用另一个子程序称为子程序的嵌套调用。2子程序
33、的递归调用子程序的递归调用是指一个子程序直接或间接地调用自己。递归子程序一般对应于数学上对函数的递归定义,它往往能设计出效率较高的程序,完成相当复杂的计算,因而是很有用的。【例4.15】【例4.15】试编制计算N!(N0)的程序。N!=N*(N-1)*(N-2)*1其递归定义如下:0!=1N!=N*(N-1)!(N1)计算N!的子程序FACT的流程图如图4.10所示。【例4.16】计算5!的程序示例,RESULT是保存阶乘的存储单元。程序如下:STACK SEGMENT STACKDB 200 DUP(0)STACK ENDSDATASEGMENTNDW 5RESULTDW?DATAENDSC
34、ODESEGMENTASSUME CS:CODE,SS:STACK,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,NCALLFACTMOVAX,RESULTMOVAH,4CHINT21HFACTPROCCMPAX,0JNEL1MOV RESULT,1JMPEXITL1:PUSH AXDECAXCALL FACTPOPAXMOV RESULTMOV RESNLT,AXEXIT:RETFACT ENDPCODE ENDSENDSTART返回本节返回本节6.8 6.8 宏指令与条件汇编宏指令与条件汇编宏宏指指令令是是程程序序员员自自己己设设计计的的命命令令,是是若若干干指
35、指令的集合,用以完成某种操作。令的集合,用以完成某种操作。1 1 无参数宏指令的定义与调用无参数宏指令的定义与调用宏指令格式:宏指令格式:名称名称 MACROMACRO 宏体宏体 ENDM ENDM2 LOCAL2 LOCAL伪指令伪指令如如果果宏宏体体中中有有分分支支、循循环环,必必然然有有标标号号,两两次次以以上上调调用用这这样样的的宏宏指指令令必必然然出出现现标标号号重重复复定义的错误,可以用定义的错误,可以用LOCALLOCAL解决这类错误。解决这类错误。3 有参数宏定义与调用格式:4宏指令与子程序的区别6.8.2条件汇编格式1:IF 条件 指令集合1ELSE指令集合2ENDIF格式2
36、:IF 条件指令集合ENDIF6.9 代码转换代码转换 代码转换是凶横许设计的常见课题,由于键盘输入、屏幕显示、打印机输出都使用字符ASCII码,而指令的运算对象及其结果都是一串0、1代码。输出显示的格式可能是二进制数、十进制数或十六进制数,因此许多场合都要进行代码转换。例6.9.1 键盘输入的一位十进制数ASCII码转换为二进制数显示。(P113)例 6.9.2 二 进 制 数 转 换 为 十 六 进 制 数 显 示。(P116)例6.9.3 二进制数转换为十进制数显示。(P116)例6.9.4 BCD码转换为二进制数显示。(P120)6.10 数值计算数值计算在汇编语言中,可进行数值计算的
37、仅有加、减、乘、除、移位等作为基本的指令。运用这些基本指令哪怕是完成稍微复杂一些的数值计算都是比较困难的。首先要探讨计算方法,要把某一些问题分解成能够用加、减、乘、除完成的基本操作,然后才能着手编程。例 6.10.1 求 正 整 数 N的 开 平 方 近 似 值。(P121)例6.10.2 多字节BCD码数相加。计算两个组合的四字节BCD码数之和。(P122)6.11 数据处理数据处理数据处理涉及地面比较广,其中字符处理和表格处理都属于数据处理范畴。6.12 字符串地动态显示技术字符串地动态显示技术例例6.12.16.13 模块化程序设计1PUBLIC伪指令格式:PUBLIC 符号,符号功能:
38、说明其后的符号是全局符号。全局符号能被其他模块引用。2EXTRN伪指令格式:EXTRN 符号:类型,符号:类型功能:说明在本模块中需要引用的、由其他模块定义的符号,即外部符号。返回本章首页返回本章首页3 3INCLUDE INCLUDE 伪指令伪指令格式:格式:INCLUDE INCLUDE 盘符:盘符:路径路径 文件名文件名.扩展名扩展名功功能能:通通知知汇汇编编程程序序把把指指定定的的文文件件“拷拷贝贝”一份,插入到该语句的下方供汇编时使用一份,插入到该语句的下方供汇编时使用6.13.2 6.13.2 模块化程序设计考虑模块化程序设计考虑(1 1)在在模模块块化化程程序序设设计计之之前前要
39、要有有一一个个总总体体规规划划,合合理理地地划划分分模模块块,使使每每一一个个模模块块有有相相对对独独立地功能,尽量减少模块之间的调用。立地功能,尽量减少模块之间的调用。(2 2)在在实实模模式式下下,链链接接之之后后的的同同类类型型逻逻辑辑段段的体积不能超过的体积不能超过6464K K。(3 3)模模块块之之间间,同同类类型型逻逻辑辑段段的的组组合合与与否否,是需要重点考虑的问题。是需要重点考虑的问题。(4 4)模块之间的转移和调用)模块之间的转移和调用(5 5)模模块块之之间间出出现现符符号号名名引引用用的的时时候候必必须须用用PUBLICPUBLIC,EXTRNEXTRN语句说明。语句说
40、明。6.13.4 6.13.4 宏指令共享宏指令共享【例4.17】【例例4.174.17】用用模模块块化化程程序序设设计计方方法法编编制制一一个个把把十十进进制制数数N N(16bit16bit)转转换换成成十十六六进进制制数数的的程程序序,要要求求待待转转换换数数N N由由键键盘盘输输入入,转转换换结结果果在在屏屏幕幕上上显显示示出出来来。首首先先建建立立两两个个模模块块A A:READ.ASMREAD.ASM和和模模块块B B:SCREEN.ASMSCREEN.ASM。其其中中模模块块A A:完完成成转转换换功能,模块功能,模块B B完成显示功能。完成显示功能。模块模块A A:READ.A
41、SMREAD.ASMPUBLICPUBLIC crlf,mcrlf,mEXTRNEXTRNdisp:neardisp:neardata data SEGMENTSEGMENTPUBLIC PUBLIC datadatan nDBDB0ah,0dh,input=$0ah,0dh,input=$m mDBDBoutput=$output=$crlfcrlfDBDB0ah,00ah,0data data ENDSENDScode code SEGMENTSEGMENT PUBLICPUBLICcodecodeASSUME ASSUME cs:code,ds:datacs:code,ds:datast
42、art start PROC farPROC farPUSH dsPUSH dsMOV ax,MOV ax,0 0PUSH axPUSH ax MOV ax,data MOV ax,data MOV ds,axMOV ds,axREPEat:REPEat:MOV bx,MOV bx,0 0MOV ah,MOV ah,9 9LEA dx,nLEA dx,nINT INT 21h21hCALL DECibinCALL DECibinCALL dispCALL dispMOV ah,MOV ah,1 1INT INT 21h21h CMP al,CMP al,0dh0dhJZ END1JZ END1
43、JMP REPEatJMP REPEatEND1:END1:RETRETstart start ENDPENDPDECibin PROC near newchar:MOV ah,1INT 21hSUB al,30hJL exitCMP al,39hJG exitCBWXCHG ax,bxMOV cx,10MUL cxXCHG ax,bxADD bx,axJMP newcharexit: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,4rotate: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
限制150内