新编1632位微型计算机原理及应用(李继灿主编)第5章PPT学习教案_第1页
新编1632位微型计算机原理及应用(李继灿主编)第5章PPT学习教案_第2页
新编1632位微型计算机原理及应用(李继灿主编)第5章PPT学习教案_第3页
新编1632位微型计算机原理及应用(李继灿主编)第5章PPT学习教案_第4页
新编1632位微型计算机原理及应用(李继灿主编)第5章PPT学习教案_第5页
已阅读5页,还剩157页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、会计学1新编新编1632位微型计算机原理及应用位微型计算机原理及应用(李继李继灿主编灿主编)第第5章章 . 486 DATA SEGMENT USE16 N1 DB x x N2 DB x x SUM DB ? DATA ENDS STACK_ SEGMENT STACK STACK USE16 DB 128 DUP (?) STACK_ ENDS 第1页/共162页 BEG: MOV AX, DATA MOV DS, AX MOV AX,STACK_ MOV SS, AX MOV SP, 128 MOV AL,N1 ADD AL,N2 MOV SUM, AL MOV AH, 4CH INT

2、21H CODE ENDS END BEG 可省CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATA ,SS:STACK_第2页/共162页 说明: . EXE文件中堆栈段的设置 本例以“STACK_”为段名的逻辑段,选用了 “STACK” 链接参数,DOS自动认为“ STACK_”段为堆栈段。 所以, DOS将自动给SS:SP赋初值 因此,源程序给SS:SP赋初值的三条语句是多余的。 链接程序要求: . EXE文件中的源程序必须有堆栈段, 否则链接时将给出警告信息 Warning no stack segment 但这不代表源程序有错,仅仅是警告而已第3页/共

3、162页 如果源程序中不设置堆栈段(在链接时,会给出错误 信息), DOS将自动给程序分配最少128 字节的堆栈 区,故源程序中,如果没有大量数据压栈的话,可以不 设置堆栈段,从而简化程序。二 . COM文件的编程格式 1. 汇编语言规定: COM文件的源程序只能有一个段: 代码段, 不允许 有堆栈段 在代码段偏移地址=100H处, 必须是程序的启动指令 程序中使用的数据可以放在代码段的开始或结尾 第4页/共162页 . 486 . 486CODE SEGMENT USE16 CODE SEGMENT USE16 ASSUME CS: CODE ASSUME CS: CODE ORG 100H

4、 ORG 100HBEG: JMP START BEG: MOV AL, N1N1 DB XX ADD AL, N2 N2 DB XX MOV SUM, ALSUM DB ? MOV AH, 4CHSTART: MOV AL, N1 INT 21H ADD AL, N2 N1 DB XX MOV SUM, AL N2 DB XX MOV AH, 4CH SUM DB ? INT 21H CODE ENDS CODE ENDS END BEG END BEG2. 例: 上例, 写成COM格式源程序第5页/共162页3. COM文件的生成 设上例的文件名为 N1ADDN2. ASM 编辑生成 N1

5、ADDN2. ASM 调用 TASM. EXE 生成 N1ADDN2. OBJ TASM N1ADDN2 调用 TLINK. EXE 生成 N1ADDN2. COM TLINK N1ADDN2 / t 注意:链接参数为小写字母 t 第6页/共162页三. EXE 文件、COM文件的内存映像INT 20H.数据段代码段堆栈段DS=ESCS:IPSS:SP PSP用户程序EXE文件内存映像1.EXE文件的内存映像 DOS把EXE文件调入内存之后,自动在目标程序上方(低地址处)生成一个有256字节的数据块程序段前缀(PSP) DOS令DS=ES=PSP段基址,即DS用户数据段段基址, ES用户附加段

6、段基址 DOS令CS:IP=代码段启动指令的逻辑地址第7页/共162页三. EXE 文件、COM文件的内存映像INT 20H.数据段代码段堆栈段DS=ESCS:IPSS:SP PSP用户程序EXE文件内存映像1.EXE文件的内存映像 DOS令SS:SP=用户堆栈段(如果有堆栈段的话)栈顶的逻辑地址,所以: 用户程序必须给DS赋值,使DS=用户数据段段基址;用户程序必须给ES赋值,使ES=用户附加段段基址FS=GS=0,如果用户程序使用了FS、GS附加段,则必须给FS、GS赋初值第8页/共162页三. EXE 文件、COM文件的内存映像INT 20H.代码段堆栈段 00 H00 HCS=DS=E

7、S=SSIP=100HSPPSP64K-256COM文件内存映像2. COM文件内存映像COM文件调入内存后,DOS也在其上方生成一个PSP CS=DS=SS=ES=PSP段基址,即用户程序的代码段、数据段、ES附加段和堆栈区都在一个64k的逻辑段中 DOS自动使IP=100H,自动执行偏移地址为100H处的那条指令第9页/共162页三. EXE 文件、COM文件的内存映像INT 20H.代码段堆栈段 00 H00 HCS=DS=ES=SSIP=100HSPPSP64K-256COM文件内存映像2. COM文件内存映像DOS自动使S P = F F F E H , 且SS:SP=SS:SP+1

8、=0,这就意味在COM文件中代码段以下,FFFEH以上这一片存储单元都是用户的堆栈区 FS=GS=0第10页/共162页四.程序段前缀 PSP PSP是一个有256字节的数据块,由DOS在装载可执行文件时自动生成。DOS通过PSP向用户程序传递数据,PSP是程序运行不可缺少的部分 每一个可执行文件都伴随有自己的PSP五. 返回DOS的基本方法 对于EXE文件和COM文件,返回DOS最常用的方法 是调用“INT 21H ”的4CH功能。除此之外: 1.对于COM文件还有以下3种方法可以返回DOS,即: 直接执行INT 20H;第11页/共162页 调用INT 21H的0号功能; 执行RET指令。

9、如果此时SP仍然等于FFFEH的话 (程序中规范的使用堆栈,在执行RET之前把进栈的 数据全部弹出,则SP必然等于FFFEH),CPU将无条件 转入PSP的首单元,执行那里的INT 20H,返回DOS。2. 对于EXE文件的编程格式,还有一种返回DOS的方法, 就是在需要返回DOS的时候,设法使CPU转到PSP首 单元,执行那里的INT 20指令。为此,源程序必须采取 下面的3项措施,缺一不可: 把代码段包含在一个远过程之中; 在给DS赋初值之前,用下列3条指令把PSP首单元的 物理地址压入栈顶,即: 第12页/共162页 PUSH DS MOV AX, 0 PUSH AX 在采取了以上两条措

10、施之后,程序在需要返回DOS的地 方执行一条RET指令即可返回DOS。因为这条RET指令 是远过程中的返回指令,它将从栈顶弹出4个字节,即把 PSP首单元的物理地址反弹到CS:IP之中,从而使CPU转 移到PSP首单元,执行那里的INT 20H,再返回DOS。 综上所述,虽然返回DOS有好几种方法,但是调用 INT 21H 的4CH功能,是返回DOS的最常用的方法,它的 优点是简单、通用,而且有利于组织批处理文件。第13页/共162页BIOS/DOS调用模式: MOV AH,功能号 设置入口参数 INT n 分析出口参数BIOS/DOS功能调用子程序调用结束后一般都有出口参数,这些出口参数常放

11、在寄存器中,通过出口参数可以知道功能调用的成功与否。其中n值因子程序不同而可能不同,比如:ROM BIOS有n=51FH,DOS有n=20H,21H,232AH,2EH,2FH,33H和67H等几种情况。有的n只对应一个子程序,有的n对应很多子程序,第14页/共162页.2 DOS系统I/O功能调用 在DOS功能子程序调用中,我们把通过INT21H来实现的子程序调用成为DOS系统功能调用。第15页/共162页调用模式: MOV AH,功能号 设置入口参数 INT 21H 分析出口参数AH=?执行1#子程序执行2#子程序IRET21H型中断服务程序=1=2第16页/共162页功能号01H 等待键

12、入一个字符,有回显,响应Ctrl_C 入口参数: 无。 出口参数: AL=按键的ASC码,若AL=0,表明按键是功 能键、光标键,需再次调用此功能,才能返回按键的扩 展码。第17页/共162页功能号02H 显示一个字符, 响应Ctrl_C 入口参数: DL=待显字符的ASC码。 出口参数:无。 本功能在屏幕的当前位置显示一个字符,光标右移一 格,如果是在一行末尾显示字符,则光标返回下一行的开 始格。如果是在屏幕的右下角显示字符,光标返回时屏 幕 要上滚一行。试验表明,该项功能要破坏AL寄存器的 内容。 功能号07H 等待键入一个字符,无回显,不响应Ctrl_C。 入口参数:无。 出口参数: A

13、L=按键的ASC码,若AL,需再次调用 该功能才能在AL中得到按键的扩展码。第18页/共162页功能号09H 显示字符串,响应Ctrl_C。 入口参数: DS:DX=字符串首地址,字符串必须以$ (即ASC码24H)为结束标志。 出口参数: 无。 该项功能从屏幕当前位置开始,显示字符串,遇到结束标志$时停止,$字符并不显示。实验表明,9号功能也破坏AL寄存器的内容。 功能号08H 等待键入一个字符,无回显,响应Ctrl_C。 入口参数: 无。 出口参数: AL=按键的ASC码,若AL0,需再次调用 该功能才能在AL中得到按键的扩展码。第19页/共162页功能号0AH 等待键入一串字符,送用户程

14、序数据缓冲区 入口参数、出口参数如图所示。程序员预置可容纳的字符个数(包括回车键)0AH功能写入实际接收的字符个数 (不包括回车键)数据缓冲区 BUF+0+1+2.+n键入字符串的实际存储区域第20页/共162页 0AH要求键入的字符串以“回车”作为结束标志,换句话说,按下回车键后,此功能调用结束,光标返回当前行始格。“回车”符留在缓冲区当中。 对数据缓冲区的格式有如下要求: 缓冲区要设置在用户程序数据段,调用前,缓冲区首址偏移量应赋给DX寄存器。 缓冲区首单元应预置“允许接受的字符个数”(包括回车符在内)。 用户键入回车后,由0AH功能把实际键入的字符个数 (不包括回车符)写入BUF+1单元

15、。 键入的字符串从BUF+2单元开始依次存放。 因此,缓冲区的容量要大于或等于键入串的长度+2(注意:键入的字符串长度应包括回车符) 。 缓冲区不接受超长字符,并发出声响以示警告 第21页/共162页 0AH在接收字符的过程中,有回显,响应Ctrl_C,按下退 格键可删除屏幕及缓冲区中的当前字符。 下面的程序段给出了0AH功能调用的示范,它允许用户 键入15个字符(包括回车键)。 假设 数据段 BUF DB 15 DB ? DB 15 DUP(?) 代码段 . MOV AH, 0AH MOV DX, OFFSET BUF INT 21H . 第22页/共162页功能号0CH清除键盘缓冲区,然后

16、调用由AL指定的功能。 入口参数: AL允许是: 01H 键入一个字符,有回显,响应Ctrl_C。 06H 字符 I/O。 07H 键入一个字符,无回显,不响应Ctrl_C。 08H 键入一个字符,无回显,响应Ctrl_C。 0AH 键入一串字符,写入用户数据区。 其他入口参数应根据相关的功能,另行设置。 第23页/共162页功能号4CH 该功能是指,终止当前程序的运行,并把控制权交给调用它的程序。由被终止程序打开的全部文件都被关闭,该项功能还把程序占用的内存空间交还给DOS另行分配。该项功能允许被终止的程序传送一个“返回码”给调用它的程序。假若被终止的程序是由DOS 命令调入的,那么返回码可

17、以被DOS批处理命令中的“ IF ERRORLEVEL ”子命令识别。 入口参数: AL=返回码(或者不设置)。 出口参数: 无。 说明:当用户程序执行1,2,8,9,0AH,0BH,OCH功能调用 时,如果键入Ctrl_C或者Ctrl_Break,DOS将自动调用INT 23H中断处理程序,从而强行使用户程序中断,我们称 为响应Ctrl_C。第24页/共162页 例: 人机会话程序。 问题: 如何设置程序运行所需的数据?有以下几种方法数据设置在程序的数据段程序运行时通过人机会话临时键入程序装入时通过命令行参数给出 本例学习前两种方法,并以此学习DOS功能调用。Li mai?(Y/N) Wha

18、t is your name? 1.会话内容及设计思路Li nai ;前者是程序给出的询问信息, 后者是用户键入的回答N ;程序复制的姓名和回答提示Li mai ;再次问答Li nai?(Y/N)What is your name?Y第25页/共162页2. 框图:显示询问信息等待键入姓名串复制姓名串等待用户认可Y/NY 返回DOS9#功能0AH#功能9#1#N第26页/共162页 DATA SEGMENT USE16 MESG1 DB 0DH,0AH DB What is your name ?$ MESG2 DB ?(Y/N)$ BUF DB 30 DB ? DB 30 DUP(? ) D

19、ATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DA:DATA BEG: MOV AX,DATA MOV DS,AX AGAIN: MOV AH,9 MOV DX,OFFSET MESG1 INT 21H ;询问姓名 MOV AH,0AH MOV DX,OFFSET BUF INT 21H ;接收键入字符串 MOV BL,BUF+1 MOV BH,0 . 486第27页/共162页 ;实际键入的字符个数BX MOV SI,OFFSET BUF+2 MOV BYTE PTRBX+SI,$ ;用 $作为串结束符 MOV AH,2 MOVDL,0AH INT 2

20、1H ;光标下移一行 MOV AH,9 MOV DX,OFFSET BUF+2 INT 21H ;复制键入的字符串 MOV AH,9 MOV DX,OFFSET MESG2 INT 21H ;给出认可信息 MOV AH,1 INT 21H ;等待键入 CMP AL,Y;比较 JNE AGAIN MOV AH,4CH INT 21H ;返回 DOSCODE ENDS END BEG 第28页/共162页.3 BIOS键盘输入功能调用主板EPROM中固化有基本I/O系统程序BIOS,它是最接近硬件的驱动程序,BIOS中的许多子程序可被用户程序调用,调用这些子程序称为BIOS功能调用。第29页/共1

21、62页调用模式: MOV AH,功能号 设置入口参数 INT 16H 分析出口参数BIOS常用的键盘输入功能调用如下:(调用指令INT 16H)功能号00H读取键入的一个字符,无回显,响应Ctrl_C, 无键入则等待。 入口参数: 无。 出口参数: AL=键入字符的ASCII码. 若AL=0,则AH=输入键的扩展码。第30页/共162页功能号01H 查询键盘缓冲区。 入口参数: 无。 出口参数: Z标志=0,表示有键入,此时AL=键入字符的码, AH=键入字符的扩展码。 注意: 该功能调用结束后,键代码仍留在键盘缓冲区中。 Z标志=1,表示无键入。第31页/共162页 功能号02H 读取当前转

22、换键状态。 入口参数: 无。 出口参数: AL=键盘状态字。状态字各位定义如下: AL7位置1 表示Insert键有效(被奇数次按下)。 AL6位置1 表示Caps Lock键有效(相应的指示灯亮)。 AL5位置1 表示Num Lock键有效(相应的指示灯亮)。 AL4位置1 表示Scroll Lock键有效(相应的指示灯亮)。 AL3位置1 表示按下了Alt键。 AL2位置1 表示按下了Ctrl键。 AL1位置1 表示按下了左Shift键。 AL0位置1 表示按下了右Shift键。第32页/共162页 功能号10H 读扩展键盘,无回显,响应Ctrl_C。 入口参数: 无。 出口参数: AL=

23、键入字符的ASC码, 若AL=0,则AH=键入字符的扩展码。 功能号11H 查询扩展键盘缓冲区。 入口参数: 无。 出口参数: Z标志=0,表示有键入,此时AL=键入字符的ASC码, AH=键入字符的扩展码。 注意: 该功能调用结束后,键代码仍留在键盘缓冲区中。 Z标志=1,表示无键入。 第33页/共162页功能号12H读取扩展键盘的转换键状态。 入口参数: 无。 出口参数: AL=扩展键盘状态字, AL7 AL0的置位条 件同功能号02H。 例如: SCAN: MOV AH ,1 INT 16H JZ SCAN MOV AH,0 INT 16H ;按键的键代码AL第34页/共162页 .4

24、CRT显示器与BIOS文本显示功能调用 显示器是输出设备,显示适配器是CRT与主机的接口电路,CRT和CRT适配器共同组成了显示系统 80列25行40列25行 1.显示器工作方式 黑白/彩色文本方式 黑白/彩色图形方式 文本方式: 显示数字 ,字符 图形方式: 显示点,由点(像点)组成图形第35页/共162页2.显示存储区与显示屏 单显8025文本方式 彩显8025文本方式0页1页2页3页B000 B800 B900 BA00 BB00ASC码属性.ASC码属性:0000:0001:0F9E:0F9F079列024行显示存储区与屏幕字符的对应关系第36页/共162页 显示存储区是系统RAM的一

25、部分,其中存放待显字符 的 ASC码和它的属性字。 工作在8025文本方式下,屏幕被“划分”为2000个“方 格”,每一个方格显示一个“点阵字符”,列号0 79,行号 0 24。 显示器一个小方格对应显示存储区的两个单元,所以 2000个方格对应4000个单元。 彩显适配器,文本显示存储区有16K,分为4页(0 3) 段基址为 B800H,B900H,BA00H,BB00H。第37页/共162页3.当前页 系统启动时,BIOS自动完成显示适配器的初始化,显示器自动工作在8025黑白文本方式,并且默认第0页为“当前页”。CRT控制器按50屏/秒的速度从0页 显示区取字符屏幕显示,重复不断,故能收

26、到稳定显 示的效果。 调用5#功能,可以选择其他显示存储区(1 3)为“当前页”。第38页/共162页 D7 D6 D5 D4 D3 D2 D1 D00:正常显示1:闪烁显示(背景闪烁) 背景色前景色共8种背景色 16种前景色颜色的编码,请见教材。如:蓝底白字,属性字为1FH, 黑底红字,属性字为04H。4.文本方式属性字 彩显属性字:第39页/共162页5. 屏显的编程方法 DOS功能调用(如:2#,9#) BIOS功能调用(0EH#,13H#) 直接对显示存储区进行写操作 6. BIOS屏显功能调用的调用模式 MOV AH, 功能号 预置入口参数 INT 10H 分析出口参数第40页/共1

27、62页 7.文本方式BIOS屏显子功能 调用指令INT 10H。 功能号00H 设置屏幕显示方式(兼有清屏功能) 入口参数: AL=0 4025 黑白文本方式 AL=1 4025 彩色文本方式 AL=2 8025 黑白文本方式 AL=3 8025 彩色文本方式 出口参数: 无。第41页/共162页 功能号02H 预置光标位置。 入口参数: BH=显示页号,DH=行号,DL=列号。 出口参数: 无。 功能号05H 设置当前显示页。 入口参数: AL=显示存储器页号(在80 列方式中为03)。 出口参数: 在屏幕上显示出指定显示页的字符(只对文 本方式有效)。第42页/共162页 功能号06H 窗

28、口上滚。 入口参数: AL=窗口上滚的行数, BH=底部空白行属性字, CH、CL=窗口左上角的行、列号, DH、DL =窗口右下角的行、列号。 出口参数: 无。说明: 该功能允许在屏幕上定义一个窗口,并使窗口信息上 滚AL行。 窗口是屏幕上一个局部的显示框,窗口上滚一行,即:窗 口顶部信息移出窗口之外而消失,窗口底部自动留出一 行空白,底部空白行的属性由BH中属性字决定。 若AL =0,则窗口信息全部移出。第43页/共162页功能号0EH 显示一个字符。 入口参数: AL=待显字符的ASC码。 出口参数: 无。 说明: 该功能在光标的当前位置显示一个字符,随后光标 前进一格,满一行后自动换行

29、,满一页则整屏信息上滚一 行。与DOS系统的2号功能调用具有相同的效果。功能号13H 显示字符串。 入口参数: AL=03, BH=显示页号, BL=属性字(当AL=0,1时有效), CX=串长度, DH,DL=字符串显示的起始行、列号, ES:BP=待显字符串首地址。 出口参数: 无。 第44页/共162页说明: 仅286以上微机BIOS有此功能,该功能从屏幕的指定 位置开始显示一串彩色字符。 待显字符串需放在附加段,首地址偏移量需写入BP寄 存器 。 AL=0表示: 待显字符串中仅包含字符的ASC码,串中 各字符的属性由BL中的属性字决定,串显示结束后,光 标返回到调用前的位置。 AL=1

30、表示: 待显字符串中仅包含字符的ASC码,串中 各字符的属性由BL中的属性字决定,串显示结束后,光 标停留在字符串的末尾。第45页/共162页 AL=2表示: 待显字符串中包含有各个字符的ASC码 和属性字,格式为ASC码,属性, , ASC码,属性。 串显示结束后,光标返回到调用前的位置。 AL=3表示: 待显字符串中包含有各个字符的ASC码 和属性字,格式同上,串显示结束后,光标停留在字符串 的末尾。 当AL选择2或3的时候,CX中的串长度不包括各字符的 属性字节。 8.什么是“窗口上滚”? 窗口:屏幕上任意位置的一个巨型区域称为一个“窗口” 号功能可以在屏幕上定义一个窗口,并使窗口中 的

31、信息向上“平移”若干行,这称为“窗口上滚”,上滚后顶 部行信息移出窗口而消失,底部留出一空白行,空白行的 属性可由用户选择。第46页/共162页 注意:13H功能是唯一能显示彩色字符的子功能 例:在屏幕左上角显示HELLO 黑底灰白字符 在屏幕中央显示 I AM A STUDENT 红底白字思路: 显示HELLO,用DOS功能#要求待显字符串放在数据段,串尾用$作结束符 显示I AM A STUDENT,用 BIOS 13H 功能它要求待显字符串在附加段 这意味着源程序至少要有三个逻辑段,我们令数据 段与附加段“重叠”,这样源程序仅设置两个逻辑段 即可。第47页/共162页 . 486DATA

32、 SEGMENT USE16MESG1 DB HELLO $MESG2 DB I AM A STUDENTLL = $MESG2DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE ASSUME DS:DATA ASSUME ES:DATA BEG: MOV AX, DATA MOV DS, AX MOV ES, AX MOV AX, 0003H INT 10H MOV AH, 9 MOV DX,OFFSET MESG1 INT 21H MOV AX, 1301H MOV BH, 0 MOV BL, 01001111B MOV CX, LL MOV DH,12

33、MOV DL, (80-LL)/2 MOV BP, OFFSET MESG2 INT 10H MOV AH, 4CH INT 21H CODE ENDS END BEG 第48页/共162页5.5 分支程序例. 二进制数显示 将BX寄存器中的内容以二进制数格式屏显 DOS功能调用 BIOS功能调用:(本例令BX=5678H)第49页/共162页1数BX,16次CXC标=?1AL调BIOS.0EHCX-1CXCX=00ALBX左移一位0NY返DOS第50页/共162页解: 486CODE SEGMENT USE16 ASSUME CS:CODE BEG: MOV BX,5678H MOV CX,

34、16 LAST: MOV AL,0 ROL BX,1 JNC NEXT MOV AL,1 NEXT: MOV AH,0EH INT 10H LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG ADC AL,0 第51页/共162页 数轴: N1 (800) N2 (900)例. 复合分支举例(书例自学)某科室9人,统计月收入在800900间的人数,并用十进制数显示。解:月收入是无符号数,对一批数处理应该用间址。第52页/共162页解: 486DATA SEGMENT USE16NUM DW XX,XXDATA ENDSCODE SEGMENT USE1

35、6 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AX MOV BX,OFFSET NUM MOV CL,9 MOV DL,0LAST: CMP WORD PTR BX,800 JC NEXT ;900转 INC DLNEXT: INC BX INC BX DEC CL JNZ LAST ADD DL,30H ;DL=09ASC码 MOV AH,2 INT 21H MOV AH,4CH INT 21HCODE ENDS END BEG 第53页/共162页例.多分支段内转移要求:键入0,转P0程序段 键入1,转P1程序段 键入9,转P9程序段思路:

36、用比较指令配合直接转移指令实现 CMP 键入字符,0 JE P0 CMP 键入字符,1 JE P1 用转移地址表配合间接转移指令实现第54页/共162页解: 486DATA SEGMENT USE16TAB DW P0,P1,P9 ;汇编后自动装入相应的偏移地址MESG DB 0DH,0AH,strike 09:$DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AXAGA: MOV AH,9 MOV DX,OFFSET MESG INT 21H MOV AH,1 INT 21H CMP AL,0

37、 JC AGACMP AL,9JA AGASUB AL,30HMOVZX BX,ALADD BX,BX;2BXBXMOV SI,OFFSET TABJMP BX+SI;DS:BX+SI IPP0: P1: P9: CODE ENDS END BEG 或:MOV BX,BX+SI JMP BX ;BX IP第55页/共162页1. 循环程序的结构Y预置循环次数其他准备工作循环体循环减1计数退出循环结果为0?N(a)单循环结构5.6 循环程序外循环减1计数(b) 双循环结构结果为0?结果为0?退出循环预置外循环次数其他准备工作预置内循环次数其他准备工作NNYY循环体内循环减1计数第56页/共162

38、页2.结束循环的技巧(编程技巧)用寄存器做循环计数器用内存单元做循环计数器用循环结束标志结束循环例.设从BUF单元开始,存有若干字节的ASC码,找出其中的最大数屏幕显示。思路:ASC码数为无符号数,无符号数的最小数为0第57页/共162页YNN数据区首址DS:BX无符号最小数AL数据个数CXBX ALBX=AL?BX+1 BXCX-1 CX显示结果返回DOSCX=0?Y第58页/共162页解法1 486 DATA SEGMENT USE16 BUF DB QWERTYUIOP123 COUNT EQU $ -BUF;统计串长度 MAX DB MAX=,?,0DH,0AH,$ DATA ENDS

39、 CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX MOV AL,0 ;无符号最小数 0 AL LEA BX,BUF ;串首址偏移量BX MOV CX,COUNT ;串长度CX LAST: CMP BX,AL;比较 JC NEXT MOV AL,BX;大数ALNEXT: INC BX LOOP LAST ;循环计数 MOV MAX+4,AL ;最大数MAX+4 单元 MOV AH,9 MOV DX,OFFSET MAX INT 21H ;显示结果 MOV AH,4CH INT 21H ;返回 DOSCODE

40、 ENDS END BEG 第59页/共162页解法2 486DATA SEGMENT USE16BUF DB QWERTYUIOP123FLAG DB 1 ;设置串结束标志MAX DB MAX=,?,0DH,0AH,$DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AX MOV AL,0 ;无符号最小数 0 AL LEA BX,BUF ;串首址偏移量BXLAST: CMP BYTE PTR BX, -1 ;BX=串结束标志 ? JE DISP ;是,转 CMP BX,AL JC NEXT MO

41、V AL,BX ;大数ALNEXT: INC BX JMP LASTDISP: MOV MAX+4,AL ;最大数MAX+4 单元 MOV AH,9 MOV DX,OFFSET MAX INT 21H ;显示结果 MOV AH,4CH INT 21H ;返回 DOSCODE ENDS END BEG 第60页/共162页5.7 子程序及其调用 子程序是相对独立的程序,当程序中要多次完成某一操作时,为了简化整体程序,增强程序可读性,常常把“完成某一操作”设计成一个子程序,供调用。 向子程序传递参数的方法 通过寄存器传递参数 利用堆栈区传递参数 利用内存单元传递参数子程序用PROC/ENDP定界子

42、程序分为:段内子程序、段间子程序、无参数子程序、有参数子程序第61页/共162页例.无参数子程序CODE SEGMENTCALL CRLFCALL CRLFCRLF PROC MOV AH,2 MOV DL,0DH INT 21H MOV AH,2 MOV DL,0AH INT 21H RETCRLF ENDPCODE ENDS第62页/共162页例.用寄存器传递参数数据段:MESG1 DB Please Enter 09:$ MESG2 DB Strike any key,0DH,0AH,$代码段:CODE SEGMENT MOV DX,OFFSET MESG1 CALL DISP MOV

43、DX,OFFSET MESG2 CALL DISP DISP PROC MOV AH,9 INT 21H RETDISP ENDPCODE ENDS第63页/共162页例.设N1=1122H,N2=3344H,N3=5566H 用子程序调用的方法实现3个数的累加和 解法1: 编程技巧:把数据单元的偏移地址传送给计算累 加和的子程序 . 486 DATA SEGMENT USE16 NUM DW 1122H ;N1 DW 3344H ;N2 DW 5566H ;N3 DATA ENDS STACK_ SEGMENT STACK STACK USE16 DB 100 DUP(?) STACK_ E

44、NDS程序清单:第64页/共162页CODE SEGMENT USE16 ASSUME CS:CODE ASSUME DS:DATA,SS:STACK_BEG: MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM ;参数指针SI CALL COMPUTEXYZ: CALL DISPEXIT: MOV AH,4CH INT 21H;-COMPUTE PROC MOV BX,0 ADD BX,SI+0 ;BX+N1BX ADD BX,SI+2 ;BX+N2BX ADD BX,SI+4 ;BX+N3BX RET ;返断点XYZCOMPUTE ENDP ;-DISP PRO

45、C;显示BX内容 MOV CX,16LAST: MOV DL,0 RCL BX,1 JNC NEXT MOV DL,1NEXT: MOV AH,2 INT 21H LOOP LAST RET ;返断点EXITDISP ENDPCODE ENDS END BEG 第65页/共162页解法2: 编程技巧:调用前先把数据压栈,计算累加和的子程序从堆栈中取数,完成累加和。 . 486 DATA SEGMENT USE16 NUM DW 1122H ;N1 DW 3344H ;N2 DW 5566H ;N3 DATA ENDSSTACK_ SEGMENT STACK STACK USE16 DB 100

46、 DUP(?)STACK_ ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,SS:STACK_程序清单:第66页/共162页BEG: MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM ;N1 ,N2,N3压栈 PUSH WORD PTR SI+0 PUSH WORD PTR SI+2 PUSH WORD PTR SI+4 CALL COMPUTEXYZ: CALL DISPEXIT: MOV AH,4CH INT 21H;-COMPUTE PROC MOV BP,SP ;栈针BP MOV BX,0 ADD BX,BP+

47、2 ;BX+N3BX ADD BX,BP+4 ;BX+N2BX ADD BX,BP+6 ;BX+N1BX RET 6 ;返断点XYZ,清栈COMPUTE ENDP;-DISP PROC ;显示BX内容 MOV CX,16 LAST: MOV DL,0 RCL BX,1 ADC DL,0 MOV AH,2 INT 21H LOOP LAST RET ;返断点EXITDISP ENDPCODE ENDS END BEG 第67页/共162页解法3:编程技巧:数据放在代码段,利用内存单元传递数据 . 486STACK_ SEGMENT STACK STACK USE16 DB 100 DUP(?)S

48、TACK_ ENDSCODE SEGMENT USE16 ASSUME CS:CODE,SS:STACK_BEG: CALL COMPUTENUM DW 1122H ;N1 DW 3344H ;N2 DW 5566H ;N3XYZ: CALL DISPEXIT: MOV AH,4CH INT 21H 程序清单:第68页/共162页COMPUTE PROC MOV BP,SP ;栈针BP ;断口地址NUMSI MOV SI,BP+0 MOV BX,0 ;BX+N1BX ADD BX,CS:SI+0 ;BX+N2BX ADD BX,CS:SI+2 ;BX+N3BX ADD BX,CS:SI+4 ;

49、弹出原来的断口地址 POP AX MOV AX,OFFSET XYZ PUSH AX RET ;返回断点XYZCOMPUTE ENDP;显示BX内容DISP PROC MOV CX,16LAST: MOV AL,0 RCL BX,1 ADC AL,0 MOV AH,0EH INT 10H LOOP LAST ;返回断点EXIT RET DISP ENDPCODE ENDS END BEG第69页/共162页6.8 宏指令与条件汇编 子程序调用可以简化程序,但是如果子程序的参数太多,调用时太麻烦,汇编语言提供了另一种简化的途径宏指令。宏指令是汇编语言提供的伪指令! 是用户自行定义的若干指令的集合

50、宏指令有:无参数宏指令、有参数宏指令宏指令应该先定义后调用”“宏指令的定义,可以不在任何逻辑段之中,习惯 上放在源程序首部第70页/共162页1.宏定义语句的格式: 宏指令名字 MACRO 宏体 ENDM一.无参数宏指令的定义与调用:2.宏指令调用: 宏指令先行定义之后,在代码段的任何位置, 书写“宏指令名字”即完成了调用。3.宏指令的“汇编”: 汇编时,汇编程序自动用宏体取代宏调用。 此处没有宏名字第71页/共162页例: 486 CRLF MACRO ;实现回车换行 MOV AH,0EH MOV AL,0DH INT 10H MOV AL,0AH INT 10H ENDM CODE SEG

51、MENT USE16 ASSUME CS:CODE BEG: MOV AH,2 MOV DL,A INT 21H CRLF 汇编时,自动用宏体替换宏指令拷贝一份到这儿第72页/共162页二.有参数的宏指令及其调用格式: 宏指令名字 MACRO 用逗号(或空格)间隔的哑元表 宏体 ENDM调用格式: 宏指令名字 实元表注意: 实元表是一串用逗号(或空格)间隔的立即数,寄存器操作数或者是没有PTR说明符的存储器操作数。 汇编时,汇编程序自动地把实元一一对应的赋给哑元。第73页/共162页例.定位显示彩色字符串 要求置显示器为彩色文本方式,并在: 0行5列 显示 黑底绿色 HELLO 12行36列

52、显示 黑底红色 WELCOME! 24行66列 显示 黑底黄色 BYE_BYE 解: . 486 DISP MACRO Y, X, VAR, LENGTH, COLOR MOV AH,13H MOV AL,1 MOV BH,0 ;选择0页显示屏 MOV BL,COLOR ;属性字(颜色值) BL MOV CX,LENGTH ;串长度 CX MOV DH,Y ;行号 DH MOV DL,X ;列号 DL MOV BP,OFFSET VAR ;串有效地址BP INT 10H ENDM 第74页/共162页EDATA SEGMENT USE16 SS1 DB HELLO SS2 DB WELCOME

53、 ! SS3 DB BYE_BYEEDATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,ES:EDATA MOV AX,EDATA MOV ES,AX MOV AX,3 INT 10H DISP 0, 5, SS1, 5, 2 ;0行5列显示绿色HELLO DISP 12, 36, SS2, 8, 4 ;12行36列显示红色WELCOME DISP 24, 66, SS3, 7, 0EH ;24行66列显示黄色BYE_BYE SCAN: MOV AH,1 INT 16H JZ SCAN ;等待用户键入,无键入转 MOV AX,2 INT 10H ;恢复802

54、5黑白文本方式 MOV AH,4CH INT 21H CODE ENDS END BEG 第75页/共162页分析:BIOS INT 10H的13H子功能,要求待显字符串在附加段,串首址ES:BP对哑参数的赋值是在调用指令中完成的子程序调用能减小目标程序的体积,而宏指令调用则不能减小目标程序的体积宏指令可以嵌套三.LOCAL伪指令 如果宏体中有分支、转移,则必然有标号,2次以上调用这样的宏体,就会出现标号重复定义的错误,为此汇编语言又提供了一条LOCAL伪指令。第76页/共162页应用:用LOCAL定义的标号称为“局部标号”,它是宏体中所有标号的集合。局部标号可以和代码段中其他标号重名。宏指令

55、仅被调用1次时,不必使用LOCAL伪指令。例.分组显示8,16,32 位二进制数解: . 486 CRLF MACRO ;光标返回下一行始格 MOV AH,0EH MOV AL,0DH INT 10H MOV AL,0AH INT 10H ENDM格式:LOCAL 用逗号间隔的标号名第77页/共162页;分组显示VAR中的NN位二进制数DISP MACRO VAR,NN LOCAL L1, L2 MOV CH,NN/4L1: MOV CL,4L2: MOV AL, 0 ROL VAR,1 ADC AL,0 MOV AH,0EH INT 10H DEC CL JNZ L2 MOV AL, INT

56、 10H DEC CH JNZ L1 CRLF ENDMCODE SEGMENT USE16 ASSUME CS:CODENUM DB 88HBEG: MOV EBX,12345678H DISP BH,8 ;显示BH中的8位数 DISP BX,16 ;显示BX中的16位数 DISP EBX,32 ;显示EBX中的32位数 DISP NUM,8 ;显示NUM单元中的8位数 MOV AH,4CH INT 21HCODE ENDS END BEG 第78页/共162页四.条件汇编语句: 条件汇编是汇编语言提供的伪指令、伪语句。高版本的汇编语言提供了许多格式的条件语句,此处仅介绍最常用、最基本的格式

57、。格式1:IF 条件 指令集合1 ELSE 指令集合2 ENDIF格式2: IF 条件 指令集合 ENDIF说明:IF/ENDIF是一对定界语句,“条件”为逻辑表达式或关系表达式。第79页/共162页格式1功能:如果条件成立,汇编指令集合1; 如果不成立,汇编指令集合2。格式2功能:如果条件成立,汇编指令集合, 否则不汇编。 例. SHIFT MACRO VAR, N, LR IF LR EQ L ROL VAR,N ELSE ROR VAR,N ENDIF ENDM代码段中这样调用:MOV EAX,12345678HMOV EBX,12345678HSHIFT EAX, 8, L;EAX=3

58、4567812HSHIFT EBX, 8, R;EBX=78123456H第80页/共162页A6.9 代码转换常见的代码转换有: 二进制数显示,二进制数十进制数显示,二进制数十六进制数显示,BCD码数二进制数一. 二进制数显示:例.把键盘输入的一位数(09),转换成等值二进数显示显示的格式要求如下:Please EnterERROR!Please Enter9 =00001001B第81页/共162页思路:键盘缓冲区中是键入字符的ASC码。 09的ASC码为30H39H。二进制数每一位代码的判断:本程序采用两种格式设计源程序:一种是EXE文件编程格式,另一种是COM文件编程格式。RCL0SA

59、LROLCFCFCF第82页/共162页程序框图: AL-30HBL =屏幕,8CX 0 屏幕1 屏幕CX-1 CXB 屏幕,返回DOSNN给出操作提示键盘输入ALAL=09?CF=?CX=0?BL左移一位Y显示错误信息 Y01第83页/共162页 . 486DATA SEGMENT USE16MESG1 DB Please Enter ! ,0DH,0AH,$MESG2 DB -Error ! $ DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AX MOV AH,9 MOV DX,OFFSE

60、T MESG1 INT 21H ;显示操作提示 MOV AH,1 INT 21H ;等待键入 CMP AL,3AH JNC ERROR ;9转 CMP AL,30H EXE格式程序清单 JC ERROR ;0转 SUB AL,30H MOV BL,AL ;BL=09 的二进制数 MOV AH,2 MOV DL,= INT 21H CALL DISP MOV AH,2 MOV DL,B INT 21H JMP EXITERROR: MOV AH,9 MOV DX,OFFSET MESG2 INT 21H ;显示错误信息EXIT: MOV AH,4CH INT 21H第84页/共162页;-DIS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论