




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4-4 DOS系统功能调用和BIOS中断调用 和所有的计算机一样,微型计算机的硬 件环境必须在操作系统的管理下,才能进行 工作。缺少操作系统的计算机,即所谓裸机 ,是一个无生命的壳体。微机上所配的磁盘 操作系统(Disk Operating System)简称DOS 或MS-DOS。 DOS向用户提供了许多命令及系统功能 ,其中命令有内部命令,如DIR,TYPE,CD 等,用户可以在DOS提示符下键入这些命令 来使用。另外有外部命令,如PRINT、 XCOPY、FORMAT等,用户也可以键入它 们的名称由磁盘调入内存执行。 此外,DOS还具有对I/O设备管理及磁盘 与文件管理的功能,它们一部分被固化在系 统的ROM中,可作为ROM BIOS模块。另一 部分存放在系统磁盘上,在系统启动时被装 入内存,用户的应用程序及MS-DOS的大部分 命令都将通过软件中断来调用它们。 表4-6 列出了DOS常用的软中断指令,主 要有INT 20HINT 2FH。调用这些软件中断 时,只要给定入口参数,接着写一条中断指 令INT n 就可以了。 表4-6 DOS常用的软中断命令 第四章 宏汇编语言程序设计 一、DOS系统功能调用 DOS系统功能调用分别实现设备管理、 文件读/写、文件管理和目录管理等功能。每 个子程序对应一个功能号,所有的系统功能 调用的格式是一致的,按下面4步进行: (1)系统功能号送到AH寄存器; (2)入口参数送到指定寄存器中; (3)用INT 21H指令执行功能调用; (4)根据出口参数分析功能调用执行情况。 有些系统功能调用比较简单,不需要设 置入口参数或没有出口参数。DOS系统功能 调用的功能及入口/出口参数表,详细见附录 。 例4-50 2号功能调用,结果在屏幕上显示A。 MOV DL, A MOVAH,2 INT21H 1. DOS键盘功能调用 键盘提供了字符键、功能键和控制键。 每个键都有对应的键值,即标准ASCII码值 ,通过DOS功能调用可读入键值到AL寄存器 或存储器中,表4-7列出DOS键盘功能调用的 有关命令。 AH功能入口参数出口参数 1从键盘输键盘输 入一个字符,并在 屏幕上显显示,检查检查 Ctrl- Break键键 AL=字符 8键盘输键盘输 入一个字符,无回显显AL=字符 6直接键盘输键盘输 入/输输出字符, 不检查检查 Ctrl-Break键键 DL=0FFHAL=字符 7直接键盘输键盘输 入/输输出字符, 无回显显,不检查检查 Ctrl-Break 键键 AL=字符 0AH输输入字符串到内存缓缓冲区DS:DX=缓缓冲首 址 0BH检查键盘输检查键盘输 入状态态AL=0FFH有键键入 , AL=0,无键键入 0CH清键盘缓键盘缓 冲区,调调用键盘键盘 输输入功能 AL=键盘键盘 功能号 (1,6,7,8, A) 表4-7 DOS键盘功能调用 (1)键入单字符 DOS功能调用中1,6,7,8号功能调用 都能完从键盘输入一个字符到AL寄存器,差 别在1号和6号功能调用键入同时在屏幕上显 示字符,8号和7号功能调用不回显。 1号功能调用:从键盘输入字符并显示, 调用命令为: MOVAH,1 INT21H 执行上述命令后,系统扫描键盘等待有 键按下,若有键按下,就将键值(ASCII码) 读入到AL寄存器,先检查是否为Ctrl-Break 键,若是就自动调用中断INT23H,执行退出 命令,否则就将键值送AL寄存器并在屏幕上 显示该字符。 例4-51 交互式程序中用户按下数字键1,2,3,程序 转入相应的服务子程序,若按下其它键就继续等待。 KEY:MOVAH,1 ;读入键值AL INT21H CMPAL,1 ;键值为1 吗? JEONE CMPAL, 2 ;键值为2 吗? JETWO CMPAL,3 ;键值为3 吗? JETHREE JMPKEY ;其它键则继续等待按键 ONE: TWO: THREE: 8号功能调用:从键盘输入字符但不回显, 命令为: MOVAH,8 INT21H 它与1号功能类同,检查输入是否为Ctrl- Break键,但屏幕无显示。 6号功能调用:直接控制台输入/输出,命 令为: MOVDL,0FFH MOVAH,6 INT21H 它可以从键盘输入字符,也可以向屏幕 输出字符,并且不检查是否为Ctrl-Break键。 当DL=0FFH时,表示从键盘输入,若标志位 ZF=0,AL中为键值,若ZF=1,表示无键按 下,AL中不是键值。DL0FFH时,表示屏 幕输出。 7号功能调用:直接控制台输入/输出但无 回显,命令格式为: MOVAH,7 INT21H 7号功能与6号功能调用相同,但屏幕不 显示,并且不检查是否为Ctrl-Break键。 (2)输入字符串 0AH功能调用:能从键盘接收字符串到 内存的输入缓冲区。 要求预先定义一个内存缓冲区: 缓冲区的第一个字节指出能容纳的最大字 符个数,由用户给出; 第二个字节存放实际输入的字符个数,由 系统最后填入; 从第三个字节开始存放从键盘接收的字符 ,直到回车键结束。 若实际输入的字符数大于给定的最大字符 数,就会发出“嘟嘟”声,并且光标不再向右 移动,后面输入的字符将丢失。若输入的字 符数小于给定的最大字符数,缓冲区其余部 分都填0。0AH功能调用时,要求将DS:DX 指向缓冲区第一个字节。 定义接收缓冲区 BUFF DB 100;用户定义最大字符数100 DB ;系统存放实际字符个数单元 DB100 DUP(?);定义100 ;个字节单元存放输入的字符串 例4-52 开辟一个缓冲区,从键盘输入一个字 符串,将输入的字符数CL寄存器,并将指 针指向字符串的第一个字符。 MOVAX,DATA MOVDS,AX MOVDX,OFFSET BUFF MOVAH,0AH INT21H MOVBX,DX MOVCL,BX+1 ;去取实际输入字 符数到CL ADDDX,2 ;使指针指向第一个字符 (3)检验键盘状态 0BH功能调用:检验是否有键按下,若 有键按下AL=0FFH,若没有键按下,AL=0 ,无论检测到是否有键按下,程序将继续执 行下一条指令。 例4-53 检测键盘工作,若用户未按键,程序 循环执行,若用户按下任何键,程序转去调 用发声子程序。 LOOP:MOV AH,0BH INT 21H CMP AL,0FFH JNZ LOOP CALL SOUND (4)清除键盘缓冲区 0CH功能调用:先清除键盘缓冲区,然 后执行AL中指定的功能,AL中可以指定1, 6,7,8或0AH功能号,使程序在输入字符前 将以前键入的字符清掉。 例4-54 MOVAH,0CH MOV AL,7 INT21H 2. DOS显示功能调用 DOS显示功能调用能够显示字符或字符 串,这些功能都自动向前移动光标,表4-8给 出了DOS显示功能调用的有关命令。 AH 功能入口参数说说明 2显显示一个字符,检检 验验Ctrl-Break键键 DL=字符光标标随字符移动动 6显显示一个字符,不 检验检验 Ctrl-Break键键 DL=字符光标标随字符移动动 9显显示字符串DS:DX=串 地址 串以$结结束,光 标标随串移动动 (1)单字符显示 2号功能调用:2号功能调用实现将字符送 到屏幕显示出来。它要求将要显示字符的 ASCII码值送到DL寄存器中。 MOVDL,% MOVAH,2 INT21H 6号功能调用:是直接控制台输入/输出调 用,除前面谈到的键盘输入功能外,在DL不 等于0FFH时,表示向屏幕输出。它要求将要 显示字符的ASCII码值送到DL寄存器中。 MOVDL,9 MOVAH,6 INT21H (2)字符串显示 9号功能调用:显示字符串,要求DS: DX指向串地址首址,并且字符串必须以$ 字符为结束符。若要求显示字符串后光标自 动回车换行,则在$字符前再加上0DH(回 车),0AH(换行)字符。 例4-55 在屏幕上显示HOW DO YOU DO?字符串 ,且光标换行。 MES DB HOW DO YOU DO?,0DH,0AH, $ MOVAX,DATA MOVDS,AX MOVDX,OFFSET MES MOVAH,9 INT21H 4-5 程序设计方法 前面几章已讨论了指令系统和汇编语言 设计基础,而设计出一个好的程序不仅要能 正常运行,完成要求的功能,还应该具有下 列特点: (1)程序结构模块化,程序易读,易调试及 维护。 (2)执行速度快。 (3)占用内存空间小。 尤其是结构化设计,在程序复杂的情况 下尤为重要。一般来说设计汇编语言源程序 的基本步骤如下: (1)分析问题,抽象出描述问题的数学模 型,并确定实现数学模型的算法。 (2)绘制程序流程图,通常先画粗框图, 在结构模块中再细画框图。框图一般有起始 框,执行框,判断框和终止框。 起始框终止框执行框判断框 Y N (3)分配存储空间及工作单元。分配数据 段,堆栈段,代码段各在内存什么位置,各 个寄存器主要起什么作用。 (4)按流程图设计编写程序。 (5)静态检查,上机调试。 (6)程序运行,结果分析。 在进行汇编语言源程序设计时,通常用 到四种程序结构:顺序结构;分支结构 循环结构;子程序结构。下面分别加以 说明。 一、顺序结构 顺序结构的程序一般是简单程序,程序 顺序执行,无分支,无循环,也无转移,图 中没有判断框。 例4-55 内存中TABLE开始存放09的 平方值,通过人机对话,当任给定一个数X (09),查表得X的平方值,放在AL中。 (见程序流程图) .MODEL SMALL .386 .STACK 100H .DATA TABLE DB 0,1,4,9,16,25,36 DB 49,64,81 BUF DB Please input one number(0 9): DB 0DH,0AH,$ .CODE .STARTUP 定义一个09的平方表格 定义一个提示文本 代码段开始,同时设置DS,SS MOVDX,OFFSET BUF;显示字符串 MOV AH,9 INT 21H MOVAH,1 ;1号功能调用,键入数送 AL中 INT 21H MOVAH,0 ;查表得键入数的平方值 AND AL,0FH MOV BX, OFFSET TABLE ADD BX,AX MOV AL,BX .EXIT 0 END 显示提示文本 读入按键值AL 查表得键入数的平方值 二、分支结构 1.分支结构 一般情况下,程序顺序执行,但经常要 求程序根据不同条件选择不同的处理方法, 这就需要用到分支结构。 执行框 判断条件 YN 执行框 单分支结构框图多分支结构框图 执行框执行框执行框 判断框 例4-56 编程实现以下函数: Y= X+3 (X0 ) X-5 (X0) 核心代码如下: MOVAL,X CMP AL,0 JG ZHSHU SUBAL,5 JMPOUT ZHSHU:ADDAL,3 OUT:MOVY,AL 2. 多分支 有的分支结构为多分支,可以利用多个 条件转移指令来实现,依次测试条件是否满 足,若满足转入相应分支入口,若不满足继 续向下测试,直到全部测试完。这种方法编 程简单、直观,但运行速度慢,要依次检查 才能进入要求的入口。 例4-57 有8个加工子程序,入口地址分别为 P1,P2,P8编程实现检测键盘输入命令, 使系统分别转向8个加工子程序。(键值为1 转向P1,键值为2转向P2,等等。) MOV AH,1 INT 21H CMP AL,1 JE P1 CMP AL,2 JE P2 1号功能调用,从键盘输 入一个字符到AL中 输入的字符与1作比较 ;为1则转向P1,否则 继续判断。输入的字符与2作比较 ;为2则转向P2,否则 继续判断。 CMP AL,8 JE P8 JMP ST P1: P2: P3: P8: ST: HLT 3. 跳转表实现多分支 利用跳转表实现多分支,就克服了上面 的缺点,可以直接找到相应入口。利用这种 方法要在存储器中先建立一个跳转表,表中 包括每个分支的入口地址,跳转指令或关键 字,利用此表就可以实现分支结构。 (1)根据表中入口地址实现分支 跳转表中存放了每个分支程序的入口地 址,只要找到表地址,在将其内容取出,即 可得到每个分支的入口地址。 表地址=跳转表的首地址+偏移量 P1低位 P1高位 P2低位 P2高位 P1 P2 代码段 数据段 BASE BASE+2 开始 取编号 求表地址 求偏移量 分支转到相应的加工子程序 图4-13 跳转表在内存中的存放方法 图4-14 跳转表分支流程图 例4-58 将例4-57中程序改成用跳转表来实现: BASE DW P1,P2,P3,P4 DW P5,P6,P7,P8 定义跳转表 MOV AH,1 INT 21H AND AL,0FH ;屏蔽高四位(为什么? ) MOV BX,OFFSET BASE MOV AH,0 ADD AL,AL ADD BX,AX JMP WORD PTR BX 1号功能调用,从键盘输 入一个字符到AL中 取表的首地址 求偏移量 查表转相应子程序 (2)根据表中指令机器码实现分支 跳转表中存放的是转移指令机器码,查 表后程序转到相应的子程序。图4-15给出了 转移指令跳转表存放形式。 E9 P1低位 P1高位 P2低位 P2高位 E9 JMP P1 JMP P2 BASE BASE+3 数据段 图4-15 转移指令跳转表 例4-59 将例4-57 程序用跳转表存放转移指令 机器码实现分支。 BASE DB E9,LOW P1,HIGH P1,E9 DB E9E9,LOW P8,HIGH P8 定义跳转表 MOV AH,1 INT 21H AND AL,0FH MOV AH,0 MOV BL,AL ;将键值保存到BL中 ADD AL,AL ADD AL,BL ;偏移量=键值3 MOV BX,OFFSET BASE ADD BX,AX JMP BX 1号功能调用,从键盘输 入一个字符到AL中 求偏移量 取表的首地址 查表转相应子程序 跳转表中存放关键字,及相应分支地址 ,图4-16给出了关键字跳转表的格式,图4- 17给出了关键字分支流程图。 (3)根据表中关键字实现分支 31 P1程序入口地址 32 BASE BASE+3 图4-16 关键字跳转表 P2程序入口地址 38 开始 读入关键字 关键字=0? 指针表首地址 与表内关键字比较 相等吗? 加3 调整指针 实现分支 NY N Y 图4-17 关键字分支流程图 例4-60 将例4-57用关键字跳转表方式实现分支 BDATASEGMENT BASEDB 31H ;关键字 DW P1 ;P1入口地址 DB 32H DW P2 DB38H DW P8 BDATAENDS 定义跳转表 LOP:MOV AH,1 INT 21H CMP AL,0 JE LOP MOV BX,OFFSET BASE NEXT: CMP AL,BX JE DO ADD BX,3 ;加3调整指针 JMP NEXT DO:JMP WORD PTR BX+1 1号功能调用, 从键盘输入一 个字符到AL中 是“0”吗?是, 循环等待按键 ;否则进行分 支 取表的首地址 ,指向第一个 关键字 按键值与表中的 关键字比较,相 同则进行跳转。 不同则将表地址加3 ,准备与下一个关 键字进行比较。 三、循环程序结构 1. 循环程序结构形式 循环程序有两种结构形式:一种是“先 执行,后判断”结构,另一种是“先判断, 后执行”结构。图4-18给出了两种循环程序 结构框图。 入口 初始化部分 出口 循环控制 修改参数 循环体 入口 初始化部分 出口 循环控制 修改参数 循环体 图4-18(a)先执行,后判断结构(b)先判断,后执行结构 无论哪种循环结构都包括以下四个部分: (1)初始化:为循环作准备,设置循环计 数值,设置变量 初值。 (2)循环体:循环部分的核心,包括循环 的全部执行指令。 (3)修改参数:修改操作数地址,为下次 循环作准备。 (4)循环控制:修改计数器值,判断循环 控制条件,决定是否跳出循环。 程序流程图如下所示: (先执行,后判断结构) 例4-70 将BX中的16进制数转换为ASCII码 ,存放到BUF开始的内存单元中去,并在屏 幕显示出数值。 开始 初始化循环计数值 结束 把最右面的数位 转换成ASCII码 BX循环左移一个数位 是AF吗? 加上7 显示一个字符 循环计数值=0吗? N Y Y N MOV SI,OFFSET BUF MOV CH,4 NEXT:MOV CL,4 ROLBX,CL MOV AL,BL AND AL,0FH ADDAL,30H CMP AL,3AH JLSTORE ADDAL,7 STORE:MOV SI,AL MOV AH,2 MOV DL,AL INT21H INCSI DECCH JNZNEXT HLT ;设置内存地址 ;循环次数为4 ;4位16进制数左移一位, 将最高位移至最低位 ;将移至最低位的16进制 数转换为ASCII码 ;ASCII码存入内存 然后调用屏幕显示 ;修改参数并进行循环 判断 例4-71 AX寄存器中有一个16位二进制数,编 程统计其中1的个数,结构放到CL寄存器中。 MOV CL,0;初始化 L1: AND AX,AX ;控制循环 JZ STOP SALAX,1 ;循环体 JNCL2 INCCL L2: JMP L1 STOP:HLT 此程序采用先判断,后执行的循环结构 。 2. 多重循环 (2)内循环可以嵌套在外循环中,也可几 个内循环并列在外循环中,但各层循环之间 不能交叉,可以从内循环跳到外循环,不可 以从外循环中直接跳进内层循环。 有些循环结构比较复杂,需要用多重循 环完成。多重 循环设计方法与单循环设计 方法相同,但应注意: (1)各重循环的初始控制条件及程序实现。 (3)防止出现死循环,即不能让循环回到 初始条件,引起死循环。 例4-72 存储器数据段从BUF开始存放一个字数组,数 组中第一字是存放该数组的长度N,编制一个程序使此数 组中的数据按照从小到大的次序排列。 采用冒泡排序算法。从第一个数据开始相邻的数进行比 较,若次序不对,两数交换位置。第一遍比较(N-1)次 后,最大的数已到了数组尾,第二遍仅需比较(N-2)次 就够了,共比较(N-1)遍就完成了排序,这样共有两重 循环。图4-20给出了程序流程图。 开始 数I数I+1? 结束 初始化 数组起始地址BX 内循环次数N-1CX 外循环次数N-1DX I=0 地址加2 两数位置交换 内循环计数CX-1 外循环计数DX-1 CX=0? DX=0? A A Y N N N Y Y 图4-20 数组排序冒泡算法流程图 四、子程序结构 1. 子程序使用 汇编语言中多次使用的程序段可写成一 个相对独立的程序段,将它定义为过程或 称子程序,需要执行这段程序时,就进行 过程调用,执行完毕后在返回原来调用它 的程序。 采用子程序结构编程,使程序结构模块 化,程序清晰,修改容易。每一个子程序包 括在过程定义语句PROCENDP之间。过 程定义有属性NEAR或FAR,调用程序和过 程在同一代码段中,则用NEAR属性,调用 程序和过程若不在同一代码段中,使用FAR 属性。 一般来说主过程应定义为FAR属性,因 为可以把程序的主过程看成DOS调用的一个 子过程,而DOS对主过程的调用和返回都是 FAR属性。过程调用的指令为CALL,过程 返回的指令为RET。通常编写子程序时,写 一个子程序说明,能使模块结构一目了然。 子程序说明包括: (1)功能描述:子程序的名称、功能及性能 (2)子程序中用到的寄存器和存储单元 (3)子程序的入口参数,出口参数 (4)子程序中调用其他子程序的名称 例4-74 有一个子程序说明如下: ;名称:BCD2BIN ;功能:将一个字节的的BCD码转换成 二进制数 ;所用寄存器:CX ;入口参数:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 总经办办公室工作总结及计划
- 小学写事作文教学课件
- 中西医结合护理干预
- 深州预制隔墙板施工方案
- 小学英语口语训练课程设计方案
- 勘测定界技术报告
- 健康卫生托班专题培训
- 防水补漏方案模板范本
- 地产工程岗的工作总结
- 沥青路面垫层施工方案
- GB 23466-2025听力防护装备的选择、使用和维护
- 人教PEP版(2024)四年级上册英语-Unit 3 Places we live in 单元整体教学设计(共6课时)
- 华为信息安全管理培训课件
- 贵阳市殡仪服务中心招聘考试真题2024
- 重庆市危险化学品企业变更管理实施指南(试行)解读2025.7.25
- 煤改电工程施工质量监控方案和措施
- 布病的护理教学课件
- (2025年标准)预售小麦协议书
- 2025年院感测试题及答案
- 公司培训防诈骗知识宣传课件
- 2025年全国《质量知识竞赛》题库及答案
评论
0/150
提交评论