第5章-程序举例.ppt
- 文档编号:11670419
- 上传时间:2023-06-02
- 格式:PPT
- 页数:162
- 大小:644.50KB
第5章-程序举例.ppt
《第5章-程序举例.ppt》由会员分享,可在线阅读,更多相关《第5章-程序举例.ppt(162页珍藏版)》请在冰点文库上搜索。
第5章汇编语言程序设计,一.EXE文件编程格式允许源程序使用多个逻辑段,适合编写大型程序,最终能生成.EXE文件,例:
将N1和N2两个单字节数以28为模求和SUM单元,5.1汇编源程序的编程格式,.486DATASEGMENTUSE16N1DBxxN2DBxxSUMDB?
DATAENDSSTACK_SEGMENTSTACKSTACKUSE16DB128DUP(?
)STACK_ENDS,BEG:
MOVAX,DATAMOVDS,AXMOVAX,STACK_MOVSS,AXMOVSP,128MOVAL,N1ADDAL,N2MOVSUM,ALMOVAH,4CHINT21HCODEENDSENDBEG,可省,CODESEGMENTUSE16ASSUMECS:
CODE,DS:
DATA,SS:
STACK_,说明:
.EXE文件中堆栈段的设置本例以“STACK_”为段名的逻辑段,选用了“STACK”链接参数,DOS自动认为“STACK_”段为堆栈段。
所以,DOS将自动给SS:
SP赋初值因此,源程序给SS:
SP赋初值的三条语句是多余的。
链接程序要求:
.EXE文件中的源程序必须有堆栈段,否则链接时将给出警告信息Warningnostacksegment但这不代表源程序有错,仅仅是警告而已,如果源程序中不设置堆栈段(在链接时,会给出错误信息),DOS将自动给程序分配最少128字节的堆栈区,故源程序中,如果没有大量数据压栈的话,可以不设置堆栈段,从而简化程序。
二.COM文件的编程格式1.汇编语言规定:
COM文件的源程序只能有一个段:
代码段,不允许有堆栈段在代码段偏移地址=100H处,必须是程序的启动指令程序中使用的数据可以放在代码段的开始或结尾,.486.486CODESEGMENTUSE16CODESEGMENTUSE16ASSUMECS:
CODEASSUMECS:
CODEORG100HORG100HBEG:
JMPSTARTBEG:
MOVAL,N1N1DBXXADDAL,N2N2DBXXMOVSUM,ALSUMDB?
MOVAH,4CHSTART:
MOVAL,N1INT21HADDAL,N2N1DBXXMOVSUM,ALN2DBXXMOVAH,4CHSUMDB?
INT21HCODEENDSCODEENDSENDBEGENDBEG,2.例:
上例,写成COM格式源程序,3.COM文件的生成设上例的文件名为N1ADDN2.ASM编辑生成N1ADDN2.ASM调用TASM.EXE生成N1ADDN2.OBJTASMN1ADDN2调用TLINK.EXE生成N1ADDN2.COMTLINKN1ADDN2/t注意:
链接参数为小写字母t,三.EXE文件、COM文件的内存映像,INT20H,.,数据段,代码段,堆栈段,DS=ES,CS:
IP,SS:
SP,PSP,用户程序,EXE文件内存映像,EXE文件的内存映像DOS把EXE文件调入内存之后,自动在目标程序上方(低地址处)生成一个有256字节的数据块程序段前缀(PSP)DOS令DS=ES=PSP段基址,即DS用户数据段段基址,ES用户附加段段基址DOS令CS:
IP=代码段启动指令的逻辑地址,三.EXE文件、COM文件的内存映像,INT20H,.,数据段,代码段,堆栈段,DS=ES,CS:
IP,SS:
SP,PSP,用户程序,EXE文件内存映像,EXE文件的内存映像DOS令SS:
SP=用户堆栈段(如果有堆栈段的话)栈顶的逻辑地址,所以:
用户程序必须给DS赋值,使DS=用户数据段段基址;用户程序必须给ES赋值,使ES=用户附加段段基址FS=GS=0,如果用户程序使用了FS、GS附加段,则必须给FS、GS赋初值,三.EXE文件、COM文件的内存映像,INT20H,.,代码段,堆栈段,00H,00H,CS=DS=ES=SS,IP=100H,SP,PSP,64K-256,COM文件内存映像,2.COM文件内存映像COM文件调入内存后,DOS也在其上方生成一个PSPCS=DS=SS=ES=PSP段基址,即用户程序的代码段、数据段、ES附加段和堆栈区都在一个64k的逻辑段中DOS自动使IP=100H,自动执行偏移地址为100H处的那条指令,三.EXE文件、COM文件的内存映像,INT20H,.,代码段,堆栈段,00H,00H,CS=DS=ES=SS,IP=100H,SP,PSP,64K-256,COM文件内存映像,2.COM文件内存映像DOS自动使SP=FFFEH,且SS:
SP=SS:
SP+1=0,这就意味在COM文件中代码段以下,FFFEH以上这一片存储单元都是用户的堆栈区FS=GS=0,四.程序段前缀PSPPSP是一个有256字节的数据块,由DOS在装载可执行文件时自动生成。
DOS通过PSP向用户程序传递数据,PSP是程序运行不可缺少的部分每一个可执行文件都伴随有自己的PSP,五.返回DOS的基本方法对于EXE文件和COM文件,返回DOS最常用的方法是调用“INT21H”的4CH功能。
除此之外:
1.对于COM文件还有以下3种方法可以返回DOS,即:
直接执行INT20H;,调用INT21H的0号功能;执行RET指令。
如果此时SP仍然等于FFFEH的话(程序中规范的使用堆栈,在执行RET之前把进栈的数据全部弹出,则SP必然等于FFFEH),CPU将无条件转入PSP的首单元,执行那里的INT20H,返回DOS。
2.对于EXE文件的编程格式,还有一种返回DOS的方法,就是在需要返回DOS的时候,设法使CPU转到PSP首单元,执行那里的INT20指令。
为此,源程序必须采取下面的3项措施,缺一不可:
把代码段包含在一个远过程之中;在给DS赋初值之前,用下列3条指令把PSP首单元的物理地址压入栈顶,即:
PUSHDSMOVAX,0PUSHAX在采取了以上两条措施之后,程序在需要返回DOS的地方执行一条RET指令即可返回DOS。
因为这条RET指令是远过程中的返回指令,它将从栈顶弹出4个字节,即把PSP首单元的物理地址反弹到CS:
IP之中,从而使CPU转移到PSP首单元,执行那里的INT20H,再返回DOS。
综上所述,虽然返回DOS有好几种方法,但是调用INT21H的4CH功能,是返回DOS的最常用的方法,它的优点是简单、通用,而且有利于组织批处理文件。
BIOS/DOS调用模式:
MOVAH,功能号设置入口参数INTn分析出口参数,BIOS/DOS功能调用,子程序调用结束后一般都有出口参数,这些出口参数常放在寄存器中,通过出口参数可以知道功能调用的成功与否。
其中n值因子程序不同而可能不同,比如:
ROMBIOS有n=51FH,DOS有n=20H,21H,232AH,2EH,2FH,33H和67H等几种情况。
有的n只对应一个子程序,有的n对应很多子程序,,.2DOS系统I/O功能调用,在DOS功能子程序调用中,我们把通过INT21H来实现的子程序调用成为DOS系统功能调用。
调用模式:
MOVAH,功能号设置入口参数INT21H分析出口参数,功能号01H等待键入一个字符,有回显,响应Ctrl_C入口参数:
无。
出口参数:
AL=按键的ASC码,若AL=0,表明按键是功能键、光标键,需再次调用此功能,才能返回按键的扩展码。
功能号02H显示一个字符,响应Ctrl_C入口参数:
DL=待显字符的ASC码。
出口参数:
无。
本功能在屏幕的当前位置显示一个字符,光标右移一格,如果是在一行末尾显示字符,则光标返回下一行的开始格。
如果是在屏幕的右下角显示字符,光标返回时屏幕要上滚一行。
试验表明,该项功能要破坏AL寄存器的内容。
功能号07H等待键入一个字符,无回显,不响应Ctrl_C。
入口参数:
无。
出口参数:
AL=按键的ASC码,若AL,需再次调用该功能才能在AL中得到按键的扩展码。
功能号09H显示字符串,响应Ctrl_C。
入口参数:
DS:
DX=字符串首地址,字符串必须以$(即ASC码24H)为结束标志。
出口参数:
无。
该项功能从屏幕当前位置开始,显示字符串,遇到结束标志$时停止,$字符并不显示。
实验表明,9号功能也破坏AL寄存器的内容。
功能号08H等待键入一个字符,无回显,响应Ctrl_C。
入口参数:
无。
出口参数:
AL=按键的ASC码,若AL0,需再次调用该功能才能在AL中得到按键的扩展码。
功能号0AH等待键入一串字符,送用户程序数据缓冲区入口参数、出口参数如图所示。
0AH要求键入的字符串以“回车”作为结束标志,换句话说,按下回车键后,此功能调用结束,光标返回当前行始格。
“回车”符留在缓冲区当中。
对数据缓冲区的格式有如下要求:
缓冲区要设置在用户程序数据段,调用前,缓冲区首址偏移量应赋给DX寄存器。
缓冲区首单元应预置“允许接受的字符个数”(包括回车符在内)。
用户键入回车后,由0AH功能把实际键入的字符个数(不包括回车符)写入BUF+1单元。
键入的字符串从BUF+2单元开始依次存放。
因此,缓冲区的容量要大于或等于键入串的长度+2(注意:
键入的字符串长度应包括回车符)。
缓冲区不接受超长字符,并发出声响以示警告,0AH在接收字符的过程中,有回显,响应Ctrl_C,按下退格键可删除屏幕及缓冲区中的当前字符。
下面的程序段给出了0AH功能调用的示范,它允许用户键入15个字符(包括回车键)。
假设数据段BUFDB15DB?
DB15DUP(?
)代码段.MOVAH,0AHMOVDX,OFFSETBUFINT21H.,功能号0CH清除键盘缓冲区,然后调用由AL指定的功能。
入口参数:
AL允许是:
01H键入一个字符,有回显,响应Ctrl_C。
06H字符I/O。
07H键入一个字符,无回显,不响应Ctrl_C。
08H键入一个字符,无回显,响应Ctrl_C。
0AH键入一串字符,写入用户数据区。
其他入口参数应根据相关的功能,另行设置。
功能号4CH该功能是指,终止当前程序的运行,并把控制权交给调用它的程序。
由被终止程序打开的全部文件都被关闭,该项功能还把程序占用的内存空间交还给DOS另行分配。
该项功能允许被终止的程序传送一个“返回码”给调用它的程序。
假若被终止的程序是由DOS命令调入的,那么返回码可以被DOS批处理命令中的“IFERRORLEVEL”子命令识别。
入口参数:
AL=返回码(或者不设置)。
出口参数:
无。
说明:
当用户程序执行1,2,8,9,0AH,0BH,OCH功能调用时,如果键入Ctrl_C或者Ctrl_Break,DOS将自动调用INT23H中断处理程序,从而强行使用户程序中断,我们称为响应Ctrl_C。
例:
人机会话程序。
问题:
如何设置程序运行所需的数据?
有以下几种方法数据设置在程序的数据段程序运行时通过人机会话临时键入程序装入时通过命令行参数给出本例学习前两种方法,并以此学习DOS功能调用。
Limai?
(Y/N),Whatisyourname?
1.会话内容及设计思路,Linai;前者是程序给出的询问信息,后者是用户键入的回答,N;程序复制的姓名和回答提示,Limai;再次问答,Linai?
(Y/N),Whatisyourname?
Y,2.框图:
N,DATASEGMENTUSE16MESG1DB0DH,0AHDBWhatisyourname?
$MESG2DB?
(Y/N)$BUFDB30DB?
DB30DUP(?
)DATAENDSCODESEGMENTUSE16ASSUMECS:
CODE,DA:
DATABEG:
MOVAX,DATAMOVDS,AXAGAIN:
MOVAH,9MOVDX,OFFSETMESG1INT21H;询问姓名MOVAH,0AHMOVDX,OFFSETBUFINT21H;接收键入字符串MOVBL,BUF+1MOVBH,0,.486,;实际键入的字符个数BXMOVSI,OFFSETBUF+2MOVBYTEPTRBX+SI,$;用$作为串结束符MOVAH,2MOVDL,0AHINT21H;光标下移一行MOVAH,9MOVDX,OFFSETBUF+2INT21H;复制键入的字符串MOVAH,9MOVDX,OFFSETMESG2INT21H;给出认可信息MOVAH,1INT21H;等待键入CMPAL,Y;比较JNEAGAINMOVAH,4CHINT21H;返回DOSCODEENDSENDBEG,.3BIOS键盘输入功能调用,主板EPROM中固化有基本I/O系统程序BIOS,它是最接近硬件的驱动程序,BIOS中的许多子程序可被用户程序调用,调用这些子程序称为BIOS功能调用。
调用模式:
MOVAH,功能号设置入口参数INT16H分析出口参数,BIOS常用的键盘输入功能调用如下:
(调用指令INT16H)功能号00H读取键入的一个字符,无回显,响应Ctrl_C,无键入则等待。
入口参数:
无。
出口参数:
AL=键入字符的ASCII码.若AL=0,则AH=输入键的扩展码。
功能号01H查询键盘缓冲区。
入口参数:
无。
出口参数:
Z标志=0,表示有键入,此时AL=键入字符的码,AH=键入字符的扩展码。
注意:
该功能调用结束后,键代码仍留在键盘缓冲区中。
Z标志=1,表示无键入。
功能号02H读取当前转换键状态。
入口参数:
无。
出口参数:
AL=键盘状态字。
状态字各位定义如下:
AL7位置1表示Insert键有效(被奇数次按下)。
AL6位置1表示CapsLock键有效(相应的指示灯亮)。
AL5位置1表示NumLock键有效(相应的指示灯亮)。
AL4位置1表示ScrollLock键有效(相应的指示灯亮)。
AL3位置1表示按下了Alt键。
AL2位置1表示按下了Ctrl键。
AL1位置1表示按下了左Shift键。
AL0位置1表示按下了右Shift键。
功能号10H读扩展键盘,无回显,响应Ctrl_C。
入口参数:
无。
出口参数:
AL=键入字符的ASC码,若AL=0,则AH=键入字符的扩展码。
功能号11H查询扩展键盘缓冲区。
入口参数:
无。
出口参数:
Z标志=0,表示有键入,此时AL=键入字符的ASC码,AH=键入字符的扩展码。
注意:
该功能调用结束后,键代码仍留在键盘缓冲区中。
Z标志=1,表示无键入。
功能号12H读取扩展键盘的转换键状态。
入口参数:
无。
出口参数:
AL=扩展键盘状态字,AL7AL0的置位条件同功能号02H。
例如:
SCAN:
MOVAH,1INT16HJZSCANMOVAH,0INT16H;按键的键代码AL,.4CRT显示器与BIOS文本显示功能调用,显示器是输出设备,显示适配器是CRT与主机的接口电路,CRT和CRT适配器共同组成了显示系统,文本方式:
显示数字,字符图形方式:
显示点,由点(像点)组成图形,2.显示存储区与显示屏,单显8025文本方式,彩显8025文本方式,0页,1页,2页,3页,B000,B800,B900,BA00,BB00,ASC码,属性,.,ASC码,属性,:
0000:
0001,:
0F9E:
0F9F,079列,024行,显示存储区与屏幕字符的对应关系,显示存储区是系统RAM的一部分,其中存放待显字符的ASC码和它的属性字。
工作在8025文本方式下,屏幕被“划分”为2000个“方格”,每一个方格显示一个“点阵字符”,列号079,行号024。
显示器一个小方格对应显示存储区的两个单元,所以2000个方格对应4000个单元。
彩显适配器,文本显示存储区有16K,分为4页(03)段基址为B800H,B900H,BA00H,BB00H。
3.当前页系统启动时,BIOS自动完成显示适配器的初始化,显示器自动工作在8025黑白文本方式,并且默认第0页为“当前页”。
CRT控制器按50屏/秒的速度从0页显示区取字符屏幕显示,重复不断,故能收到稳定显示的效果。
调用5#功能,可以选择其他显示存储区(13)为“当前页”。
4.文本方式属性字彩显属性字:
5.屏显的编程方法DOS功能调用(如:
2#,9#)BIOS功能调用(0EH#,13H#)直接对显示存储区进行写操作,6.BIOS屏显功能调用的调用模式MOVAH,功能号预置入口参数INT10H分析出口参数,7.文本方式BIOS屏显子功能调用指令INT10H。
功能号00H设置屏幕显示方式(兼有清屏功能)入口参数:
AL=04025黑白文本方式AL=14025彩色文本方式AL=28025黑白文本方式AL=38025彩色文本方式出口参数:
无。
功能号02H预置光标位置。
入口参数:
BH=显示页号,DH=行号,DL=列号。
出口参数:
无。
功能号05H设置当前显示页。
入口参数:
AL=显示存储器页号(在80列方式中为03)。
出口参数:
在屏幕上显示出指定显示页的字符(只对文本方式有效)。
功能号06H窗口上滚。
入口参数:
AL=窗口上滚的行数,BH=底部空白行属性字,CH、CL=窗口左上角的行、列号,DH、DL=窗口右下角的行、列号。
出口参数:
无。
说明:
该功能允许在屏幕上定义一个窗口,并使窗口信息上滚AL行。
窗口是屏幕上一个局部的显示框,窗口上滚一行,即:
窗口顶部信息移出窗口之外而消失,窗口底部自动留出一行空白,底部空白行的属性由BH中属性字决定。
若AL=0,则窗口信息全部移出。
功能号0EH显示一个字符。
入口参数:
AL=待显字符的ASC码。
出口参数:
无。
说明:
该功能在光标的当前位置显示一个字符,随后光标前进一格,满一行后自动换行,满一页则整屏信息上滚一行。
与DOS系统的2号功能调用具有相同的效果。
功能号13H显示字符串。
入口参数:
AL=03,BH=显示页号,BL=属性字(当AL=0,1时有效),CX=串长度,DH,DL=字符串显示的起始行、列号,ES:
BP=待显字符串首地址。
出口参数:
无。
说明:
仅286以上微机BIOS有此功能,该功能从屏幕的指定位置开始显示一串彩色字符。
待显字符串需放在附加段,首地址偏移量需写入BP寄存器。
AL=0表示:
待显字符串中仅包含字符的ASC码,串中各字符的属性由BL中的属性字决定,串显示结束后,光标返回到调用前的位置。
AL=1表示:
待显字符串中仅包含字符的ASC码,串中各字符的属性由BL中的属性字决定,串显示结束后,光标停留在字符串的末尾。
AL=2表示:
待显字符串中包含有各个字符的ASC码和属性字,格式为ASC码,属性,ASC码,属性。
串显示结束后,光标返回到调用前的位置。
AL=3表示:
待显字符串中包含有各个字符的ASC码和属性字,格式同上,串显示结束后,光标停留在字符串的末尾。
当AL选择2或3的时候,CX中的串长度不包括各字符的属性字节。
8.什么是“窗口上滚”?
窗口:
屏幕上任意位置的一个巨型区域称为一个“窗口”号功能可以在屏幕上定义一个窗口,并使窗口中的信息向上“平移”若干行,这称为“窗口上滚”,上滚后顶部行信息移出窗口而消失,底部留出一空白行,空白行的属性可由用户选择。
注意:
13H功能是唯一能显示彩色字符的子功能例:
在屏幕左上角显示HELLO黑底灰白字符在屏幕中央显示IAMASTUDENT红底白字,思路:
显示HELLO,用DOS功能#要求待显字符串放在数据段,串尾用$作结束符,显示IAMASTUDENT,用BIOS13H功能它要求待显字符串在附加段这意味着源程序至少要有三个逻辑段,我们令数据段与附加段“重叠”,这样源程序仅设置两个逻辑段即可。
.486DATASEGMENTUSE16MESG1DBHELLO$MESG2DBIAMASTUDENTLL=$MESG2DATAENDSCODESEGMENTUSE16ASSUMECS:
CODEASSUMEDS:
DATAASSUMEES:
DATABEG:
MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,0003HINT10H,MOVAH,9MOVDX,OFFSETMESG1INT21HMOVAX,1301HMOVBH,0MOVBL,01001111BMOVCX,LLMOVDH,12MOVDL,(80-LL)/2MOVBP,OFFSETMESG2INT10HMOVAH,4CHINT21HCODEENDSENDBEG,5.5分支程序,例.二进制数显示将BX寄存器中的内容以二进制数格式屏显,DOS功能调用BIOS功能调用:
(本例令BX=5678H),1,数BX,16次CX,C标=?
1AL,调BIOS.0EHCX-1CX,CX=0,0ALBX左移一位,0,N,Y,返DOS,解:
486CODESEGMENTUSE16ASSUMECS:
CODEBEG:
MOVBX,5678HMOVCX,16LAST:
MOVAL,0ROLBX,1JNCNEXTMOVAL,1NEXT:
MOVAH,0EHINT10HLOOPLASTMOVAH,4CHINT21HCODEENDSENDBEG,例.复合分支举例(书例自学)某科室9人,统计月收入在800900间的人数,并用十进制数显示。
解:
月收入是无符号数,对一批数处理应该用间址。
解:
486DATASEGMENTUSE16NUMDWXX,XXDATAENDSCODESEGMENTUSE16ASSUMECS:
CODE,DS:
DATABEG:
MOVAX,DATAMOVDS,AXMOVBX,OFFSETNUMMOVCL,9MOVDL,0LAST:
CMPWORDPTRBX,800JCNEXT;800时转CMPWORDPTRBX,900,JANEXT;900转INCDLNEXT:
INCBXINCBXDECCLJNZLASTADDDL,30H;DL=09ASC码MOVAH,2INT21HMOVAH,4CHINT21HCODEENDSENDBEG,例.多分支段内转移要求:
键入0,转P0程序段键入1,转P1程序段键入9,转P9程序段,思路:
用比较指令配合直接转移指令实现CMP键入字符,0JEP0CMP键入字符,1JEP1,用转移地址表配合间接转移指令实现,解:
486DATASEGMENTUSE16TABDWP0,P1,P9;汇编后自动装入相应的偏移地址MESGDB0DH,0AH,strike09:
$DATAENDSCODESEGMENTUSE16ASSUMECS:
CODE,DS:
DATABEG:
MOVAX,DATAMOVDS,AXAGA:
MOVAH,9MOVDX,OFFSETMESGINT21HMOVAH,1INT21HCMPAL,0JCAGA,CMPAL,9JAAGASUBAL,30HMOVZXBX,ALADDBX,BX;2BXBXMOVSI,OFFSETTABJMPBX+SI;DS:
BX+SIIPP0:
P1:
P9:
CODEENDSENDBEG,1.循环程序的结构,5.6循环程序,2.结束循环的技巧(编程技巧)用寄存器做循环计数器用内存单元做循环计数器用循环结束标志结束循环,例.设从BUF单元开始,存有若干
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序 举例