资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第五节 BIOS和DOS中断功能调用,(教材旧P238、新P239),一、概述,1. BIOS和DOS中断子程层次特点,2. 中断类型分类,3. 调用方法,二、BIOS功能调用,1设置显示方式 ( 10H类型,00H功能 ),2置光标位置 ( 10H类型,02H功能 ),3清屏、清窗口 ( 10H类型,06H或07H功能 ),三、,DOS系统功能调用 ( 21H类型中断调用 ),1,显示单字符 ( 02H功能 ),2,显示字符串 ( 09H功能 ),3,单字符输入 ( 01H、07H、08H功能 ),4,字符串输入 ( 0AH功能 ),5检测键盘状态( 0BH功能 ),6保存中断向量 ( 35H功能 ) (第六章介绍),7设置中断向量 ( 25H功能 ),1,第五节 BIOS和DOS中断功能调用1,复习内容:,P339P247(,新,),P228P246(旧),预内容习:,P 110P140(,新,),P106P134(旧),作业:,1、,预习实验二,其中:任务 1、(2)(4),2必做,,任务 1、(1)(3)选做.,实验四,任务1,作为家庭作业,在计算机上调通后,,经过教师检查,签字,2,复习内容:P339P247(新),P228P246(旧),2编写完整汇编语言程序,要求上机调试出来:,(1)清屏,在10行5列上显示“ Hello China!”,(2)将0AH功能输入的字符串, 用09H功能显示出来。,在DOS下执行,从键盘输入123456789回车,屏幕上能显示Hello World!吗?为什么?,用在DEBUG下查看到的data段的内容来说明。,3问题回答,下面程序,汇编连接后,3,2编写完整汇编语言程序,要求上机调试出来: 在,max DB 11,?,4 DUP(?),data SEGMENT,string DB, Hello World! ,$,data ENDS,code SEGMENT,ASSUME CS:code, DS:data,start: MOV AX, data ; 置缓冲区地址于DS:DX,MOV DS, AX,LEA DX, max,MOV AH, 0AH ; 调用0AH输入功能,INT 21H,LEA DX, string,MOV AH, 09H ; 调用09H显示功能,INT 21H,MOV AH, 4CH,INT 21H ;返回DOS,code ENDS,END start,4,max DB 11,?,4 DUP(?)d,第三节 BIOS和DOS中断功能调用,(教材旧P238、新P239),一、概述,二、BIOS功能调用,三、,DOS系统功能调用,( 21H类型中断调用 ),5,第三节 BIOS和DOS中断功能调用5,一、概述,1,BIOS 和 DOS 中断子程层次特点,2.,中断类型分类,3.,调用方法,6,一、概述6,1BIOS和DOS中断子程层次特点,用户程序,磁盘管理模块(DOS内核),MSDOS.SYS 系统功能,基本输入/输出 BIOS 模 块,IO.SYS 设备驱动,ROM BIOS 基本I/O,系 统 硬 件,装入,命令处理模块,COMMAN D.COM,用户命令,DOS系统层次结构,7,1BIOS和DOS中断子程层次特点用户程序磁盘管理模块(D,层次特点:,ROM BIOS中的中断子程,使,用IN/OUT指令,直接控制外设,,实现与外设之间的输入/输出操作,,以软件形式向其上层提供服务。,IO.SYS中的中断子程,( 称基本输入/输出BIOS模块),调用ROM BIOS的基本I/O功能,,,向 MSDOS.SYS提供设备驱动服务。,用户程序,磁盘管理模块(DOS内核),MSDOS.SYS 系统功能,基本输入/输出 BIOS 模 块,IO.SYS 设备驱动,ROM BIOS 基本I/O,系 统 硬 件,装入,命令处理模块,COMMAN D.COM,用户命令,8,层次特点:用户程序磁盘管理模块(DOS内核)基本输入,MSDOS.SYS中的中断子程,( 称DOS内核模块 ),调用IO.SYS,,实现对外设的控制。,与标准外设有两层隔离 :,IO.SYS和ROM BIOS。,其中21H类型的中断子程,提供了丰富的系统服务,,称21类型的中断调用,为,DOS系统(功能)调用,。,用户程序,磁盘管理模块(DOS内核),MSDOS.SYS 系统功能,基本输入/输出 BIOS 模 块,IO.SYS 设备驱动,ROM BIOS 基本I/O,系 统 硬 件,装入,命令处理模块,COMMAN D.COM,用户命令,9,MSDOS.SYS中的中断子程 用户程序磁盘管理模块(DO,用户编程原则,尽可能使用DOS的系统功能调用,,提高程序可移植性。,在DOS功能不能实现情况下,,考虑用BIOS功能调用。,在DOS和BIOS的中断子程,不能解决问题时,使用IN/OUT指令直接控制硬件。,用户程序,磁盘管理模块(DOS内核),MSDOS.SYS 系统功能,基本输入/输出 BIOS 模 块,IO.SYS 设备驱动,ROM BIOS 基本I/O,系 统 硬 件,装入,命令处理模块,COMMAN D.COM,用户命令,10,用户编程原则用户程序磁盘管理模块(DOS内核)基本输入/输,2. 中断类型分类,向量表中的中断类型分为七类:,处理CPU特殊操作,( 除0、溢出 )的00H、04H类型。,为DEBUG调试程序设置,的单步( 01H )、断点( 03H )类型。,处理CPU的NMI引脚信号,的02H类型。,非屏蔽硬中断子程,处理CPU的INTR引脚信号,的080FH类型。,可屏蔽类型硬中断子程,用INT指令调用的中断子程,BIOS功能调用(如101AH),DOS功能调用 (如 21H),NMI,INTR,8088,11,2. 中断类型分类NMIINTR11,保留类型,为DOS系统保留,1),指现在未用到,以后系统可能会用到。,2),已用到,但不向用户公开。,为用户保留,1),被系统子程嵌套调用了的类型 ( 如1BH、1CH )。,使用户在系统功能基础上扩充功能。,2),系统未占用类型 ( 如 60H67H )。,非中断向量类型,对应向量表中的4个单元存放的不是中断向量。,(如1DH、1EH、1FH、41H、46H、22H),通常是一些参数表的地址信息,.,12, 保留类型12,中断向量分配表,13,中断向量分配表13,14,14,15,15,3. 调用方法,设置入口参数,在,AH,设置功能号,m,执行中断指令,INT N,分析、应用出口参数,16,3. 调用方法设置入口参数在AH设置功能号m执行中断指令IN,例1,单字符显示功能调用,MOV DL, A,;设置入口参数,MOV AH, 02H,;设置功能号,INT 21H,;执行中断调用,例2,单字符输入功能调用,MOV AH, 01H,;设置功能号,INT 21H,;执行中断调用,CMP AL, 0DH,;分析、应用出口参数,JZ exit,、,17,例1 单字符显示功能调用17,二、BIOS功能调用,基本输入/输出模块BIOS:,实现对输入/输出设备的控制,,内含0 1CH 等类型中断子程,,包括显示器、磁盘、键盘、打印机等标准外设的驱动程序。,(参看中断类型分配表),BIOS功能调用指对BIOS模块中的中断子程的调用。,18,二、BIOS功能调用18,有关显示器, 显示器通过显卡(显示适配器)连接到计算机上。, 单色显示器只能显示黑白两色。,彩色显示器能显示多种颜色。,19,有关显示器19,屏幕上各象素的显示信息,存放在显示缓冲区(显存)中。,640KB RAM 基本内存,0000:0000,0040:0000,0050:0000,0070:0000,A000:0000,B000:0000,C800:0000,F600:0000,FE00:0000,FE00:1FFF,显示缓存区( 显存),硬盘驱动器控制ROM,32KB ROM BASIC,8KB ROM BIOS,IO.SYS模块,COMMAND.COM常驻模块,MSDOS.SYS模块,用户程序空间,COMMAND.COM暂驻模块,256KB ROM,DOS工作区,ROM BIOS工作区,128KB RAM 保留区,1KB中断向量表,20, 屏幕上各象素的显示信息,存放在显示缓冲区(显存)中。64, 显示器有两种显示方式:,图形方式:,将屏幕划分为 m,n的点阵,在每个点的位置显示象素,一个点是一个象素,。,文本方式,将屏幕划分为若干行和列,在每个网格位置上显示象素,,一个字符是一个象素,。,21, 显示器有两种显示方式:图形方式:文本方式21,文本方式,将屏幕划分为 m列和n行 (m,n),在每个网格位置上显示象素,,一个字符是一个象素。,80,25,文本方式,A,0,列,0,行,79,列,24,行,B,C,22,文本方式8025 文本方式A,640480 图形方式,640 点,480点,图形方式:,将屏幕划分为 m,n的点阵,在每个点的位置显示象素,一个点是一个象素,。,23,640480 图形方式640 点480点图形方式:,在文本方式下,,对应屏幕上的,每个字符,在显示缓冲区中占用两个单元,:,一个存放ASCII码, 一个存放显示属性。,41H,07H,42H,07H,61H,70H,62H,70H,、,显示缓冲区,(显存),字符,A,黑底白字,字符,B,黑底白字,字符,a, 白底黑字,字符,b,白底黑字,24,在文本方式下,41H07H42H07H61H70H62H70,例,1,000,0111,B 或 87H,表示黑底白字,闪烁,0,111,0000,B 或70H,表示白底黑字,不闪烁,16种,0000 黑 1000,灰,0010,绿,1010,浅绿,0100,红,1100,浅红,0111,灰白,1111 白,BL,R,G,B,I,R,G,B,闪烁,背景,前景,7,6,5,4,3,2,1,0,8种,000 黑,010,绿,100,红,111 白,0 不闪烁,1 闪烁,属性字节的含义:,25,16种BLRGBIRGB闪烁背景前景76543210属性字节,据显存大小,可存储若干页的字符象素。,例,16KB 显存能存储:,8025方式,4页( 0 3 ), 802524 =16000,4025方式,8页( 0 7 ), 402528 =16000,26,据显存大小,可存储若干页的字符象素。26,1设置显示方式,入口参数,AL = 显示方式值,00,4025 黑白文本方式,01,4025 彩色文本方式,02,8025 黑白文本方式,03,8025 彩色文本方式,04,320320 彩色图形方式,功能号,AH = 00H,类型号,10H,出口参数,无,实现功能,将显示方式设置为指定形式,例,将显示方式设置为 8025 彩色文本方式,MOV,AL,03,H,MOV,AH,00,INT,10H,27,1设置显示方式入口参数 AL = 显示方式值例,2.,清屏、清窗口功能,入口参数,AL = 0,CH = 窗口左上角行号,CL =窗口左上角列号,DH = 窗口右下角行号,DL =窗口右下角列号,BH = 窗口属性,功能号,AH = 06H,或,AH = 07H,类型号,10H,出口参数,无,实现功能,按给定属性清除指定的窗口内容,28,2. 清屏、清窗口功能入口参数 AL = 028,例,清除屏幕显示,将其属性置为反白(白底黑字)显示。,MOV AL, 0 ;清屏功能,MOV BH, 70H ;白底黑字,MOV CH, 0 ;左上角 行号,MOV CL, 0 ;左上角 列号,MOV DH, 24 ;右下角 行号,MOV DL, 79 ;右下角 列号,MOV AH, 6,;功能号,INT 10H,;中断调用,29,例 清除屏幕显示,将其属性置为反白(白底黑字)显示。2,3. 置光标位置,光标控制开始显示的位置,,计算机有专门的硬件控制光标的显示大小、位置。,光标只在文本方式中出现,在图形方式下光标消失。,0,列,0,行,79,列,24,行,5,列,1,列,1,行,2,行,30,3. 置光标位置0列0行79,置光标位置,入口参数,DH = 行号,DL = 列号,BH = 页号,功能号,AH= 02H,类型号,10H,出口参数,无,实现功能,将光标设置在指定的位置,31,置光标位置31,例,将光标设置在,2行5列,的位置,MOV DH, 2,MOV DL, 5,MOV BH, 0,MOV AH, 2,INT 10H,0,列,0,行,79,列,24,行,5,列,1,列,1,行,2,行,32,例 将光标设置在2行5列的位置,三、DOS系统功能调用 (21H类型中断调用),1,显示单字符 ( 02H功能 ),2,显示字符串 ( 09H功能 ),3,单字符输入 ( 01H、07H、08H功能 ),4,字符串输入 ( 0AH功能 ),5检测键盘状态 ( 0BH功能 ),6保存中断向量 ( 35H功能 ) (第六章介绍),7设置中断向量 ( 25H功能 ),33,三、DOS系统功能调用 (21H类型中断调用)33,1. 显示单字符 ( 02H功能 ),入口参数,DL = 要显示字符的ASCII 码,功能号,AH=02H,类型号,INT 21H,出口参数,无,实现功能,显示指定字符,,,光标随动。,例,显示字符A,MOV DL, A,MOV AH, 02H,INT 21H,34,1. 显示单字符 ( 02H功能 )例,例,使光标回到下一行的行首。,MOV DL ,0DH,;显示回车符,MOV AH , 02H,INT 21H,MOV DL ,0AH,;显示换行符,MOV AH , 02H,INT 21H,H e l l o,W o r l d,35,例 使光标回到下一行的行首。,2. 显示字符串 ( 09H功能 ),入口参数,定义要显示的字符串,,字符串尾应为$,,作为结束显示的标志。,DS : DX = 字符串的首地址,功能号,AH = 09 H,类型号,21H,出口参数,无,实现功能,显示字符串,遇 $ 停止显示,光标随动,。,36,2. 显示字符串 ( 09H功能 )36,例,编程显示字符串 Tsinghua University,data SEGMENT,;,定义显示的子符串,stri DB Tsinghua University, ,$,data ENDS,code SEGMENT,ASSUME CS:code, DS:data,start: MOV AX,data,;置缓冲区地址于DS:DX,MOV,DS, AX,LEA,DX, stri,MOV AH, 09H,;调显示功能,INT 21H,MOV AH, 4CH,;,返回DOS,INT 21H,code ENDS,END start,37,例 编程显示字符串 Tsinghua Unive,有关键盘,键盘通过键盘接口电路与计算机连接。,键盘上的键有三种类型:,字符键 AZ, 09等,功能键 F1F12, Page Up等,组合控制键 Shift, Ctrl, Alt等,键盘上的每个键都有一个,扫描码,。,据扫描码可确定操作的是哪个键、是按下键还是释放键;,扫描码用一个字节表示。,低7位是扫描码的数字编码, 与键盘上的键一一对应;,最高位D7位表示键的操作状态:,当,按下键时,D7=0,; 当,释放键时,D7=1,38,有关键盘 键盘上的每个键都有一个扫描码。38,键盘中断子程功能(09H类型中断子程),从键盘接口读取操作键的扫描码,;,将扫描码转换成字符码;,大部分键的字符码为ASCII码,,无ASCII码键(如组合键Shift、Ctrl等)的字符码为0,。,将键的扫描码、字符码存放在键盘缓冲区,供其它有关键盘的中断子程应用。,键盘接口对按下键和释放键均向计算机发出中断申请,如果,中断响应条件满足, CPU转去执行键盘中断子程。,键盘中断子程类型号为09H,。,39, 键盘中断子程功能(09H类型中断子程) 键盘接口对按,3. 单字符输入 ( 01H、07H、08H功能),入口参数,无,功能号,AH = 01H,类型号,21H,出口参数,AL = 键入字符的ASCII码,实现功能,等待从键盘输入一个字符,并在屏幕上回显,光标移动,检测,Ctrl-Break,键,40,3. 单字符输入 ( 01H、07H、08H功能)40,例,利用键盘输入的字符产生分支:,MOV AH, 1,;等待从键盘输入,INT 21H,CMP AL, Y,;是Y?,JZ yes,CMP AL, y,;是y?,JZ yes,no: . . .,. . .,JMP exit,yes: . . .,. . .,exit,:,. . .,41,例 利用键盘输入的字符产生分支:41,例,在中断向量表中,查找从键盘输入的字符,,,并将其个数用二进制形式显示出来。( scanskey.asm),code SEGMENT ;代码段开始,ASSUME CS:code,begin: MOV AX, 0000H ;设置查找首地址,MOV DS, AX,MOV SI,0000H,MOV CX,0400H ;设置查找长度,MOV BX,0 ;计算值初值,MOV AH,01H,;从键盘输入,INT 21H,;输入关键字,MOV DL,AL,;保存在DL中,next: LODSB ;从串取,CMP AL, DL ;与关键字比较,JNZ point,INC BX ;计算值加1,point: LOOP next ;查找结束?,CALL display ;调用显示子程,MOV AH,4CH ;调用4CH功能,INT 21H ;返回DOS,;用二进制显示BX内容子程,display PROC,MOV CX, 16 ;显示位数,rotate: ROL BX, 1,MOV DL, BL,AND DL, 01H,ADD DL, 30H,MOV AH, 2H,INT 21H,LOOP rotate,RET ;子程返回,display ENDP,code ENDS ;代码段结束,END begin,42,例 在中断向量表中查找从键盘输入的字符,co,入口参数,无,功能号,AH = 07H,类型号,21H,出口参数,AL = 键入字符的ASCII码,实现功能,等待从键盘输入一个字符,不在屏幕上回显,,不检测,Ctrl-Break,键,43, 入口参数 无 43,例,用不带回显功能输入密码时:,input:,MOV AH, 07H,;等待从键盘输入,INT 21H,MOV DI, AL,;存入缓冲区,CMP AL, 0DH,;是回车符?,JNZ input,;不是,继续输入,check: 、,、,44,例 用不带回显功能输入密码时:44,4. 字符串输入 ( 0AH 功能 ),入口参数,DS : DX = 缓冲区的首地址,( DS :DX ) = 限制最多输入的字符数,功能号,AH = 0AH,类型号,21H,出口参数,( DS : DX+1 ) = 实际键入的字符(不含回车符),从( DS : DX+2 )开始顺序存放键入的字符串,,回车符0DH为串尾最后一字符。,实现功能,等待从键盘输入字符串,并存入设定的缓冲区内,,同时回显字符串,光标随着移动,,回车符使光标回到行首。,注意事项:,应按要求先定义缓冲区,再调用。,45,4. 字符串输入 ( 0AH 功能 )45,例,应用0AH功能输入字符串。,data SEGMENT ;定义缓冲区,max DB 11,;定义限制最多输入个数,lenth DB ?,;用于存放实际输入个数,stri DB 11 DUP(?),;用于存放输入的字符串,data ENDS,code SEGMENT,ASSUME CS:code, DS:data,start: MOV AX , data ;置缓冲区地址于DS:DX,MOV,DS, AX,LEA,DX, max,MOV AH , 0AH,INT 21H,;调0A输入功能,MOX CH , 0,MOV CL , lenth,;取字符串长度放CX中,LEA BX , stri,;取字符串首址于BX中,MOV AL ,BX,;应用输入字符,、,code ENDS,46,例 应用0AH功能输入字符串。 data S,data SEGMENT ;定义缓冲区,max DB 11,;定义限制最多输入个数,lenth DB ?,;用于存放实际输入个数,stri DB 11 DUP(?),;用于存放输入的字符串,data ENDS,从键盘输入ABCD, 回车,内存的存放结果:,0B,04,41,42,43,44,0D,00,max,0,7,00,00,00,00,00,00,00,00,8,0a,0b,0f,1,2,3,4,5,6,9,0c,0d,0e,lenth,stri,地址,内容,DS:DX,47,data SEGMENT ;定义缓冲,如下编程与上例相同:,data SEGMENT,max DB 11,等价于:,DB ?,max DB 11, ?, 11 DUP(?),DB 11 DUP(?),data ENDS,code SEGMENT,ASSUME CS:code, DS:data,start: MOV AX,data,;置缓冲区地址于DS:DX,MOV,DS, AX,LEA,DX,max,MOV AH, 0AH,;调输入功能,INT 21H,MOX CH, 0,MOV CL, max+1,;取字符串长度放CX中,LEA BX, max+2,;取字符串首址于BX中,MOV AL,BX,;应用输入字符,、,code ENDS,48,如下编程与上例相同: data SEGMENT,data SEGMENT,max DB 11,DB ?,DB 11 DUP(?),data ENDS,从键盘输入ABCD, 回车,内存的存放结果:,等价于,max DB 11,?,11 DUP(?),0B,04,41,42,43,44,0D,00,max,0,7,00,00,00,00,00,00,00,00,8,0a,0b,0f,1,2,3,4,5,6,9,0c,0d,0e,地址,内容,DS:DX,49,data SEGMENT等价于0B04414243440,0AH功能执行过程:,若(DS:DX)字节单元的值为0,则不等待从键盘输入,结束调用。,若(DS:DX) 字节单元的内容大于0,则等待从键盘输入,,并把输入键的ASCII码顺序存放在DS : DX+2开始的单元,,按回车键表示结束输入。,当按下键的个数超过( DS : DX )中值,发出警告声 嘟嘟 ,不再接收输入的数据, 直到输入回车键。,将实际输入的字符个数(不包括回车键)填入(DS:DX+1),结束调用。,DS:DX,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,50,0AH功能执行过程:DS:DX000000000000000,0AH功能注意事项,:,输入的字符均带回显,且光标随字符移动。,当输入回车符结束时,也回显回车符。,表现为功能调用结束后,光标回到了行首。,回车符0DH作为一个输入的字符存放在字符串尾,,但计数输入个数时,不包括回车键。,实际最多能输入的字符数 = 限制的最多数,-,1,(回车符占一个),执行完0AH功能后,DS和DX的值不变,,DS:DX仍指向缓冲区的首地址。,整个缓冲区的大小应为:限制的最多数 +2,max DB 11, ? , 11 dup (?),51,0AH功能注意事项:51,例,利用DEBUG查看0A功能输入结果,。,data SEGMENT,max DB 11, ?, 11 DUP(?),data ENDS,code SEGMENT,ASSUME CS:code, DS:data,start: MOV AX,data,;置缓冲区地址于DS:DX,MOV,DS, AX,LEA,DX,max,MOV AH, 0AH,;调输入功能,INT 21H,MOV CH, 0,MOV CL, max+1,;取输入长度到CX中,MOV AH, 4CH ;返回DOS,INT 21H,code ENDS,END start,52,例 利用DEBUG查看0A功能输入结果。data,D:MASM,DEBUG TEST0a.exe,;装入执行文件,-,U,;反汇编程序,129E:0000 B89D12 MOV AX , 129D,129E:0003 8ED8 MOV DS , AX,129E:0005 8D160000 LEA DX , 0000,129E:0009 B40A MOV AH , 0A,129E:000B CD21 INT 21,129E:000D B500 MOV CH , 00,129E:000F 8A0E0100 MOV CL , 0001,129E:0013 B44C MOV AH , 4C,129E:0015 CD21 INT 21,、,-,D 129D:0 L10,;查看程序执行,前,缓冲区内容,129D:0000,0B,00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .,-,G,000D,;执行程序,Hello,;从键盘输入字符串,Program terminated normally,-,D 129D:0 L10,;查看程序执行,后,缓冲区内容,129D:0000,0B,05,48 65 6C 6C 6F,0D,-00 00 00 00 00 00 00 00 .,Hello,.,-,53,D:MASMDEBUG TEST0a.exe,思考:,1. 若将程序改为如下形式, 设想程序执行的结果。,data SEGMENT,max,DB,100H DUP ( ? ),data ENDS,code SEGMENT,ASSUME CS:code, DS:data,start: MOV AX,data,;置缓冲区地址于DS:DX,MOV,DS, AX,LEA,DX,max,MOV,AH, 0AH,;调输入功能,INT 21H,MOV AH, 4CH ;返回DOS,INT 21H,code ENDS,END start,54,思考:data SEGMENT 54,结果是:,不等待输入,结束0AH功能调用。,00,00,00,00,00,00,00,00,max,0,7,00,00,00,00,00,00,00,00,8,0a,0b,0f,1,2,3,4,5,6,9,0c,0d,0e,地址,内容,DS:DX,注意:,由于DS:DX限制输入最大字符数为0,,所以不等待输入, 结束0AH功能调用。,原因是:,55,结果是:不等待输入,结束0AH功能调用。0000000000,2. 若将程序改为如下形式, 设想程序执行的结果。,data SEGMENT,max,DW,100H,? ,100H DUP ( ? ),;定义为字类型,data ENDS,code SEGMENT,ASSUME CS:code, DS:data,start: MOV AX,data,;置缓冲区地址于DS:DX,MOV,DS, AX,LEA,DX,max,MOV,AH, 0AH,;调输入功能,INT 21H,MOV AH, 4CH ;返回DOS,INT 21H,code ENDS,END start,56,2. 若将程序改为如下形式, 设想程序执行的结果。data,结果是:,不等待输入,结束0AH功能调用。,00,01,00,00,00,00,00,00,max,0,7,00,00,00,00,00,00,00,00,8,0a,0b,0f,1,2,3,4,5,6,9,0c,0d,0e,地址,内容,DS:DX,注意:,0AH功能以,字节类型应用DS:DX指向的缓冲区,。,并不随缓冲区类型定义的变化而变化。,原因是:,57,结果是:不等待输入,结束0AH功能调用。0001000000,例,编程从键盘输入字符串,给出显示提示Please input:,data SEGMENT,stri DB Please Input :,$,max DB 11, ?, 11 DUP(?),data ENDS,code SEGMENT,ASSUME CS:code, DS:data,start: MOV AX, data ;置缓冲区地址于DS:DX,MOV,DS, AX,LEA,DX, stri,MOV,AH,09H,;显示提示,INT 21H,LEA,DX,max ;等待从键盘输入,MOV,AH,0AH,INT 21H,MOV AH, 4CH,INT 21H,code ENDS,END start,利用DOS 功能调用,编写小程序,58,例 编程从键盘输入字符串,给出显示提示Please i,D:MASMDEBUG e0a09.exe,-,U,;查看程序,129F:0000 B89D12,MOV AX,129D,129F:0003 8ED8,MOV DS,AX,129F:0005 8D160000 LEA DX ,0000,129F:0009 B409 MOV AH ,09,129F:000B CD21 INT 21,129F:000D 8D160F00 LEA DX ,000F,129F:0011 B40A MOV AH , 0A,129F:0013 CD21 INT 21,129F:0015 B44C MOV AH , 4C,129F:0017 CD21 INT 21,-,D 129D:0 L20,;执行程序前查看 data段内容,129D:0000,50 6C 65 61 73 65 20 49-6E 70 75 74 20 3A 24,0B,Please Input :$.,129D:0010,00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00,.,-,G,;执行程序,Please Input :,Hello!,Program terminated normally,-,D 129 D:0 L20,;,执行程序后查看 data段内容,129D:0000,50 6C 65 61 73 65 20 49-6E 70 75 74 20 3A,24,0B,Please Input :$.,129D:0010,06,48 65 6C 6C 6F 21,0D,-00 00 00 00 00 00 00 00,.Hello!.,-,59,D:MASMDEBUG e0a09.exe59,data段内存情况:,stri,P,l,e,a,s,e,I,n,p,u,t,:,$,0B,06,H,e,l,l,o,!,0D,00,00,00,00,00,00,00,00,max,60,data段内存情况:striPlease Input:$0B,思考:,程序中少了一个 $ 符的后果。,data SEGMENT,stri DB Please Input :,max DB 11, ?, 11 DUP(?),data ENDS,code SEGMENT,ASSUME CS:code, DS:data,start: MOV AX, data ;置缓冲区地址于DS:DX,MOV,DS, AX,LEA,DX, stri,MOV,AH,09H,;显示提示,INT 21H,LEA,DX,max ;等待从键盘输入,MOV,AH,0AH,INT 21H,MOV AH, 4CH,INT 21H,code ENDS,END start,61,思考:程序中少了一个 $ 符的后果。data,data SEGMENT,stri DB Please Input :,max DB 11, ?, 11 DUP(?),data ENDS,stri,P,l,e,a,s,e,I,n,p,u,t,:,0B,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,max,B8,A8,12,8E,D8,8D,16,00,00,B4,09,CD,21,8D,16,0E,start,注意:,09H功能只在遇到$符才结束显示,。,62,data SEGMENT striPleas,5检测键盘状态 ( 0BH功能 ),入口参数,无,功能号,AH= 0BH,类型号,21H,出口参数,AL= FFH , 表示有键按下。,AL= 0 , 表示无键按下。,实现功能,检测键盘状态(通过检测键盘缓冲区实现),63,5检测键盘状态 ( 0BH功能 )63,例,利用0B功能实现按键退出循环。,、,continue:,、,、,、,MOV AH, 0BH,;检测键盘缓冲区是否有键按下,INT 21H,CMP AL, 0FFH,JNZ continue,;无键按下继续循环,、,、,MOV AH, 4CH,INT 21H,64,例 利用0B功能实现按键退出循环。64,6. 保存中断向量 (35H功能),入口参数,AL = 要保存向量的中断类型号N,功能号,AH =,35H,类型号,21H,出口参数,BX = ( 0:N4 ),ES = ( 0:N4 +2 ),实现功能,将类型号N 的中断向量保存在ES、BX中,65,6. 保存中断向量 (35H功能)65,方法一:,用堆栈保存中断向量,MOV AL,09H,;,取中断向量,MOV AH,35H,INT 21H,PUSH ES ;,用堆栈保存,PUSH BX,、 、,例,保存,09H,类型的中断向量,66,方法一: 用堆栈保存中断向量例 保存09H类型的中断向量,方法二:,用变量保存中断向量,save_09cs DW ? ;定义变量,save_09ip DW ?,、,MOV AX, SEG save_09cs,MOV DS, AX,MOV AL,09H,;取中断向量,MOV AH,35H,INT 21H,MOV save_09cs , ES ;用变量保存,MOV save_09ip , BX,67,方法二: 用变量保存中断向量67,7.,设置中断向量 (25H功能),入口参数,AL = 要设置向量的中断类型号N,DS:DX = 中断子程的入口地址,(,中断向量,),功能号,AH =,25H,类型号,21H,出口参数,无,实现功能,将类型N的中断向量设置在向量表中, 即,( 0: N,4) =类型N,中断子程入口地址的偏移值,( 0: N,4+2) =类型N,中断子程入口地址的段值,68,7. 设置中断向量 (25H功能) 入口参数,例1,设置中断子程Sound 的中断向量,类型号为60H,code SEGMENT,ASSUME CS:code,start: 、,MOV AX, SEG sound,MOV DS, AX,MOV DX, Offset sound,MOV AL, 60H,MOV AH, 25H,INT 21H,、,INT 60H,;,调用60H中断子程,、,MOV AH,4CH,INT 21H,; 中断子程,sound PROC,、,、,、,IRET,sound ENDP,code ENDS,END start,69,例1 设置中断子程Sound 的中断向量,类型号为60Hco,汇编语言程序结构作业:,一、编写完整汇编语言程序,要求上机调试出来。:,1清屏,在10行5列上显示“ Hello China!”,2将0AH功能输入的字符串用09H功能显示出来。,二、问题回答,下面程序,汇编连接后,在DOS下执行,,从键盘输入123456789,回车,屏幕上能显示,Hello World!吗?为什么?,用在DEBUG下查看到的data段的内容来说明。,70,汇编语言程序结构作业:70,data SEGMENT,max DB 11,?,4 DUP(?),string DB Hello World! ,$,data ENDS,code SEGMENT,ASSUME CS:code, DS:data,start: MOV AX, data,;置缓冲区地址于DS:DX,MOV DS, AX,LEA DX, max,MOV AH,0AH,;调用0AH输入功能,INT 21H,LEA DX, string,MOV AH,09H,;调用09H显示功能,INT 21H,MOV AH, 4CH,INT 21H,code ENDS,END start,71,data SEGMENT 71,
展开阅读全文