• 1. 第五节 BIOS和DOS中断功能调用 一、概述 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
  • 2. 第三节 BIOS和DOS中断功能调用 一、概述 二、BIOS功能调用 三、DOS系统功能调用 ( 21H类型中断调用 )2
  • 3. 一、概述 1.BIOS 和 DOS 中断子程层次特点 2. 中断类型分类 3. 调用方法3
  • 4. 1.BIOS和DOS中断子程层次特点用户程序磁盘管理模块(DOS内核) MSDOS.SYS 系统功能基本输入/输出 BIOS 模 块 IO.SYS 设备驱动ROM BIOS 基本I/O系 统 硬 件 装入命令处理模块 COMMAN D.COM用户命令DOS系统层次结构4
  • 5. 层次特点: 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用户命令5
  • 6. 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用户命令6
  • 7. 用户编程原则 ①尽可能使用DOS的系统功能调用, 提高程序可移植性。 ②在DOS功能不能实现情况下, 考虑用BIOS功能调用。 ③在DOS和BIOS的中断子程 不能解决问题时, 使用IN/OUT指令直接控制硬件。用户程序磁盘管理模块(DOS内核) MSDOS.SYS 系统功能 基本输入/输出 BIOS 模 块 IO.SYS 设备驱动ROM BIOS 基本I/O系 统 硬 件 装入命令处理模块 COMMAN D.COM用户命令7
  • 8. 2. 中断类型分类 向量表中的中断类型分为七类: ① 处理CPU特殊操作( 除0、溢出 )的00H、04H类型。 ② 为DEBUG调试程序设置的单步( 01H )、断点( 03H )类型。 ③ 处理CPU的NMI引脚信号的02H类型。 非屏蔽硬中断子程 ④ 处理CPU的INTR引脚信号的08~0FH类型。 可屏蔽类型硬中断子程 ⑤ 用INT指令调用的中断子程 BIOS功能调用(如10~1AH) DOS功能调用 (如 21H)NMIINTR 80888
  • 9. ⑥ 保留类型 为DOS系统保留 1) 指现在未用到,以后系统可能会用到。 2) 已用到,但不向用户公开。 为用户保留 1) 被系统子程嵌套调用了的类型 ( 如1BH、1CH )。 使用户在系统功能基础上扩充功能。 2) 系统未占用类型 ( 如 60H~67H )。 ⑦ 非中断向量类型 对应向量表中的4个单元存放的不是中断向量。 (如1DH、1EH、1FH、41H、46H、22H) 通常是一些参数表的地址信息.9
  • 10. 中断向量分配表10
  • 11. 11
  • 12. 12
  • 13. 3. 调用方法设置入口参数在AH设置功能号m执行中断指令INT N分析、应用出口参数13
  • 14. 例1 单字符显示功能调用 MOV DL, ‘A’ ;设置入口参数 MOV AH, 02H ;设置功能号 INT 21H ;执行中断调用 例2 单字符输入功能调用 MOV AH, 01H ;设置功能号 INT 21H ;执行中断调用 CMP AL, 0DH ;分析、应用出口参数 JZ exit 、、、14
  • 15. 二、BIOS功能调用 基本输入/ 输出模块BIOS: 实现对输入/输出设备的控制, 内含0 – 1CH 等类型中断子程, 包括显示器、磁盘、键盘、打印机等标准外设的驱动 程序。(参看中断类型分配表) BIOS功能调用指对BIOS模块中的中断子程的调用。15
  • 16. 有关显示器 ① 显示器通过显卡(显示适配器)连接到计算机上。 ② 单色显示器只能显示黑白两色。 彩色显示器能显示多种颜色。16
  • 17. ③ 屏幕上各象素的显示信息,存放在显示缓冲区(显存)中。640KB RAM 基本内存0000:0000 0040:0000 0050:0000 0070:0000 A000:0000 B000:0000 C800:0000 F600:0000 FE00:0000 FE00:1FFF 显示缓存区( 显存)硬盘驱动器控制ROM32KB ROM BASIC8KB ROM BIOSIO.SYS模块 COMMAND.COM常驻模块 MSDOS.SYS模块 用户程序空间 COMMAND.COM暂驻模块 256KB ROM DOS工作区 ROM BIOS工作区128KB RAM 保留区1KB中断向量表17
  • 18. ④ 显示器有两种显示方式: 图形方式: 将屏幕划分为 m×n的点阵,在每个点的位置显示象素, 一个点是一个象素。文本方式 将屏幕划分为若干行和列,在每个网格位置上显示象素, 一个字符是一个象素。18
  • 19. 文本方式 将屏幕划分为 m列和n行 (m × n),在每个网格位置上显示象素, 一个字符是一个象素。80×25 文本方式A~~~~~~~~~~~~~~~~0 列 0行79 列 24行BC19
  • 20. ~~~~640×480 图形方式 640 点 480点 图形方式: 将屏幕划分为 m×n的点阵,在每个点的位置显示象素, 一个点是一个象素。20
  • 21. 在文本方式下, 对应屏幕上的每个字符, 在显示缓冲区中占用两个单元: 一个存放ASCII码, 一个存放显示属性。41H07H42H07H61H70H62H70H、、、显示缓冲区 (显存)字符A, 黑底白字字符B, 黑底白字字符a, 白底黑字字符b, 白底黑字21
  • 22. 例 10000111B 或 87H 表示黑底白字,闪烁 01110000B 或70H 表示白底黑字,不闪烁16种 0000 黑 1000 灰 0010 绿 1010 浅绿 0100 红 1100 浅红 0111 灰白 1111 白BLRGBIRGB闪烁背景前景76543210 8种 000 黑 010 绿 100 红 111 白 0 不闪烁 1 闪烁属性字节的含义:22
  • 23. 据显存大小,可存储若干页的字符象素。 例 16KB 显存能存储: 80×25方式,4页( 0 ~ 3 ), 80×25×2×4 =16000 40×25方式,8页( 0 ~ 7 ), 40×25×2×8 =1600023
  • 24. 1.设置显示方式入口参数 AL = 显示方式值 00 40×25 黑白文本方式 01 40×25 彩色文本方式 02 80×25 黑白文本方式 03 80×25 彩色文本方式 04 320×320 彩色图形方式 功能号 AH = 00H 类型号 10H 出口参数 无 实现功能 将显示方式设置为指定形式例 将显示方式设置为 80×25 彩色文本方式 MOV AL, 03H MOV AH, 00 INT 10H24
  • 25. 2. 清屏、清窗口功能入口参数 AL = 0 CH = 窗口左上角行号 CL =窗口左上角列号 DH = 窗口右下角行号 DL =窗口右下角列号 BH = 窗口属性 功能号 AH = 06H 或 AH = 07H 类型号 10H 出口参数 无 实现功能 按给定属性清除指定的窗口内容25
  • 26. 例 清除屏幕显示,将其属性置为反白(白底黑字)显示。 MOV AL, 0 ;清屏功能 MOV BH, 70H ;白底黑字 MOV CH, 0 ;左上角 行号 MOV CL, 0 ;左上角 列号 MOV DH, 24 ;右下角 行号 MOV DL, 79 ;右下角 列号 MOV AH, 6 ;功能号 INT 10H ;中断调用26
  • 27. 3. 置光标位置 光标控制开始显示的位置, 计算机有专门的硬件控制光标的显示大小、位置。 光标只在文本方式中出现,在图形方式下光标消失。~~~~~~~~~~~~~~~~0 列 0行79 列 24行5 列 1 列 1行2行27
  • 28. 置光标位置 入口参数 DH = 行号 DL = 列号 BH = 页号 功能号 AH= 02H 类型号 10H 出口参数 无 实现功能 将光标设置在指定的位置28
  • 29. 例 将光标设置在2行5列的位置 MOV DH, 2 MOV DL, 5 MOV BH, 0 MOV AH, 2 INT 10H~~~~~~~~~~~~~~~~0 列 0行79 列 24行5 列 1 列 1行2行29
  • 30. 三、DOS系统功能调用 (21H类型中断调用) 1.显示单字符 ( 02H功能 ) 2.显示字符串 ( 09H功能 ) 3.单字符输入 ( 01H、07H、08H功能 ) 4.字符串输入 ( 0AH功能 ) 5.检测键盘状态 ( 0BH功能 ) 6.保存中断向量 ( 35H功能 ) (第六章介绍) 7.设置中断向量 ( 25H功能 )30
  • 31. 1. 显示单字符 ( 02H功能 ) 入口参数 DL = 要显示字符的ASCII 码 功能号 AH=02H 类型号 INT 21H 出口参数 无 实现功能 显示指定字符,光标随动。例 显示字符A MOV DL, ‘A’ MOV AH, 02H INT 21H31
  • 32. 例 使光标回到下一行的行首。 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 32
  • 33. 2. 显示字符串 ( 09H功能 ) 入口参数 ①定义要显示的字符串, 字符串尾应为’$’,作为结束显示的标志。 ②DS : DX = 字符串的首地址 功能号 AH = 09 H 类型号 21H 出口参数 无 实现功能 显示字符串,遇 ’$’ 停止显示,光标随动。33
  • 34. 例 编程显示字符串’ 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 start34
  • 35. 有关键盘 ① 键盘通过键盘接口电路与计算机连接。 ② 键盘上的键有三种类型: 字符键 A~Z, 0~9等 功能键 F1~F12, Page Up等 组合控制键 Shift, Ctrl, Alt等 ③ 键盘上的每个键都有一个扫描码。 ◢ ◢ 据扫描码可确定操作的是哪个键、是按下键还是释放键; ◢ ◢ 扫描码用一个字节表示。 低7位是扫描码的数字编码, 与键盘上的键一一对应; 最高位D7位表示键的操作状态: 当按下键时, D7=0 ; 当释放键时, D7=135
  • 36. ⑤ 键盘中断子程功能(09H类型中断子程) ◢ 从键盘接口读取操作键的扫描码; ◢ 将扫描码转换成字符码; 大部分键的字符码为ASCII码, 无ASCII码键(如组合键Shift、Ctrl等)的字符码为0。 ◢ 将键的扫描码、字符码存放在键盘缓冲区, 供其它有关键盘的中断子程应用。④ 键盘接口对按下键和释放键均向计算机发出中断申请, 如果中断响应条件满足, CPU转去执行键盘中断子程。 键盘中断子程类型号为09H。36
  • 37. 3. 单字符输入 ( 01H、07H、08H功能) ① 入口参数 无 功能号 AH = 01H 类型号 21H 出口参数 AL = 键入字符的ASCII码 实现功能 等待从键盘输入一个字符, 并在屏幕上回显,光标移动, 检测Ctrl-Break键37
  • 38. 例 利用键盘输入的字符产生分支: MOV AH, 1 ;等待从键盘输入 INT 21H CMP AL, ‘Y’ ;是’Y’? JZ yes CMP AL, ‘y’ ;是’y’? JZ yes no: . . . . . . JMP exit yes: . . . . . . exit: . . . 38
  • 39. 例 在中断向量表中查找从键盘输入的字符, 并将其个数用二进制形式显示出来。( 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 begin39
  • 40. ② 入口参数 无 功能号 AH = 07H 类型号 21H 出口参数 AL = 键入字符的ASCII码 实现功能 等待从键盘输入一个字符, 不在屏幕上回显, 不检测Ctrl-Break键40
  • 41. 例 用不带回显功能输入密码时: input: MOV AH, 07H ;等待从键盘输入 INT 21H MOV [DI], AL ;存入缓冲区 CMP AL, 0DH ;是回车符? JNZ input ;不是,继续输入 check: 、、、 、、、 41
  • 42. 4. 字符串输入 ( 0AH 功能 ) 入口参数 DS : DX = 缓冲区的首地址 ( DS :DX ) = 限制最多输入的字符数 功能号 AH = 0AH 类型号 21H 出口参数 ( DS : DX+1 ) = 实际键入的字符(不含回车符) 从( DS : DX+2 )开始顺序存放键入的字符串, 回车符0DH为串尾最后一字符。 实现功能 等待从键盘输入字符串,并存入设定的缓冲区内, 同时回显字符串,光标随着移动, 回车符使光标回到行首。 注意事项:应按要求先定义缓冲区,再调用。42
  • 43. 例 应用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 43
  • 44. data SEGMENT ;定义缓冲区 max DB 11 ;定义限制最多输入个数 lenth DB ? ;用于存放实际输入个数 stri DB 11 DUP(?) ;用于存放输入的字符串 data ENDS 从键盘输入‘ABCD’, 回车,内存的存放结果:0B04414243440D00max07000000000000000080a0b0f12345690c0d0elenthstri地址内容DS:DX44
  • 45. 如下编程与上例相同: 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 ENDS45
  • 46. data SEGMENT max DB 11 DB ? DB 11 DUP(?) data ENDS 从键盘输入‘ABCD’, 回车,内存的存放结果:等价于 max DB 11,?,11 DUP(?)0B04414243440D00max07000000000000000080a0b0f12345690c0d0e地址内容DS:DX46
  • 47. 0AH功能执行过程: ① 若(DS:DX)字节单元的值为0,则不等待从键盘输入,结束 调用。 ② 若(DS:DX) 字节单元的内容大于0,则等待从键盘输入, 并把输入键的ASCII码顺序存放在DS : DX+2开始的单 元, 按回车键表示结束输入。 当按下键的个数超过( DS : DX )中值,发出警告声’ 嘟嘟 ’, 不再接收输入的数据, 直到输入回车键。 ③ 将实际输入的字符个数(不包括回车键)填入(DS:DX+1), 结束调用。DS:DX0000000000000000000000000000000047
  • 48. 0AH功能注意事项: ◢ 输入的字符均带回显,且光标随字符移动。 当输入回车符结束时,也回显回车符。 表现为功能调用结束后,光标回到了行首。 ◢ 回车符0DH作为一个输入的字符存放在字符串尾, 但计数输入个数时,不包括回车键。 实际最多能输入的字符数 = 限制的最多数-1 (回车符占一个) ◢ 执行完0AH功能后,DS和DX的值不变, DS:DX仍指向缓冲区的首地址。 ◢ 整个缓冲区的大小应为:限制的最多数 +2 max DB 11, ? , 11 dup (?) 48
  • 49. 例 利用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 start49
  • 50. 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......... -50
  • 51. 思考: 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 start51
  • 52. 结果是:不等待输入,结束0AH功能调用。000000 0000000000max07000000000000000080a0b0f12345690c0d0e地址内容DS:DX注意:由于DS:DX限制输入最大字符数为0, 所以不等待输入, 结束0AH功能调用。原因是:52
  • 53. 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 start53
  • 54. 结果是:不等待输入,结束0AH功能调用。000100 0000000000max07000000000000000080a0b0f12345690c0d0e地址内容DS:DX注意:0AH功能以字节类型应用DS:DX指向的缓冲区。 并不随缓冲区类型定义的变化而变化。原因是:54
  • 55. 例 编程从键盘输入字符串,给出显示提示’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 功能调用,编写小程序55
  • 56. D:\MASM>DEBUG 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!......... - 56
  • 57. data段内存情况:striPleaseInput:$0B06Hello!0D0000000000000000max57
  • 58. 思考:程序中少了一个 ’$’ 符的后果。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 start58
  • 59. data SEGMENT stri DB ‘Please Input :’ max DB 11, ?, 11 DUP(?) data ENDSstriPleaseInput:0B0000000000000000000000000000000000maxB8A8128ED88D160000B409CD218D160Estart 注意:09H功能只在遇到’$’符才结束显示。59
  • 60. 5.检测键盘状态 ( 0BH功能 ) 入口参数 无 功能号 AH= 0BH 类型号 21H 出口参数 AL= FFH , 表示有键按下。 AL= 0 , 表示无键按下。 实现功能 检测键盘状态(通过检测键盘缓冲区实现) 60
  • 61. 例 利用0B功能实现按键退出循环。 、、 continue: 、、 、、 、、 MOV AH, 0BH ;检测键盘缓冲区是否有键按下 INT 21H CMP AL, 0FFH JNZ continue ;无键按下继续循环 、、 、、 MOV AH, 4CH INT 21H61
  • 62. 6. 保存中断向量 (35H功能) 入口参数 AL = 要保存向量的中断类型号N 功能号 AH = 35H 类型号 21H 出口参数 BX = ( 0:N×4 ) ES = ( 0:N×4 +2 ) 实现功能 将类型号N 的中断向量保存在ES、BX中62
  • 63. 方法一: 用堆栈保存中断向量 MOV AL, 09H ;取中断向量 MOV AH, 35H INT 21H PUSH ES ;用堆栈保存 PUSH BX 、 、、例 保存09H类型的中断向量63
  • 64. 方法二: 用变量保存中断向量 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 , BX64
  • 65. 7. 设置中断向量 (25H功能) 入口参数 AL = 要设置向量的中断类型号N DS:DX = 中断子程的入口地址(中断向量) 功能号 AH = 25H 类型号 21H 出口参数 无 实现功能 将类型N的中断向量设置在向量表中, 即 ( 0: N ×4) =类型N中断子程入口地址的偏移值 ( 0: N ×4+2) =类型N中断子程入口地址的段值65
  • 66. 例1 设置中断子程Sound 的中断向量,类型号为60Hcode 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 start66
  • 67. 汇编语言程序结构作业: 一、编写完整汇编语言程序,要求上机调试出来。: 1.清屏,在10行5列上显示“ Hello China!” 2.将0AH功能输入的字符串用09H功能显示出来。 二、问题回答   下面程序,汇编连接后,在DOS下执行,   从键盘输入‘123456789’, 回车,屏幕上能显示 ‘Hello World!’吗?为什么? 用在DEBUG下查看到的data段的内容来说明。67
  • 68. 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 start68