6.1汇编源程序的编程格式6.2系统功能调用6.3程序设计举例6.4Windows汇编语言编程初步第6章汇编语言程序设计汇编源程序有两种编程格式:EXE文件的编程格式:只能生成扩展为EXE的可执行文件;COM文件的编程格式:可以生成扩展为COM的可执行文件。COM文件的执行级别高于EXE文件,同名的BAT(批处理)文件执行级别最低。6.1源程序的编程格式EXE文件的编程格式此格式允许源程序使用多个逻辑段(包括数据段、堆栈段、代码段及其它逻辑段);在实模式下,每个逻辑段的目标块不超过64K;适合编写大型程序。.486DATASEGMENTUSE16;定义数据段MESGDB‘IAMASTUDENT!’,’$’DATAENDSCODESEGMENTUSE16;定义代码段ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXLAST:MOVAH,9MOVDX,OFFSETMESGINT21HMOVAH,4CHINT21H;返回DOSCODEENDSENDBEGEXE文件的内存映象磁盘上的EXE文件包括两部分:装入模块和重定位信息•DOS装载EXE文件时,根据重定位信息完成装入模块的重定位。同时,重定位信息被丢弃。•DOS在同一内存块的用户程序上方(低地址处)偏移地址为00H~FFH的单元处自动生成一个256字节的数据块,称为程序段前缀(PSP)。•DOS自动使DS=ES=存放PSP的段基址,使CS:IP指向用户程序的启动地址INT20H数据段代码段堆栈段DS,ESCS:IPSSSP注:DOS把EXE文件调入内存后,自动给SS、SP赋初值,程序中给SS、SP赋初值的指令可省略。PSP(256字节)用户程序COM文件的编程格式汇编语言要求此格式必须符合以下规定:·源程序只允许使用一个逻辑段,即代码段,不允许设置堆栈段;·程序使用的数据,可以集中设置在代码段的开始或未尾;·在代码段偏移地址(有效地址)为100H的单元,必须是程序的启动指令;·代码段目标块小于64K。·COM文件的编程格式适合于编写中小型程序。.486CODESEGMENTUSE16ASSUMECS:CODEORG100H;定位语句BEG:JMPSTARTMESGDB‘HELLO’,0DH,0AH,’$’;用户程序数据区START:MOVCX,10;设置循环次数LAST:MOVAH,9MOVDX,OFFSETMESGINT21H;显示一行HELLOLOOPLAST;循环计数MOVAH,4CHINT21H;返回DOSCODEENDSENDBEGCOM文件的内存映象磁盘上的COM文件没有重定位信息,体积比EXE文件小。DOS装载COM文件时,在同一内存块的用户程序上方(低地址处)偏移地址为00H~FFH的单元处自动生成一个PSP;然后从偏移地址100H处开始存放用户程序;DOS自动使CS=DS=ES=SS=存放PSP的段基址,使IP=100H,SP=FFFEH。INT20H代码段堆栈段CS,DSES,SSIP(FFFEH)SPPSP(256字节)用户程序(64K-256)6.2系统功能调用DOS的4个组成部分中IBMBIO.COM和IBMDOS.COM是DOS系统的核心模块IBMBIO.COM为基本I/O设备处理程序,与BIOS一起完成数据输入和数据输出的基本操作IBMDOS.COM是磁盘文件管理程序;一片大容量的EPROM或FLASH存储器这两个模块均有若干子功能可以被用户程序调用,称为“DOS功能调用”和“BIOS功能调用”(系统功能调用)PC-DOS的模块结构DOS—ShellDOS—KernelDOS—BIOS1.命令处理程序command.com——命令解释,外部命令装入等。2.DOS内核程序MSDOS.SYS——包括文件管理、磁盘管理、DOS功能调用等。该模块以系统功能调用的方式供用户使用,INT21H3.DOS基本输入输出程序模块IO.SYS——管理输入输出设备:显示器、键盘、打印机、串行通信设备等的驱动,并转换为ROM—BIOS固件的设备控制程序的请求。DOS—ShellDOS—KernelDOS—BIOSDOS命令ROM—BIOS显示器卡盘控制卡串行口卡键盘接口打印机卡应用层DOS服务层ROM—BIOS服务层硬件控制层应用程序INT10HINT13HINT14HINT16HINT17HINT21H高端中断向量表系统数据区IBMBIO.COMIBMDOS.COMCOMMAND.COM低端实地址模式1MB空间键盘缓冲区显示缓冲区等用户程序通过INT21H软中断指令调用DOS系统功能,调用模式如下:MOVAH,功能号设置入口参数INT21H分析出口参数功能号:代表一个不同功能的子程序DOS功能调用调用模式:MOVAH,功能号设置入口参数INT21H分析出口参数DOS功能调用AH=?执行1#子程序执行2#子程序IRET21H型中断服务程序=1=2【功能号01H】等待键入一个字符,有回显,响应Ctrl_C。入口参数:无。出口参数:AL=按键的ASCII码。若AL=0,表明按键是功能键,光标键,需再次调用本功能,才能返回按键的扩展码。调用方式:MOVAH,1INT21HDOS功能调用【功能号02H】显示一个字符,响应Ctrl_C。入口参数:DL=待显字符的ASCII码。出口参数:无。本功能在屏幕的当前位置显示一个字符,光标右移一格,如果是在一行末尾显示字符,则光标返回下一行的开始格。如果是在屏幕的右下角显示字符,光标返回时屏幕要上滚一行。注意:该功能要破坏AL寄存器的内容。DOS功能调用Eg:MOVDL,’A’MOVAH,2INT21H屏幕上显示一个字符A【功能号07H】等待键入一个字符,无回显,不响应Ctrl_C。入口参数:无。出口参数:AL=按键的ASCII码,若AL=0,需再次调用该项功能才能在AL中得到按键的扩展码。【功能号08H】等待键入一个字符,无回显,响应Ctrl_C。入口参数:无。出口参数:AL=按键的ASCII码,若AL=0,需再次调用该项功能才能在AL中得到按键的扩展码。【功能号09H】显示字符串,响应Ctrl_C。入口参数:DS:DX=字符串首地址,字符串必须以‘$'(即ASCII码24H)为结束标志出口参数:无。该项功能从屏幕当前位置开始,显示字符串,遇到结束标志‘$’时停止,‘$’字符并不显示注意:9号功能破坏AL寄存器的内容DOS功能调用Eg:在屏幕上显示‘IAMASTUDENT!’分析:将‘IAMASTUDENT!’定义在数据段,并在‘!’后加一个字符‘$’,利用9号DOS功能调用,即可完成显示IAMASTUDENT!DOS功能调用.486DATASEGMENTUSE16;定义数据段MESGDB‘IAMASTUDENT!’,’$’DATAENDSCODESEGMENTUSE16;定义代码段ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXLAST:MOVAH,9MOVDX,OFFSETMESGINT21HMOVAH,4CHINT21H;返回DOSCODEENDSENDBEG源程序清单:【功能号0AH】等待键入一串字符送用户程序数据缓冲区。入口参数:DS:DX指向放键入字符的缓冲区缓冲区定义形式规定为:缓冲区能容纳的字符个数实际接收的字符个数接收的字符1DOS功能调用程序员预置可容纳的字符个数(包括回车键)0AH功能写入实际接收的字符个数(不包括回车键)数据缓冲区BUF+0+1+2...+n键入字符串的实际存储区域100EG:BUFDB100DB?DB100DUP(?)DOS功能调用出口参数:存放于缓冲区的字符串,以回车键结尾调用方式:MOVAH,0AHINT21H注意:缓冲区定义的第二个字节由系统设置,其余由用户定义;若输入的字节数少于定义的字节数,缓冲区其余字节补零;若输入的字节数大于定义的字节数,后来输入的字符丢弃且响铃警告。DOS功能调用例:人机会话程序Limei?(Y/N)Whatisyourname?1.会话内容及设计思路Linei;前者是程序给出的询问信息,后者是用户键入的回答N;程序复制的姓名和回答提示Limei;再次问答Linei?(Y/N)Whatisyourname?Y问题提出:如何设置程序运行所需的数据?方法如下:数据设置在程序的数据段程序运行时通过人机会话临时键入程序装入时通过命令行参数给出本例学习前两种方法,并以此学习DOS功能调用DOS功能调用2.框图:显示询问信息等待键入姓名串复制姓名串等待用户认可Y/NY返回DOS9#功能0AH#功能9#1#NDOS功能调用DATASEGMENTUSE16MESG1DB0DH,0AHDB‘Whatisyourname?$’MESG2DB‘?(Y/N)$’BUFDB30DB?DB30DUP(?)DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DA:DATABEG:MOVAX,DATAMOVDS,AXAGAIN:MOVAH,9MOVDX,OFFSETMESG1INT21H;询问姓名MOVAH,0AHMOVDX,OFFSETBUFINT21H;接收键入字符串MOVBL,BUF+1MOVBH,0;;实际键入的字符个数BX.486MOVSI,OFFSETBUF+2MOVBYTEPTR[BX+SI],‘$’;用‘$’作为串结束符MOVAH,2MOVDL,0AHINT21H;光标下移一行MOVAH,9MOVDX,OFFSETBUF+2INT21H;复制键入的字符串MOVAH,9MOVDX,OFFSETMESG2INT21H;给出认可信息MOVAH,1INT21H;等待键入CMPAL,‘Y’;比较JNEAGAINMOVAH,4CHINT21H;返回DOSCODEENDSENDBEG源程序清单:主板EPROM中固化有基本I/O系统程序—BIOS,它是最接近硬件的驱动程序,BIOS中的许多子程序可被用户程序调用,调用这些子程序称为BIOS功能调用。键盘接口电路,完成串→并键盘电路键盘中断处理程序内存键盘缓冲区主板机串行扫描码并行扫描码键代码用户程序执行INT16H可访问键盘缓冲区##BIOS功能调用BIOS功能调用模式:MOVAH,功能号设置入口参数INTn分析出口参数其中INTn为软中断指令,n为中断类型码不同n的代表不同的设备驱动程序BIOS功能调用【功能号00H】读取键入的一个字符,无回显,响应Ctrl_C,无键入则等待。入口参数:无。出口参数:AL=键入字符的ASCII码。若AL=0,则AH=输入键的扩展码。【功能号01H】查询键盘缓冲区。入口参数:无。出口参数:①Z标志=0,表示有键入,键代码仍留在键盘缓冲区中,此时AL=键入字符的ASCII码,AH=键入字符的扩展码。②Z标志=1,表示无键入。BIOS键盘输入功能调用•CRT(CathodeRayTube阴极射线管)显示器是微机系统的输出设备。PC系列机可以配置单色显示器,或彩色显示器•显示适配器是显示器和系统总线之间的接口电路。适配器在主机箱的扩展槽中通过9芯插座和CRT显示器相连•显示适配器有CRT控制器、定时器、字符发生器、显示存储器等功能BIOS文本显示功能调用80列×25行40列×25行1.显示器工作方式黑白/彩色文本方式黑白/彩色图形方式文本方式:显示数字,字符图形方式:显示点,由点(像点)组成图形BIOS文本显示功能调用2.显示存储区与显示屏单显80×25文本方式彩显80×25文本方式0页1页2页3页B000B800B900BA00BB00系统RAM(内存)部分空间被指定作为显示存储区:0F9E:0F9FASC码属性…….ASC码属性:0000:0001偶地址单元奇地址单元0~79列0~24行80×25文本方式BIOS文本显示功能调用每一个方格显示一个字符,对应两个存储单元。彩色文本显示存储区32K,分成8页,每页存放一屏字符信息。D7D6D5D4D3D2D1D00:正常显示1:闪烁显示(背景闪烁)背