收藏 分享(赏)

汇编语言67958.ppt

上传人:dzzj200808 文档编号:2162819 上传时间:2018-09-03 格式:PPT 页数:112 大小:1.15MB
下载 相关 举报
汇编语言67958.ppt_第1页
第1页 / 共112页
汇编语言67958.ppt_第2页
第2页 / 共112页
汇编语言67958.ppt_第3页
第3页 / 共112页
汇编语言67958.ppt_第4页
第4页 / 共112页
汇编语言67958.ppt_第5页
第5页 / 共112页
点击查看更多>>
资源描述

1、第五章,汇编语言基础 5.4-5.6,中原工学院软件学院 韩玉民,重点掌握: 程序的格式、开发方法 参数的表达、变量的定义 变量和标号的属性,5.4 汇编语言程序的设计与调试,汇编程序功能,汇编程序的主要功能:检查源程序,给出出错信息。产生目标文件(.obj)和列表文件(.lst)。展开宏指令。,汇编语言程序的开发过程,源程序:文件名.asm,目标模块:文件名.obj,可执行文件:文件名.exe,错误,1、编辑:形成 .ASM文件 (EDIT) 2、汇编(编译):将.ASM文件翻译成二进制代码的目标文件(即将助记符语言翻译成机器指令),形成.OBJ文件。(MASM) 3、连接:.OBJ虽是二进

2、制文件,但不能直接上机运行,必须经过连接,把目标文件与库文件等其他连接在一起,形成可执行文件.EXE。(LINK) 4、运行:可在DOS提示符下键入文件名运行。 5、调试:在DEBUG下进行动态调试,检查错误等。,完整的汇编语言程序格式,;大于50送数,小于等于则省略 my_data segment again: Mov al,si array1 db 05,a2H,00,10H,85H Inc sin equ 5 Cmp al, 50 array2 db n dup(?) Jbe next my_data ends Mov di, al my_code segment Inc diassum

3、e cs:my_code next: dec cx assume ds:my_data jnz again begin: mov ax, my_data mov ah,4chmov ds, ax int 21hLea si, array1 my_code endsLea di, array2 end begin Mov cx, n,由上例可看出,汇编语言源程序除了实现具体功能的指令外,还有一些涉及数据定义、程序格式的伪指令,是汇编语言源程序的必要组成部分。,汇编语言程序,指令 伪指令(伪操作) 宏指令,何谓伪指令:并非由CPU执行的指令,而是在汇编程序对源程序进行汇编期间,由汇编程序执行的操作

4、。主要是为汇编程序服务的,为其提供一些必要的格式、信息等。可以处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。,指令和伪指令采用易于记忆的符合表达,这就是助记符,伪指令:,伪指令语句格式:,处理器选择伪操作 段定义伪操作 程序开始和结束伪操作 数据定义及存储器分配伪操作表达式赋值伪操作 地址计数器与对准伪操作 基数控制伪操作,伪指令:,一、数据定义及存储器分配伪操作指令,1、功能:定义变量。变量主要用来定义存储器中的数据,在程序运行中,变量是可以被修改的运算对象。 2、格式: 变量名 DB/DW/DD ;注释,单元地址,数据定义伪指令,数据表达式,变量定义伪指令最常使用

5、,定义数据的操作符有: 字节定义DB字定义DW双字定义DD四字定义DQ十字节定义DT重复定义 m DUP (n) (重复m次个数据 n ) 3、含义在定义变量后,就为变量分配若干个存储单元,并由变量名作为单元起始地址,并把后跟数据存入指定单元即可。,字节变量的定义DB(Define Byte),DB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值 初值表中每个数据一定是字节量,存放一个8位数据: 可以是0255的无符号数 或是128127带符号数 也可以是字符串常数,实例,字节变量定义实例,;数据段 X db a,-5db 2 dup(100),? Y db ABC,字变量的定义D

6、W(Define Word),DW伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值 初值表中每个数据是字量,一个字单元可用于存放任何16位数据: 一个段地址 一个偏移地址 两个字符 065535之间的无符号数 3276832767之间的带符号数,字变量定义实例,;数据段 count dw 8000h,?,AB maxint equ 64h number dw maxint array dw maxint dup(0),双字变量的定义DD(Define Double word),DD伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值 初值表中每个数据是一个32位的双字量: 可

7、以是有符号或无符号的32位整数 也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针 vardd DD 0,?,12345678h Farpoint DD 00400078h,数据定义伪指令的几种数据表达式:数值表达式:由立即数构成。字符串表达式:表示将字符串中的字符的ASCII码存放在存储单元中。?号表达式:不带引号的?表示可预置任何内容。 DUP表达式:DUP是定义重复数据操作符。格式: 变量名 DB/DW/DD 表达式1 DUP(表达式2),重复次数,重复内容,通过上述定义,在存储器中将产生如图所示的结果,以DATA1到DATA6为例: 例:DATA1 DB ?DAT

8、A2 DW 1000HDATA3 DD 3000A455HDATA4 DB 4 DUP(0)DATA5 DW 0120H, 0240H, 0360H,例: DATA6 DB THIS IS A EXAMPLE,二、表达式赋值伪操作:,表达式名 EQU 表达式B EQU BP+8 ALPHA EQU 9 BETA EQU ALPHA+18,1、作用:为了使程序便于阅读和修改,我们有时使用一个符号来代表一个数,而符号代表了一定的意义,在程序中使用一个符号代表一个数进行操作。 2、格式:, = 号操作 对符号的赋值还可使用“=”操作,它与EQU的区别是“=”操作可以重复定义,而EQU则不能重复定义。

9、如:X=3Y=6Y=Y*Y-XMOV AX, Y通过上述操作,最后使Y=33,后面的MOV语句中,当生成目标代码时将用33取代Y。即MOV AX, 21H (33D),三、段定义伪操作指令,1、格式:,段名 SEGMENT 定位类型 组合类型 类别名 ; 语句序列段名 ENDS,完整的段定义伪操作,从上述程序中,我们可总结出如下结论: SEGMENT和ENDS前面必须有标号,而且在相互配对的段,它们前面要使用相同的标号。对于不同的段定义标号,尽管这些标号可以是任意字串,但为了程序的可读性,应使其有一定的意义。 ASSUME语句可使汇编器知道CS、DS、SS指向哪个段,但它只在汇编时起作用,在运

10、行时CPU并不知道除CS外的其它段地址,所以必须在程序中用指令进行赋值。 格式:ASSUME 段寄存器:段名1,段寄存器:段名2, 首条被执行的语句有一个标号,用以标出这个程序的开始执行处。(在程序的结尾处使用END后跟这个标号)。,除代码段外,其余段可以省略,也可以与代码段共用一个段。 例:CODE SEGMENTASSUME CS:CODE,DS:CODE,ES:CODESTART: 段定义时的参数(可以省略)定位类型组合类型类别,在程序的开始可以用 NAME 或 TITLE 为程序取名字。 格式为: NAME 程序名TITLE 程序名 整个程序的结束使用 END 标出,当汇编器读到 EN

11、D 时,它认为程序到此就结束了。(通常使用END后跟程序开始处的标号。) 注: NAME 、TITLE 操作不是必须的。END 则必不可少。,四、程序开始和结束伪操作:,汇编语言程序格式,标号 指令 寄存器 说明程序或语句 变量 伪指令 标号 的功能宏指令 变量常数表达式,源程序的每条语句可表示为:名字 操作项 操作数 ; 注释,标号/变量:段值、偏移量、类型三种属性表达式:数字表达式 地址表达式,一、名字项,每条语句中的名字项可以是标号,或伪指令定义的对象。 例:START:PUSH DSXOR AX,AXPUSH AXMESS1 DB NO$ ,标号,用来表示一条指令的地址。,变量,用来表

12、示数据的地址。,1、标号标号实际上是用符号表示的地址。标号在代码段中定义,后跟“:”号。是一条指令目标代码所在存储单元的符号地址,表明该指令代码在存储器中的位置,可作为转移指令或CALL指令的操作数,以确定程序转移的目标地址。,2、变量变量是除代码段以外的其他段中的定义,后面不跟“:”号。一般指存放在存储单元中的数据,在程序运行过程中,可随时修改,常以变量名的形式出现在程序中,可作为是存放数据的存储单元的地址。 变量的定义与预置定义变量就是给变量分配存储单元,并且对存储单元赋予一个符号名变量名,同时对这些单元预置初值。,二、操作项可以是指令、伪指令或宏指令的助记符。,操作数项由一个或多个表达式

13、组成,中间用逗号隔开。对于指令,一般给出操作数的地址;对于伪指令或宏指令,则给出所要求的参数。操作数项可以是常数、寄存器、标号、变量或由表达式组成。表达式由操作数和运算符组成。,表达式操作运算符:,(1) 算术操作符: 、 、 、mod,(2) 逻辑和移位操作符: AND、OR、XOR、NOTSHL、SHR,(3) 关系操作符: EQ、NE、LT、LE、GT、GE,(4) 数值回送操作符: OFFSET、SEG、TYPE、LENGTH、SIZE,(5) 属性操作符: PTR、段操作符、SHORT、THIS、HIGH、LOW、HIGHWORD、LOWWORD,例:Title Sample1SHI

14、FT MACROMOV CL,4SHR AL,CLENDM CODE SEGMENTASSUME CS:CODE START:MOV AL,68HSHIFTMOV 2000H,AL CODE ENDSEND START,MOV AL,68H MOV CL,4 SHR AL,CL MOV 2000H,AL,执行,宏指令,1、何为宏?,宏:源程序中一段有独立功能的程序代码。在源程序中定义一次,可多次调用。,汇编语言程序,指令 伪指令(伪操作) 宏指令,宏指令:用户自定义的指令。在编程时,将多次使用的功能用一条宏指令来代替。,在程序中仅需安排一条宏调用指令语句,程序运行时将多条语句展开。 宏调用指令

15、与子程序调用有些相似,但实际上有许多不同。,2、宏的定义和使用,宏指令的使用要经过以下三个步骤:A、宏定义:对各个宏指令进行定义,并分别起一个名字。B、宏调用:在需要使用的地方,通过宏指令名来调用它。C、宏扩展:用宏定义中的指令来代替宏调用中的宏指令名。(汇编时),宏展开:汇编程序把宏调用展开,宏定义: macro_name MACRO 哑元表 ; 形参/虚参LOCAL 标号表 ; 宏定义体ENDM,宏调用: (必须先定义后调用) macro_name 实元表 ; 实参,例:求绝对值宏定义: absol MACRO operLOCAL nextcmp oper,0jge nextneg ope

16、r next: ENDM宏调用: absol var absol bx ,宏展开: 1 cmp var,0 1 jge ?0000 1 neg var 1 ?0000: 1 cmp bx,0 1 jge ?0001 1 neg bx 1 ?0001: ,返回,子程序:在程序执行期间被调用,只占用自身大小的一段空间。宏调用:在汇编期间被展开,每调用一次就把宏定义体展开一次。,4、宏调用与子程序调用的区别:,主程序, call sub1 call sub1 call sub1 ,子程序 sub1,ret,子程序: 优点:模块化,节省内存,可被多次调用,编程效率高。 缺点:额外开销(保存返回地址,计

17、算转向地址,传递参数等)大,增加了执行时间。适于子功能代码较长、调用比较频繁的情况。 宏调用: 优点:参数传送简单,执行效率高。 缺点:不节省空间,适于子功能代码较短、传参较多的情况。,汇编语言程序设计基础,一、程序设计的一般概念为了求解某个问题所必须的完整的指令序列或语句,加上必要的数据称为程序。计算机就是按给定的程序工作的,因此使计算机求解某个问题,必须编写出程序。这种编写程序的过程叫做程序设计。程序是根据解题的计算步骤或操作过程而编写的,而后存放在计算机的存储器中,待计算机执行时,得到结果。,二、程序设计的步骤:,(1) 分析题意,确定算法 根据算法画出程序框图(流程图)把解题的思路和逻

18、辑顺序以图示的方法表示出来。根据框图编写程序分配工作单元和寄存器编写程序代码 (4) 上机调试程序,分支结构 子程序结构,三、程序的基本结构:,复合结构:多种程序结构的组合,顺序结构 循环结构,顺序结构(简单程序),顺序结构是从程序 起始地址开始,顺序执 行各条指令,直到程序 结束,是最简单的程序 结构。从流程图上看, 不含有任何判断框,因 此不会改变指令的执行 顺序。,开始,初始化部分,处理部分,结果处理部分,结束,在很多实际问题中,通常要根据不同的情况,执行不同的程序块或语句,这就需要在设计程序时使用运算后的结果,依据一定的条件进行相应的判断,根据判断结果的真或假,去运行相应的程序或语句。

19、,分支程序设计,单分支程序设计,条件成立跳转,否则顺序执行分支语句体;注意选择正确的条件转移指令和转移目标地址,双分支程序设计,条件成立跳转执行第2个分支语句体,否则顺序执行第1个分支语句体。注意第1个分支体后一定要有一个JMP指令跳到第2个分支体后,多分支程序设计的结构,(1) 逻辑尺控制 (2) 条件控制 (3) 地址跳跃表(值与地址有对应关系的表),图示,多分支结构,循环程序设计,对于程序中多次、有规律执行的部分,我们通常使用循环结构重复运行这些部分,使程序有较高的运行效率和可读性。循环程序允许嵌套,其嵌套深度原则上不受限制,但不允许交叉。如右图,循环结构主要由三部分组成,它们是:,一、

20、循环程序的结构形式:,初 始 化:设置循环的初始状态 循 环 体:循环的工作部分及修改部分控制条件:计数控制特征值控制地址边界控制,DO-WHILE 结构 DO-UNTIL 结构,“先执行,后判断”,“先判断,后执行”,用于循环次数固定,用于循环次数不固定,二、循环程序设计方法,常用的循环程序的设计方法有计数法、寄存器终值法、条件控制法、开关控制法和逻辑控制法等。计数法适用于循环次数固定的情况,有正计数和倒计数两种。寄存器终值法中控制寄存器初值或终值,不是循环次数,每执行一次循环体,该寄存器的值按某种规律进行处理,直到该寄存器的值达到条件退出循环,一般用于循环次数不固定的程序。条件控制法是在循

21、环次数未知的情况下,对控制条件比较,若满足要求则退出循环,否则继续循环。,计数控制循环,计数控制循环利用循环次数作为控制条件 易于采用循环指令LOOP和JCXZ实现 初始化:将循环次数或最大循环次数置入CX 循环体 循环控制:用LOOP指令对CX减1、并判断是否为0,计数控制循环 先循环后判断,条件控制循环,条件控制循环需要利用特定条件判断循环是否结束. 条件控制循环用条件转移指令判断循环条件. 转移指令可以指定目的标号来改变程序的运行顺序,如果目的标号指向一个重复执行的语句体的开始或结束,便构成了循环控制结构.,三、多重循环程序设计,在一个循环程序中循环体内还包含一个或多个循环结构,称为多重

22、循环程序。其设计方法与单循环程序是一致的。 注意: A、分清各重循环的控制条件及其程序实现,相互之间不能混淆。 B、从外循环再次进入内循环时,初始条件必须重新设置。,子程序结构, 过程定义伪操作 子程序的调用与返回 保存与恢复寄存器 子程序的参数传送 子程序的嵌套与递归,若在一个程序中或多个程序中多处用到同一个程序段(这些程序段的功能、结构相同,只是某些变量赋值不同),那么就可以把这段程序单独存放,每当需要执行这段程序时,就可以调用该程序段,执行完后再返回原来的程序去继续执行。这段被单独存放且具有特定功能的程序段,称为子程序或过程。,子程序,调用子程序的程序称为主程序或调用程序。主程序向子程序

23、转移的过程叫子程序调用或过程调用。(转子)CALL子程序执行后返回主程序的过程称为子程序返回或过程返回。(返主)RET 子程序是模块化程序设计的重要组成部分。,在编制程序时,应尽可能采用循环程序或子程序,是提高程序效率,节省存储空间的重要手段;但在采用子程序时,由于在主程序中增加了CALL指令以及子程序中增加RET指令,从而使程序的执行时间有所增加。因此,子程序是以降低一定的程序运行速度为代价的。,一. 过程定义伪操作,子程序的设计方法,1、子程序的定义(先定义,后使用),2、子程序的调用CODE SEGMENT.CALL 子程序名.CODE ENDS调用指令CALL的使用,子程序调用:隐含使

24、用堆栈保存返回地址(断点)call near ptr subp (1) 保存返回地址(2) 转子程序call far ptr subp (1) 保存返回地址(2) 转子程序子程序返回:ret,二. 子程序的调用与返回,子程序的特点A、子程序是一些通用的计算、处理程序。B、执行子程序之前,需主程序给它提供原始数据。C、子程序得到的结果,再提供给主程序使用。子程序设计与应用时应注意的问题:,1、通过寄存器传送变量是最常用的一种方式,使用方便,但是参数多时不能采用此方法。具体方法是将子程序的输入参数由主程序放入规定的寄存器带入子程序中。执行子程序后的结果也存入规定的寄存器带回主程序。采用此方法时,主

25、程序和子程序必须按约定在指定的寄存器中取出或存入指定参数。(不需保存),三、子程序的变量传送(参数传递),2、通过存储器传送变量是在内存中使用一个存储区来保存和传送主、子程序间的参数。具体操作:主程序在调用子程序前,将所有输入参数按约定好的次序存入存储区,进入子程序后,按约定从存储区中取出输入参数进行处理,所得输出参数也按约定的次序存入存储区。返回主程序后,就可得到结果。,3、通过堆栈传送变量利用堆栈不仅可以保存返回地址,而且可以存放主程序和子程序间的传递参数,这些参数可以是数据,也可以是地址。具体方法是在调用子程序之前,用PUSH指令将输入参数压入堆栈,在子程序中通过出栈方式依次获得这些参数

26、。经过子程序处理后,再将输出参数压入堆栈,返回主程序后再通过出栈获得结果。 注意:堆栈中断点与现场的保存与恢复。,一、子程序的嵌套:主程序 子程序A 子程序B,嵌套与递归子程序,二、递归子程序在子程序嵌套的情况下,若一个子程序调用的子程序是其本身,称为子程序的递归调用,此子程序称为递归子程序。它往往能设计出效率较高的程序,可完成相当复杂的计算。,例:计算 N!,程序要点:以3!为例A、每个递归程序都有一个出口。B、并非先计算5*4,再计算5*4*3,;而是在子程序返回时,在上层计算1*2,再计算1*2*3,。C、递归调用时,要将传递的参数,返回地址等压入堆栈。对堆栈的使用应特别注意,如是否溢出

27、等问题。,frame strucsave_bp dw ?save_cs_ip dw 2 dup(?)n dw ?result_addr dw ? frame endsdata segmentn_v dw 3result dw ? data endsstack segmentdw 128 dup (?)tos label word stack ends,code segment main proc farassume cs:code, ds:data, ss:stack start:mov ax, stackmov ss, axmov sp, offset tospush dssub ax, a

28、xpush axmov ax, datamov ds, axmov bx, offset resultpush bxmov bx, n_vpush bxcall far ptr factret main endp code ends,code1 segmentassume cs:code1 fact proc farpush bpmov bp, sppush bxpush axmov bx, bp.result_addrmov ax, bp.ncmp ax, 0je donepush bxdec axpush axcall far ptr factmov bx, bp.result_addrm

29、ov ax, bxmul bp.njmp short return done: mov ax,1 return:mov bx, axpop axpop bxpop bpret 4 fact endp code1 ends,fact proc nearpush axpush bpmov bp, spmov ax, bp+6cmp ax, 0jne fact1inc axjmp exit fact1: dec axpush axcall factpop axmul word ptrbp+6 exit: mov bp+6, axpop bppop axret fact endp,例:计算n!,4.2

30、.7 DOS系统功能调用和ROM BIOS中断调用,5.5 输入/输出与中断控制,一、概述 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保存中断向量 ( 35

31、H功能 ) 7设置中断向量 ( 25H功能 ),一、概述 1BIOS 和 DOS 中断子程层次特点 2. 中断类型分类 3. 调用方法,1BIOS和DOS中断子程层次特点,层次特点:ROM BIOS中的中断子程使用IN/OUT指令直接控制外设,实现与外设之间的输入/输出操作,以软件形式向其上层提供服务。IO.SYS中的中断子程 ( 称基本输入/输出BIOS模块)调用ROM BIOS的基本I/O功能,向 MSDOS.SYS提供设备驱动服务。,MSDOS.SYS中的中断子程 ( 称DOS内核模块 ) 调用IO.SYS,实现对外设的控制。 与标准外设有两层隔离 : IO.SYS和ROM BIOS。其

32、中21H类型的中断子程 提供了丰富的系统服务, 称21类型的中断调用 为DOS系统(功能)调用。,2. 中断类型分类向量表中的中断类型分为七类: 处理CPU特殊操作( 除0、溢出 )的00H、04H类型。 为DEBUG调试程序设置的单步( 01H )、断点( 03H )类型。 处理CPU的NMI引脚信号的02H类型。非屏蔽硬中断子程 处理CPU的INTR引脚信号的080FH类型。可屏蔽类型硬中断子程 用INT指令调用的中断子程 BIOS功能调用(如101AH) DOS功能调用 (如 21H),3. 调用方法,例1 单字符显示功能调用 MOV DL, A ;设置入口参数 MOV AH, 02H

33、;设置功能号 INT 21H ;执行中断调用 例2 单字符输入功能调用 MOV AH, 01H ;设置功能号 INT 21H ;执行中断调用 CMP AL, 0DH ;分析、应用出口参数 JZ exit 、,二、BIOS功能调用基本输入/输出模块BIOS: 实现对输入/输出设备的控制, 内含0 1CH 等类型中断子程, 包括显示器、磁盘、键盘、打印机等标准外设的驱动程序。(参看中断类型分配表)BIOS功能调用指对BIOS模块中的中断子程的调用。,1设置显示方式,入口参数 AL = 显示方式值00 4025 黑白文本方式 01 4025 彩色文本方式 02 8025 黑白文本方式 03 8025

34、 彩色文本方式 04 320320 彩色图形方式 功能号 AH = 00H 类型号 10H 出口参数 无 实现功能 将显示方式设置为指定形式,例 将显示方式设置为 8025 彩色文本方式MOV AL, 03HMOV AH, 00INT 10H,入口参数 AL = 0CH = 窗口左上角行号CL =窗口左上角列号DH = 窗口右下角行号DL =窗口右下角列号 BH = 窗口属性 功能号 AH = 06H 或 AH = 07H 类型号 10H 出口参数 无 实现功能 按给定属性清除指定的窗口内容,例 清除屏幕显示,将其属性置为反白(白底黑字)显示。MOV AL, 0 ;清屏功能 MOV BH, 7

35、0H ;白底黑字 MOV CH, 0 ;左上角 行号 MOV CL, 0 ;左上角 列号 MOV DH, 24 ;右下角 行号 MOV DL, 79 ;右下角 列号 MOV AH, 6 ;功能号 INT 10H ;中断调用,3. 置光标位置光标控制开始显示的位置,计算机有专门的硬件控制光标的显示大小、位置。光标只在文本方式中出现,在图形方式下光标消失。,置光标位置入口参数 DH = 行号DL = 列号BH = 页号功能号 AH= 02H类型号 10H出口参数 无 实现功能 将光标设置在指定的位置,例 将光标设置在2行5列的位置 MOV DH, 2 MOV DL, 5 MOV BH, 0 MOV

36、 AH, 2 INT 10H,三、DOS系统功能调用,为了编写汇编语言程序提供方便,DOS系统中设置了几十个内部子程序,可以完成I/O设备管理、存储管理、文件管理和作业管理等功能。相当于几十个中断服务程序,它们的入口已由系统置入中断入口地址表中,在汇编语言中可以用软中断指令调用它们。(INT N),中断类型号,最常用的是“INT 21H”,系统功能调用。它本身包含了80多个程序,每个子程序对应一个功能号,其编号为00H57H。而INT 21H是进入各功能调用子程序的总入口,再通过功能号进入各个子程序。调用这些子程序时采用统一格式,由三条语句组成:A、传送入口参数到指定寄存器。B、功能号送到AH

37、寄存器C、INT 21H,针对有的没有入口参数,只需后两句即可。,子程序执行完后,按规定取出口参数,INT 21H 系统功能调用,DOS系统功能调用 (21H类型中断调用) 1显示单字符 ( 02H功能 ) 2显示字符串 ( 09H功能 ) 3单字符输入 ( 01H、07H、08H功能 ) 4字符串输入 ( 0AH功能 ) 5检测键盘状态 ( 0BH功能 ) 6保存中断向量 ( 35H功能 ) 7设置中断向量 ( 25H功能 ),1. 显示单字符 ( 02H功能 )入口参数 DL = 要显示字符的ASCII 码 功能号 AH=02H 类型号 INT 21H 出口参数 无 实现功能 显示指定字符

38、,光标随动。,例 显示字符AMOV DL, AMOV AH, 02HINT 21H,2. 显示字符串 ( 09H功能 ) 入口参数 定义要显示的字符串,字符串尾应为$,作为结束显示的标志。DS : DX = 字符串的首地址 功能号 AH = 09 H 类型号 21H 出口参数 无 实现功能 显示字符串,遇 $ 停止显示,光标随动。,例 编程显示字符串 How Do You Do!,data SEGMENT ;定义显示的子符串 stri DB How Do You Do!, $ data ENDS code SEGMENTASSUME CS:code, DS:data start: MOV AX

39、, data ;置缓冲区地址于DS:DX MOV DS, AX LEA DX, stri MOV AH, 09H ;调显示功能INT 21HMOV AH, 4CH ;返回DOSINT 21H code ENDS END start,3. 单字符输入 ( 01H、07H、08H功能) 入口参数 无 功能号 AH = 01H类型号 21H出口参数 AL = 键入字符的ASCII码实现功能 等待从键盘输入一个字符,并在屏幕上回显,光标移动,检测Ctrl-Break键,例 利用键盘输入的字符产生分支:MOV AH, 1 ;等待从键盘输入INT 21HCMP AL, Y ;是Y?JZ yesCMP AL

40、, y ;是y? JZ yesno: . . . . . .JMP exityes: . . . . . . exit: . . .,从键盘输入字符串到特定内存区中。因此须先定义一个缓冲区,缓冲区的第一个字节存放字符个数,第二个字节保留,用以存放实际输入的字符个数,从第三个字节开始存放从键盘输入的字符串。,4. 字符串输入 ( 0AH 功能 ),入口参数 DS : DX = 缓冲区的首地址( DS :DX ) = 限制最多输入的字符数 功能号 AH = 0AH类型号 21H出口参数 ( DS : DX+1 ) = 实际键入的字符(不含回车符)从( DS : DX+2 )开始顺序存放键入的字符串

41、,回车符0DH为串尾最后一字符。实现功能 等待从键盘输入字符串,并存入设定的缓冲区内,同时回显字符串,光标随着移动,回车符使光标回到行首。 注意事项:应按要求先定义缓冲区,再调用。,例 应用0AH功能输入字符串。,data SEGMENT ;定义缓冲区 max DB 11 ;定义限制最多输入个数 lenth DB ? ;用于存放实际输入个数 stri DB 11 DUP(?) ;用于存放输入的字符串 data ENDS code SEGMENTASSUME CS:code, DS:data start: MOV AX , data ;置缓冲区地址于DS:DX MOV DS , AX LEA D

42、X , max MOV AH , 0AH INT 21H ;调0A输入功能MOX CH , 0 MOV CL , lenth ;取字符串长度放CX中LEA BX , stri ;取字符串首址于BX中 MOV AL , BX ;应用输入字符、 code ENDS,data SEGMENT ;定义缓冲区 max DB 11 ;定义限制最多输入个数 lenth DB ? ;用于存放实际输入个数 stri DB 11 DUP(?) ;用于存放输入的字符串 data ENDS从键盘输入ABCD, 回车,内存的存放结果:,D:MASMDEBUG TEST0a.exe ;装入执行文件 -U ;反汇编程序 1

43、29E: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. -,5检测键盘状态 ( 0BH功能 ) 入口参数 无 功能号 AH= 0BH 类型号 21H 出口参数 AL= FFH , 表示有键按下。AL= 0 , 表示无键按下。 实现功能 检测键盘状态(通过检测键盘缓冲区实现),

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 往来文书

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报