收藏 分享(赏)

汇编语言程序设计(第二版)第五章.ppt

上传人:Facebook 文档编号:3428647 上传时间:2018-10-27 格式:PPT 页数:99 大小:859.50KB
下载 相关 举报
汇编语言程序设计(第二版)第五章.ppt_第1页
第1页 / 共99页
汇编语言程序设计(第二版)第五章.ppt_第2页
第2页 / 共99页
汇编语言程序设计(第二版)第五章.ppt_第3页
第3页 / 共99页
汇编语言程序设计(第二版)第五章.ppt_第4页
第4页 / 共99页
汇编语言程序设计(第二版)第五章.ppt_第5页
第5页 / 共99页
点击查看更多>>
资源描述

1、第 5 章,教学重点,在掌握基本的汇编语言程序设计方法之后,进一步学习如何提高编程效率的各种实用方法: 高级语言特性 宏结构 模块化,5.1 高级语言特性,MASM 6.0引入高级语言的程序设计特性 条件控制伪指令 .IF .ELSE .ENDIF 循环控制伪指令 .WHILE .ENDW .REPEAT .UNTIL 过程声明和过程调用伪指令 .PROTO .INVOKE,5.1.1 条件控制伪指令,类似高级语言中IF、THEN、ELSE和ENDIF的相应功能 在汇编时要展开,自动生成相应的比较和条件转移指令序列,实现程序分支,.IF 条件表达式 ;条件为真(值为非0)分支体 ;执行分支体

2、.ELSE ;前面IF条件为假分支体 ;执行分支体 .ENDIF ;分支结束,条件,条件表达式中的操作符,;单分支结构.IF AX 0neg ax.ENDIFmov result,ax ;双分支结构.IF ax=5mov bx,axmov ax,0.ELSEdec ax.ENDIF,;双分支结构.IF ax=5 * cmp ax,05h * jne C0001mov bx,axmov ax,0.ELSE * jmp C0003 *C0001: dec ax.ENDIF *C0003:,例题,.data _a sbyte ? _b sbyte ? _c sbyte ? tag byte ?.co

3、de.startupmov al,_bimul almov bx,ax ;bx中为b2mov al,_aimul _cmov cx,4imul cx ;ax中为4ac,例5.11/2,.if sword ptr bx = ax ;比较二者大小mov tag,1;第一分支体:条件满足,tag1.elsemov tag,0;第二分支体:条件不满足,tag0.endif.exit 0,例5.12/2,5.1.2 循环控制伪指令,WHILE结构的循环控制伪指令.WHILE 条件表达式 ;条件为真循环体 ;执行循环体.ENDW ;循环体结束 UNTIL结构的循环控制伪指令.REPEAT ;重复执行循环体

4、循环体.UNTIL 条件表达式 ;直到条件为真,WHILE循环结构的流程图,UNTIL循环结构的流程图,;WHILE结构xor ax, axmov cx,100.while cx!=0add ax,cxdec cx.endwmov sum,ax,求1100之和,;UNTIL结构xor ax, axmov cx,100.repeatadd ax,cxdec cx.until cx=0mov sum,ax,mov cx,100xor ax,axlea bx,array.repeat.if sword ptr bx = 0add ax,bx.else.break.endifinc bxinc bx.

5、untilcxzmov result,ax,例5.2,要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐 应该采用过程调用伪指令INVOKE 使用INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明,5.1.3 过程声明和过程调用伪指令,过程名 PROC 调用距离 语言类型 作用范围 USES 寄存器列表, 参数:类型LOCAL 参数表 ;汇编语言语句 过程名 ENDP,过程声明伪指令:用于事先声明过程的结构 过程名 PROTO 调用距离 语言类型, 参数:类型 过程调用伪指令INVOKE 过程名,参数,.,如何调用,;汇编语言程序:lt503.asm.model sma

6、ll checksumd PROTO c,:word,:word ;声明过程.stack.data array db 12h,25h,0f0h,0a3h,3db 68h,71h,0cah,0ffh,90h count equ $-array ;数组的元素个数result db ? ;校验和.code.startupINVOKE checksumd,count,offset array ;调用过程mov result,al ;保存校验和.exit 0,例5.31/2,列表文件,checksumd PROC c USES bx cx,countp:word,arrayp:wordmov bx,ar

7、rayp ;BX数组的偏移地址mov cx,countp ;CX数组的元素个数xor al,al sumd: add al,bx ;求和:ALAL+DS:BXinc bxloop sumdret checksumd endpend,例5.32/2,列表文件,;lt503.asm的列表文件(lt503.lst). INVOKE checksumd,count,offset array* mov ax,word ptr OFFSET array* push ax* mov ax,+000Ah* push ax* call checksumd* add sp,04hmov result,al.,例5

8、.31/2,checksumd PROC c USES bx cx,countp:word,arrayp:word* push bp ;起始代码* mov bp,sp* push bx ;保护bx和cx* push cxmov bx,arrayp ;arrayp=BP+6mov cx,countp ;countp=BP+4.ret* pop cx ;结尾代码* pop bx* pop bp* ret 0000h checksumc endp,例5.32/2,5.2 宏结构程序设计,宏汇编重复汇编条件汇编统称宏结构,宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程

9、序的方法,宏具有宏名的一段汇编语句序列 宏定义时书写 宏指令这段汇编语句序列的缩写 宏调用时书写 宏展开宏指令处用这段宏代替的过程 宏汇编时实现 宏的参数功能强大,颇具特色 配合宏,还有宏操作符和有关伪指令,5.2.1 宏汇编,宏定义,宏名 macro 形参表宏定义体endm,mainbegin MACRO ;定义名为mainbegin的宏,无参数mov ax,data ;宏定义体mov ds,axENDM ;宏定义结束 mainend MACRO retnum ;带有形参retnummov al,retnum ;宏定义中使用参数mov ah,4chint 21hENDM,宏注释符,宏调用,宏

10、名 实参表,start: mainbegin ;宏调用,建立DS内容dispmsg string ;宏调用,显示字符串mainend 0 ;宏调用,返回DOSend start宏调用的实质是在汇编过程中进行宏展开宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体取代源程序的宏指令,同时用位置匹配的实参对形参进行取代,宏展开,宏展开在汇编时,用宏定义体的代码序列替代宏指令的过程。,start: mainbegin ;宏指令1 mov ax,data ;宏展开1 mov ds,axmainend 0 ;宏指令1 mov al,0 ;宏展开1 mov ah,4ch1

11、int 21h,宏的参数,宏的参数使用非常灵活,宏定义时, 可以无参数,例如5.4a的mainbegin 可以带有一个参数,例如5.4a的mainend 也可以具有多个参数;例如5.5a的shlext 参数可以是常数、变量、存储单元、指令(操作码)或它们的一部分,也可以是表达式;例如5.5b的shift和shrot 宏定义体可以是任何合法的汇编语句,既可以是硬指令序列,又可以是伪指令序列;例如5.6的dstring,;宏定义 shlext macro shloprand,shlnumpush cxmov cl,shlnum shl shloprand,clpop cxendm ;宏指令shle

12、xt ax,6 ;宏展开1 push cx1 mov cl,061 shl ax,cl1 pop cx,例5.5a,;统一4条移位指令的宏指令 shift macro soprand,snum,sopcodepush cxmov cl,snums&sopcode& soprand,clpop cxendm ;统一移位和循环移位8条指令的宏指令 shrot macro sroprand,srnum,sropcodepush cxmov cl,srnumsropcode sroprand,clpop cxendm,例5.5b,替换操作符,;宏定义 dstring macro stringdb &s

13、tring&,0dh,0ah,$endm ;宏调用 dstring dstring ;宏展开1 db This is a example., 0dh,0ah,$1 db 0 Number 10, 0dh,0ah, $,例5.6,转义注释符,传递注释符,宏操作符,;宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现 &替换操作符,用于将参数与其他字符分开。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符,宏操作符,字符串传递操作符,用于括起字符串。在宏调用中,如果传递的字符串实参数含有逗号、空格等间隔符号,则必须用这对操作符,以保证字符

14、串的完整 !转义操作符,用于指示其后的一个字符作为一般字符,不含特殊意义 %表达式操作符,用在宏调用中,表示将后跟的一个表达式的值作为实参,而不是将表达式本身作为参数,与宏有关的伪指令,局部标号伪指令 LOCAL 标号列表 宏定义体采用了标号,应使用LOCAL加以说明 它必须是宏定义MACRO语句之后的第一条语句 宏定义删除伪指令 PURGE 宏名表 不需要某个宏定义时,可以把它删除 宏定义退出伪指令 EXITM 伪指令EXITM表示结束当前宏调用的展开,;宏定义 absol macro oprdlocal nextcmp oprd,0jge nextneg oprd next:endm,例5

15、.7,;宏调用absol word ptr bxabsol bx ;宏展开1 cmp word ptr bx,01 jge ?00001 neg word ptr bx1 ?0000:1 cmp bx,01 jge ?00011 neg bx1 ?0001:,比较,仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序,执行速度没有改变通过形参、实参结合实现参数传递,简捷直观、灵活多变,还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢需要利用寄存器、存储单元或堆栈等传递参数,宏,子程序,宏与子程序具有各自的特

16、点,程序员应该根据具体问题选择使用那种方法通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序,比较 结论,宏,子程序,5.2.2 重复汇编,重复汇编指在汇编过程中,重复展开一段(基本)相同的语句 重复汇编没有名字,不能被调用 重复汇编常用在宏定义体中,也可以在一般汇编语句中使用 重复汇编伪指令有三个: REPEAT按参数值重复 FOR按参数个数重复 FORC按参数的字符个数重复 最后,用ENDM结束,按参数值重复,REPEAT 重复次数重复体 ENDM,char = A REPEAT 26db charchar = char +1 ENDM,1 db c

17、har ;等效于db A1 char = char +11 db char ;等效于db B1 char = char +1.1 db char ;等效于db Z1 char = char +1,按参数个数重复,FOR 形参,实参表重复体 ENDM,FOR regad, push regad ENDM,1 push ax1 push bx1 push cx1 push dx,按参数字符个数重复,FORC 形参, 字符串重复体 ENDM,FORC regad,dcbapop ®ad&x ENDM,1 pop dx1 pop cx1 pop bx1 pop ax,5.2.3 条件汇编,条件汇

18、编伪指令在汇编过程中,根据条件决定汇编的语句 IFxx 表达式 ;满足,汇编分支语句体1分支语句体1 ELSE ;不满足,汇编分支语句体2分支语句体2 ENDIF ;条件汇编结束,pdata macro numIF num lt 100 ;如果num 100,则汇编如下语句db num dup (?)ELSE ;否则,汇编如下语句db 100 dup (?)ENDIFendmpdata 12 ;宏调用db 12 dup(?) ;宏汇编结果pdata 102 ;宏调用db 100 dup(?) ;宏汇编结果,例5.10,宏 结 构 的 作 用,宏汇编、重复汇编和条件汇编为源程序的编写提供了很多方

19、便,灵活运用它们可以编写出非常良好的源程序来汇编系统中有些以圆点起始的伪指令(如.startup、.exit等)实际上是一种宏结构,dstring MACRO string ;定义字符串db 设置数据段地址mov ax,dssegmov ds,axENDM dispmsg MACRO messagemov dx,offset messagemov ah,09hint 21hENDM,例题5.41/3,mainend MACRO retnum ;返回DOS,可不带参数ifb mov ah,4ch ;没有参数elsemov ax,4c00h+(retnum AND 0ffh); 有参数endifi

20、nt 21hENDM,例题5.42/3,.model small.stack 256.data msg1 equ this byte dstring msg2 equ this byte dstring .code start: mainbegin data ;建立DS内容dispmsg msg1 ;显示msg1字符串dispmsg msg2 ;显示msg2字符串mainend ;返回DOSend start,例题5.43/3,将程序分段、采用子程序或宏结构都是进行模块化程序设计 介绍开发大型程序时采用的方法: 源程序文件的包含 目标模块连接 子程序库,5.3 模块化程序设计,例题 5.12

21、将键盘输入的数据按升序输出,把源程序分放在几个文本文件中,在汇编时通过包含伪指令INCLUDE结合成一体 INCLUDE 文件名 可将常用的子程序形成.ASM汇编语言源文件 可将常用的宏定义存放在.MAC宏库文件中 可将常量定义、声明语句组织在.INC包含文件中 例5.12a 宏库文件 lt512a.mac 主程序文件 lt512a.asm 子程序文件 sub512a.asm,5.3.1 源程序文件的包含,dispchar macro char ;显示char字符mov dl,charmov ah,2int 21hendm dispmsg macro message ;显示message字符串

22、mov dx,offset messagemov ah,9int 21hendm,Lt512a.mac,include lt512a.mac.dispmsg msg1 ;提示输入数据mov bx,offset bufcall input ;数据输入cmp cx,0je start4 ;没有输入数据则退出mov count,cx. ;显示输入的数据. ;数据排序. ;显示经排序后的数据 start4: .exit 0include sub512a.asmend,Lt512a.asm,子程序源文件有3个子程序 ALdisp ;显示2位16进制数子程序(例4.10) sorting ;排序子程序(例

23、4.8) input ;键盘输入子程序 还包含一个宏 convert ;将DX两位ASCII码转换为两位16进制数,sub512a.asm,让我们重点分析键盘输入子程序 input,;键盘输入子程序 ;入口参数:ds:bx=存放数据的缓冲区 ;出口参数:cx=数据个数 input procpush axpush dxxor cx,cx ;数据个数清0 input01: xor dx,dx ;输入字符清0 input02: mov ah,1 ;键盘输入一个字符int 21h,input之一,input10: cmp al,0dhje input30 ;是回车,结束整个数据的输入cmp al, j

24、e input20 ;是空格和逗号,确认输入了一个数据cmp al,je input20cmp al,08hje input17 ;是退格,丢弃本次输入的数据,出错,input之二,cmp al,0 ;有效数字判断(图5.2b)jb input17 ;小于0,不是有效数字,出错cmp al,fja input17 ;大于f,不是有效数字cmp al,ajb input11sub al,20h ;af转换成大写AFjmp input12 input11: cmp al,Fja input17 ;字符小于a、大于F,出错cmp al,Ajae input12 ;是AF,有效字符cmp al,9ja

25、 input17 ;是09,有效字符,input之三,input12: cmp dl,0 ;有效字符的处理jne input13mov dl,al ;dl=0,输入了一个数据的低位,则dlaljmp input02 ;转到字符输入 input13: cmp dh,0jne input17 ;dl0,dh0输入3位数据,出错mov dh,dl ;dl0,dh0输入了一个数据的高位mov dl,al ;dhdl,dlaljmp input02 ;转到字符输入,input之四,input17: mov dl,7 ;输入错误处理mov ah,2int 21hmov dl,?mov ah,2int 21

26、hjmp input01 ;转到输入一个数据,input之五,;转换正确的输入数据(图5.2c) input20: convertjmp input01 ;转到输入一个数据 input30: convertpop dxpop axret ;返回,出口参数已设定 input endp,input之六,;将DX两位ASCII码转换为两位16进制数(图5.2c) convert macrolocal input21,input22local input24,input25cmp dl,0;dl=0,没有要转换的数据,退出je input25,convert之一,cmp dl,9jbe input21

27、sub dl,7 ;字符AF,则减7 input21: and dl,0fh ;转换低位cmp dh,0 ;dh=0,没有高位数据je input24cmp dh,9jbe input22sub dh,7 input22: shl dh,1shl dh,1shl dh,1shl dh,1 ;转换高位or dl,dh ;合并高、低位,convert之二,源文件包含的操作步骤: 分别编辑生成各个文件 汇编、连接主程序文件,input24: mov bx,dl ;存入缓冲区inc bxinc cx ;数据加1 input25:endm,convert之三,把常用子程序写成独立的源程序文件,单独汇编,

28、形成子程序的目标文件.OBJ 主程序也经过独立汇编之后形成目标文件 连接程序将所有目标文件连接起来,最终产生可执行文件 需要遵循的原则: 声明共用的变量、过程等 实现正确的段组合 处理好参数传递问题,5.3.2 目标代码文件的连接,声明共用的变量、过程,各个模块间共用的变量、过程等要说明 PUBLIC 标识符 ,标识符.;定义标识符的模块使用 EXTERN 标识符:类型 ,标识符:类型.;调用标识符的模块使用 标识符是变量名、过程名等 类型是byte / word / dword(变量)或near / far(过程) 在一个源程序中,public/extern语句可以有多条 各模块间的publ

29、ic/extern伪指令要互相配对,并且指明的类型互相一致,实现正确的段组合,子程序文件必须定义在代码段中,也可以具有局部的数据变量 采用简化段定义格式,只要采用相同的存储模式,容易实现正确的近或远调用 完整段定义格式中,为了实现模块间的段内近调用(near类型),各自定义的段名、类别必须相同,组合类型都是public。实际的程序开发中,各个模块往往由不同的程序员完成,不易实现段同名或类别相同,所以索性定义成远调用(far类型) 定义数据段时,同样也要注意这个问题。当各个模块的数据段不同时,要正确设置数据段DS寄存器的段基地址,处理好参数传递问题,少量参数可用寄存器或堆栈直接传送数据本身 大量

30、数据可以安排在缓冲区,用寄存器或堆栈传送数据的存储地址 还可利用变量传递参数,但是要采用public/extern声明为公共(全局)变量 这些也是子程序间的参数传递方法 另外,第7章混合编程介绍了更好的堆栈传递参数方法,可以采用,例5.12b,主程序lt512b.asm并入宏定义 子程序文件sub512b.asm,要加上段定义语句、声明语句等,但不需要起始点和结束点,模块连接的操作步骤: 分别编辑生成各个文件 分别汇编各个文件 连接各个目标文件,形成可执行文件,. ;宏定义.codepublic count ;定义count共用extern ALdisp:near,sorting:near,i

31、nput:far;声明其他模块中的子程序.startup.exit 0;去掉(lt512a.asm中的)包含语句end,Lt512b.asm,.model small ;定义同样的存储模式extern count:word;在其他模块定义了字变量count.code ;子程序在代码段中public aldisp,sorting,input;3个子程序是共用的 Aldisp proc ;仍然作为近调用 sorting proc ;仍然作为近调用 input proc far ;修改为远调用.mov count,cx ;提供出口参数. input endpend ;结束汇编,sub512b.asm

32、,把常用子程序写成独立的源文件,单独汇编形成OBJ文件后,存入子程序库 主程序也单独汇编形成OBJ文件 主程序连接时,调入子程序库中的子程序模块,产生最终的可执行文件 例5.12c 主程序文件 lt512c.asm 子程序文件 sub512c1.asm 子程序文件 sub512c2.asm 子程序文件 sub512c3.asm,5.3.3 子程序库的调入,子程序库,子程序库文件(.LIB)是子程序模块的集合,其中存放着各子程序的名称、目标代码及有关定位信息 存入库的子程序的编写与目标文件连接方法中的要求一样,只是为方便调用,更加严格 子程序文件编写完成后,汇编形成目标文件;然后利用库管理工具程

33、序LIB.EXE,把子程序目标模块逐一加入到库中LIB 库文件名 + 子程序目标文件名 库管理程序LIB帮助创建、组织和维护子程序模块库,例如增加、删除、替换、合并库文件等,. ;宏定义 .code extern ALdisp:near,sorting:near,input:near;声明其他模块中的子程序 .startup . .exit 0 end,Lt512c.asm,.model small.codepublic aldisp Aldisp proc. Aldisp endpend,sub512c1.asm,.model small.codepublic sorting sorting

34、 proc. sorting endpend,sub512c2.asm,.model small.codepublic input input proc. input endpend,sub512c3.asm,库文件调入的操作步骤: 分别编辑生成各个文件 分别汇编各个文件 用库管理文件,将子程序模块添加 到库文件(.LIB)中 连接主程序,提供库文件,形成可执行文件,补充例题,将子程序应用的例题4.134.15的子程序编写成模块,供主程序调用 实现功能:从键盘输入有符号十进制数,求它们的平均值,然后输出 源程序文件进行简单修改 主程序文件 子程序文件 利用目标代码文件的连接形成可执行文件,.m

35、odel small extern read:near,write:near,mean:near;外部子程序public wtemp ;变量共用.stack.data ;数据定义.code ;输入、计算和输出end,主程序文件,.model smallpublic read,write,mean ;子程序共用extern wtemp:word ;外部变量.code ;代码段 read proc ;输入子程序read write proc ;输出子程序write mean proc ;计算平均值子程序meanend,子程序文件,5.4 输入输出程序设计,输入指令IN从外设读取数据 输出OUT指令

36、向外设提供数据 处理器通过I/O接口控制外设,参考I/O指令 第2.1.5节,建议结合硬件相关课程学习,5.4.1 程序直接控制输入输出,程序执行IN或OUT指令实现数据传送,.model tiny ;形成com格式的程序.code.startupcall speaker_on ;打开扬声器声音mov ah,1 ;等待按键int 21hcall speaker_off ;关闭扬声器声音.exit 0,例5.13:主程序,speaker_on proc ;扬声器开子程序push axin al,61h ;读取原来控制信息or al,03h ;D1D0=PB1PB0=11bout 61h,al ;

37、直接控制发声pop axret speaker_on endp,例5.13:子程序,扬声器关,5.4.2 程序查询输入输出,程序需要查询外设状态,然后进行数据交换 实际的输入输出程序可以规定一个超时参数 打印机查询输出的控制: 要打印的字符首先提供给数据端口 然后查询状态端口,确定打印机是否可以接受 如果打印机还没有准备好接受数据,则继续检测一个固定时间 如果打印机能够接受数据,处理器利用控制端口将数据提供给打印机,mov cx,(sizeof okmsg)-1mov si,offset okmsg prnbegin: mov dx,378h ;打印机基地址mov bx,100 ;超时参数mo

38、v al,si ;打印字符call printchar ;调用打印子程序jc prnerr ;CF=1,不能打印inc si ;CF=0,打印正常loop prnbegin ;继续mov dx,offset okmsg ;显示正确jmp prnok prnerr: mov dx,offset errmsg ;显示错误 prnok: mov ah,9int 21h,例5.14:主程序,printchar procpush cxout dx,al ;向数据端口输出打印字符inc dx ;基地址加1成为状态端口 print0: sub cx,cx print1: in al,dx ;查询状态端口te

39、st al,80h ;最高位D7反映打印机状态jnz print2 ;D7=1,可以接收打印数据loop print1 ;D7=0,不能接收打印数据dec bl ;超时参数减1jnz print0 ;循环检测stc ;规定时间内没有准备好jmp print3 ;退出打印,例5.14:打印子程序1/2,print2: inc dx ;基地址再加1成为控制端口mov al,0dh ;使最低位D0=1out dx,alnop ;延时mov al,0ch ;使最低位D0=0out dx,al;产生选通脉冲,将打印字符送入打印机clc ;设置正常标志CF=0 print3: pop cxret ;返回

40、printchar endp,例5.14:打印子程序2/2,5.4.3 中断服务程序,需要交换数据的外设,采用中断请求向处理器提出要求 处理器执行事先设计好的中断服务程序,在中断服务程序当中实现数据交换 8086可以处理256种中断,分为内部、外部两种类型 外部可屏蔽中断用于与外设进行数据交换,1. 内部中断服务程序,主程序通过中断调用指令INT n执行内部中断服务程序,其实质相当于子程序调用 编写内部中断服务程序与编写子程序雷同 利用过程定义伪指令PROC / ENDP 但通常要执行STI指令开放可屏蔽中断 最后执行IRET指令返回调用程序 内部中断服务程序常用寄存器传递参数 设置中断向量:

41、AH25H(INT 21H) 获取中断向量:AH35H(INT 21H),.data intoff dw ? ;保存原偏移地址 intseg dw ? ;保存原段地址.codemov ax,3580h ;获取中断80H的中断向量int 21hmov intoff,bx ;保存偏移地址mov intseg,es ;保存段基地址,例5.15a:1/5,获取中断向量:AH35H(INT 21H)入口参数:AL中断向量号出口参数:ES:BX中断服务程序的入口地址(段基地址:偏移地址),push dsmov dx,offset newint80hmov ax,seg newint80hmov ds,ax

42、mov ax,2580h ;设置中断80H的入口地址int 21hpop ds,例5.15a:2/5,设置中断向量:AH25H(INT 21H)入口参数:AL中断向量号ES:BX中断服务程序的段基地址:偏移地址,int 80h;调用中断80h的服务程序,显示信息mov dx,intoff ;恢复中断80H的入口地址mov ax,intsegmov ds,axmov ax,2580hint 21h.exit 0 ;返回DOS,例5.15a:3/5,设置中断向量:AH25H(INT 21H)入口参数:AL中断向量号ES:BX中断服务程序的段基地址:偏移地址,newint80h proc ;内部中断

43、服务程序sti ;开中断push ax ;保护现场push bxpush cxpush simov si,offset intmsg;获取显示字符串首地址mov cx,sizeof intmsg;获取显示字符串个数,例5.15a:4/5,disp: mov al,cs:si ;获取显示字符mov bx,0 ;显示一个字符mov ah,0ehint 10hinc siloop disppop si ;恢复现场pop cxpop bxpop axiret ;中断返回 intmsg db I am Great !,0dh,0ah ;显示信息 newint80h endp,例5.15a:5/5,2.

44、驻留中断服务程序,驻留TSR程序:程序执行结束,但保留在系统主存中,可以让其他程序使用 方法:利用DOS功能31h代替4ch终止程序,程序驻留返回:AH25H(INT 21H)入口参数:AL返回代码DX程序驻留的容量(节,1节=16个字节),.model tiny.code.startup ;等价于 org 100hjmp start ;跳转到本程序的开始位置 newint80h proc ;驻留的中断服务程序. ;同例题5.15a过程 newint80h endp ;中断服务程序结束 start: mov ax,cs ;主程序开始位置mov ds,axmov dx,offset newint

45、80hmov ax,2580hint 21h ;设置80h的中断向量int 80h ;调用一下看看,例5.15b:1/2,mov dx,offset istmsg ;显示驻留成功mov ah,9int 21hmov dx,(offset start)+15;计算驻留程序的长度(需多加15个字节)mov cl,4shr dx,cl ;除以16转换成“节”mov ax,3100h;中断服务程序驻留后,主程序返回DOS系统int 21h istmsg db INT 80H is installed!,0dh,0ah,$end,例5.15b:2/2,3. 外部可屏蔽中断服务程序,编写可屏蔽中断服务程序

46、,还要注意: 发送中断结束命令 不能采用寄存器传递参数 不要使用DOS系统功能调用INT 21H 中断服务程序尽量短小 主程序除需要修改中断向量外,还要注意: 控制CPU的中断允许标志IF 设置中断屏蔽寄存器IMR,例5.16 键盘中断服务程序,.codemov ax,3509hint 21hpush espush bx ;保存原中断向量内容cli ;关中断push ds ;设置新中断向量内容mov ax,2509hmov dx,seg scancodemov ds,dxmov dx,offset scancodeint 21hpop ds,例5.16:1/,in al,21h ;读出IMR

47、push ax ;保存原IMR内容and al,0fdh ;允许键盘中断(D1)out 21h,al ;设置新IMR内容mov byte ptr esccode,0sti ;开中断 waiting: cmp byte ptr esccode,81h;循环等待按下并释放ESC键jne waiting;中断服务程序设置esccode单元内容. ;恢复、返回,例5.16:2/,scancode procsti ;键盘中断服务程序push axpush bxin al,60h ;读取扫描码push axin al,61h ;通过PB7应答键盘or al,80hout 61h,al ;使PB7=1and

48、 al,7fhout 61h,al ;使PB7=0pop axcmp al,81hjne scan1 ;不是ESC键断开扫描码,显示,例5.16:3/,push ds;是ESC键断开扫描码,则设置esccode单元mov bx,data ;设置数据段地址 mov ds,bxmov esccode,al ;设置esccode单元为其扫描码pop ds scan1: push ax ;显示扫描代码shr al,1 ;先显示高4位shr al,1shr al,1shr al,1cmp al,0ahjb scan2add al,7 scan2: add al,30h ;转换成ASCII码,例5.16:

49、4/,mov bx,0mov ah,0ehint 10hpop ax ;后显示低4位and al,0fhcmp al,0ahjb scan3add al,7 scan3: add al,30h ;转换成ASCII码mov ah,0ehint 10h,例5.16:5/,mov ax,0e20h ;显示两个空格int 10hmov ax,0e20hint 10hmov al,20h ;发送EOI命令out 20h,alpop bxpop axiret ;中断返回 scancode endp,例5.16:6/,第5章 教学要求,理解条件控制和循环控制伪指令,熟悉带参数的过程定义和过程声明、过程调用伪指令 了解宏操作符、宏汇编、条件汇编和重复汇编、源程序包含、代码连接和子程序库等程序设计方法 了解程序直接控制、查询和中断的输入输出程序设计 掌握伪指令:PROTO / INVOKE,MACRO/ENDM、LOCAL,INCLUDEPUBLICEXTERN,

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

当前位置:首页 > 中等教育 > 小学课件

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


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

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

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