汇编语言程序设计基础_第1页
汇编语言程序设计基础_第2页
汇编语言程序设计基础_第3页
汇编语言程序设计基础_第4页
汇编语言程序设计基础_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

1、1汇编语言汇编语言 程序设计程序设计基础基础基本程序结构:基本程序结构: 顺序结构顺序结构 循环结构循环结构 分支结构分支结构 子程序结构子程序结构 复合结构:多种程序结构的组合复合结构:多种程序结构的组合234.1 4.1 循环程序设计循环程序设计 结结 束束 初始化初始化 循环的初始状态循环的初始状态 循循 环环 体体 循环的工作部分及修改部分循环的工作部分及修改部分 计数控制计数控制特征值控制特征值控制地址边界控制地址边界控制修改部分修改部分循环控制循环控制条件条件Y YN N4例例1. 把把BX中的二进制数以十六进制的形式显示在屏幕上。中的二进制数以十六进制的形式显示在屏幕上。 BX1

2、2345 mov ch, 4mov ch, 4rotate: mov rotate: mov clcl, 4, 4 rol bx, rol bx, clcl mov al, bl mov al, bl and al, 0fhand al, 0fh add al, 30h add al, 30h ; ; 0 0 - - 9 9 ASCII 30H-39H ASCII 30H-39H cmp al, 3ah cmp al, 3ah jl printit jl printit add al, 7h add al, 7h ; ; A A - - F F ASCII 41H-46H ASCII 41H-

3、46Hprintit: printit: mov dl, almov dl, al mov ah, 2 mov ah, 2 int 21h int 21h dec chdec ch jnz jnz rotaterotate 6例例2. 将正数将正数n插入一个已整序的字数组的正确位置。插入一个已整序的字数组的正确位置。算法算法: 将数组中数逐个与将数组中数逐个与N比较比较,Si为指针为指针若若NKi,则则Ki下移一个单元下移一个单元若若N Ki,则插在则插在Ki的下一个单元的下一个单元,并结束并结束临界条件临界条件:若若N Kn,则插入则插入Kn的下一个单元的下一个单元若若NK1,则则K1Kn后

4、移一个单元后移一个单元, N插在第一个单元插在第一个单元循环控制循环控制:计数控制计数控制元素个数元素个数=(字末地址字首地址字末地址字首地址) / 2) +1 字数字数 = (字节末地址字节首地址字节末地址字节首地址) +1 字节数字节数地址边界控制地址边界控制结束地址为结束地址为ARRAY_HEAD特征值控制特征值控制: 表示结束条件的值表示结束条件的值7例例2. 将正数将正数n插入一个已整序的字数组的正确位置。插入一个已整序的字数组的正确位置。 x dw ?x dw ? array_head dw 3,5,15,23,37,49,52,65,78,99 array_head dw 3,5

5、,15,23,37,49,52,65,78,99 array_end dw 105 array_end dw 105 n dw 32 n dw 32 mov ax, n mov ax, n mov array_head-2, 0ffffh mov array_head-2, 0ffffh mov si, 0 mov si, 0compare:compare: cmp array_endsi, ax cmp array_endsi, ax jle insert jle insert mov bx, array_endsi mov bx, array_endsi mov array_endsi+2

6、, bx mov array_endsi+2, bx sub si, 2 sub si, 2 jmp short compare jmp short compareinsert:insert: mov array_endsi+2, ax mov array_endsi+2, ax -1 3 5 49 15 52 23 37 105 99 78 65 32xn8例例3 将首地址为将首地址为A的字数组从小到大排序(气泡算法,多重循环)的字数组从小到大排序(气泡算法,多重循环) A dw 32,85,16,15, 8A dw 32,85,16,15, 8 9 mov cx, 10 mov cx, 1

7、0 dec cx dec cxloop1loop1: : mov di, cxmov di, cx mov bx, 0 mov bx, 0loop2loop2: : mov ax, Abx mov ax, Abx cmp ax, Abx+2 cmp ax, Abx+2 jle continue jle continue xchg ax, Abx+2 xchg ax, Abx+2 mov Abx, ax mov Abx, axcontinue:continue: add bx, 2 add bx, 2 loop loop loop2loop2 mov cx, dimov cx, di loop

8、loop loop1loop1104.2 4.2 分支程序设计分支程序设计判定条件判定条件ABA BX判定条件判定条件(1)两路分支结构 (2)多路分支结构11(1)逻辑尺控制)逻辑尺控制 (2)条件控制)条件控制(3)地址跳跃表)地址跳跃表 TABLE DW ONE, TWO, THREE JMP TABLESI 1000 ONE: 2000 TWO: 3000 THREE: ?case 1 case 2 case 3case 1 case 2 case n 。12例例1. 设有数组设有数组x(x1, , x10)和和y(y1, , y10),编程计算编程计算 z1=x1 y1 z2=x2

9、y2 z3=x3 y3 z4=x4 y4 z5=x5 y5 z6=x6 y6 z7=x7 y7 z8=x8 y8 z9=x9 y9 z10=x10 y10 逻辑尺:逻辑尺:0 0 1 1 0 1 1 1 0 0 1 减法减法 0 加法加法13x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10z d

10、w z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dw 00dchlogic_rule dw 00dch mov mov bx, 0bx, 0 mov mov cx, 10cx, 10 mov mov dx, logic_ruledx, logic_rule next: next: mov mov ax, xbxax, xbx shr shr dx, 1dx, 1 jc jc subtractsubtract add add ax, ybxax, ybx jmp jmp short short result result ; ; 向前引用向前引用subtra

11、ct: subtract: sub sub ax, ybxax, ybx resultresult: mov : mov zbx, axzbx, ax add add bx, 2bx, 2 loop loop nextnext14例例2. 根据根据AL寄存器中哪一位为寄存器中哪一位为1(从低位到高位)把程序(从低位到高位)把程序 转移到转移到8个不同的程序分支去个不同的程序分支去 。(。(寄存器间接寻址寄存器间接寻址)branch_table branch_table dwdw routine1 routine1 dwdw routine2 routine2 dw dw routine3 ro

12、utine3 dwdw routine4 routine4 dwdw routine5 routine5 dw dw routine6 routine6 dwdw routine7 routine7 dwdw routine8 routine8 cmp al, 0 cmp al, 0 je je continue continue lea lea bxbx, branch_table, branch_tableL L : shr al, 1 : shr al, 1 ; ;逻辑右移逻辑右移 jnc add1jnc add1 jmp word ptr jmp word ptr bxbx ; ;段内

13、间接转段内间接转移移add1:add1: add add bx bx, 2, 2 jmp jmp L Lcontinuecontinue: : routine1: routine1: routine2: routine2: 154.3 4.3 子程序的设计方法子程序的设计方法 过程(子程序)定义伪操作过程(子程序)定义伪操作procedure_name PROC procedure_name PROC NEAR NEAR ( ( FARFAR ) ) procedure_name ENDPprocedure_name ENDP(1 1)NEARNEAR属性:调用程序和子程序在同一代码段中属性:

14、调用程序和子程序在同一代码段中 (段内调用)(段内调用)(2 2)FARFAR属性:调用程序和子程序不在同一代码段中属性:调用程序和子程序不在同一代码段中 (段间调用)(段间调用)16保存与恢复寄存器保存与恢复寄存器subt proc farsubt proc far push ax push ax push bx push bx push cx push cx push dx push dx . . pop dx pop dx pop cx pop cx pop bx pop bx pop ax pop ax ret retsubt endpsubt endp17 子程序调用(中断调用):隐

15、含使用堆栈保存返回地址子程序调用(中断调用):隐含使用堆栈保存返回地址call call nearnear ptr subp ptr subp (1) 保存返回地址保存返回地址 (2) 转子程序转子程序 (IP) subp(IP) subp的偏移地址的偏移地址call call farfar ptr subp ptr subp (1) 保存返回地址保存返回地址 (2) 转子程序转子程序 (CS) subp(CS) subp的段地址的段地址 (IP) subp(IP) subp的偏移地址的偏移地址 (IP)(SP) (IP)(SP) (CS)子程序的调用和返回子程序的调用和返回18INT nIN

16、T n (n n : 中断类型号)中断类型号) (1) 保存现场和返回地址(保存现场和返回地址(FLAGS,CS,IP入栈)入栈) (2) 转中断处理程序转中断处理程序 (IP) (n(IP) (n* *4)4) (CS) (n (CS) (n* *4+2)4+2)子程序返回:子程序返回: (1)ret ret (返回地址出栈(返回地址出栈) (2 2)iretiret (IP,CS,FLAGS出栈)出栈)(IP)(SP) (CS)(FLAGS)int 21Hint 21H19子程序的参数传送子程序的参数传送 (1)通过寄存器传送参数)通过寄存器传送参数 (2)通过存储区传送参数)通过存储区传

17、送参数 *子程序和调用程序在同一程序模块中,则子程序可子程序和调用程序在同一程序模块中,则子程序可 直接访问模块中的变量。直接访问模块中的变量。 *子程序和调用程序不在同一程序模块中,则有两种子程序和调用程序不在同一程序模块中,则有两种 传送方式:建立公共数据区和使用外部符号。传送方式:建立公共数据区和使用外部符号。 (3)通过地址表传送参数地址)通过地址表传送参数地址 (4)通过堆栈传送参数或参数地址)通过堆栈传送参数或参数地址20例例3. 十进制到十六进制的转换程序(十进制到十六进制的转换程序(通过寄存器传送变量通过寄存器传送变量)DecihexDecihexsegment ; segme

18、nt ; 1016 assume cs: assume cs: decihexdecihexmain main proc proc farfar push push dsds sub sub ax, axax, ax push push axaxrepeat: repeat: call decibincall decibin ; ; 102 call crlfcall crlf call binihexcall binihex ; ; 216 call crlfcall crlf jmp jmp repeatrepeat retretmain main endpendp21DecibinDec

19、ibinproc nearproc near ; ; 102 mov mov bx, 0bx, 0newchar: newchar: mov mov ah, 1ah, 1 int int 21h21h sub sub al, 30h al, 30h jl jl exit ; exit ; 099退出退出 cbwcbw xchg xchg ax, bx ax, bx mov mov cx, 10dcx, 10d mul mul cxcx xchg xchg ax, bxax, bx add add bx, axbx, ax jmp jmp newcharnewcharexit: exit: re

20、tretdecibin decibin endpendp22binihex proc nearbinihex proc near ; ; 216 mov ch, 4 mov ch, 4rotate: mov cl, 4rotate: mov cl, 4 rol rol bxbx, cl, cl mov al, bl mov al, bl and al, 0fh and al, 0fh add al, 30h add al, 30h cmp al, 3ah cmp al, 3ah jl printit jl printit add al, 7h ; AF add al, 7h ; AF prin

21、tit: mov dl, alprintit: mov dl, al mov ah, 2 mov ah, 2 int 21h int 21h dec ch dec ch jnz rotate jnz rotate ret retbinihex endpbinihex endp23crlf proc nearcrlf proc near mov dl, 0dh mov dl, 0dh mov ah, 2 mov ah, 2 int 21h int 21h mov dl, 0ah mov dl, 0ah mov ah, 2 mov ah, 2 int 21h int 21h ret retcrlf

22、 endpcrlf endpdecihexdecihex ends ends end main end main24例例4. 累加数组中的元素(累加数组中的元素(直接访问直接访问变量变量)data segmentdata segment ary ary dw 1,2,3,4,5,6,7,8,9,10dw 1,2,3,4,5,6,7,8,9,10 count count dw 10dw 10 sum sum dw ?dw ?data endsdata endscode segmentcode segmentmain proc farmain proc far assume cs:code, ds

23、:data assume cs:code, ds:datastart:start: push ds push ds sub ax, ax sub ax, ax push ax push ax mov ax, data mov ax, data mov ds, ax mov ds, ax call near ptr call near ptr proaddproadd ret retmain endpmain endp25proadd proc nearproadd proc near push ax push ax push cx push cx push si push si lea si,

24、 lea si, aryary mov cx, mov cx, countcount xor ax, ax xor ax, axnext: add ax, sinext: add ax, si add si, 2 add si, 2 loop next loop next mov mov sumsum, ax, ax pop si pop si pop cx pop cx pop ax pop ax ret retproadd endpproadd endpcode endscode ends end start end start26data segmentdata segmentary d

25、w 1,2,3,4,5,6,7,8,9,10ary dw 1,2,3,4,5,6,7,8,9,10count dw 10count dw 10sum dw ?sum dw ?ary1 dw 10,20,30,40,50,60,70,80,90,100ary1 dw 10,20,30,40,50,60,70,80,90,100count1 dw 10count1 dw 10sum1 dw ?sum1 dw ?data endsdata ends如果数据段定义如下:如果数据段定义如下:*如果直接访问内存变量,那么累加数组如果直接访问内存变量,那么累加数组aryary和和数组数组ary1ary1中中

26、的元素不能用同一个子程序的元素不能用同一个子程序proaddproadd27例例5 . 累加数组中的元素(累加数组中的元素(通过地址表传送变量地址通过地址表传送变量地址)data segmentdata segment ary dw 10,20,30,40,50,60,70,80,90,100 ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 count dw 10 sum dw ? sum dw ? table dw 3 dup (?) table dw 3 dup (?) ; ; 地址表地址表data endsdata ends code

27、segment code segmentmain proc farmain proc farassume cs:code, ds:dataassume cs:code, ds:datastart: start: push push dsds sub sub ax, axax, ax push push axax mov mov ax, dataax, data mov mov ds, axds, ax mov mov table, offset arytable, offset ary mov mov table+2, offset counttable+2, offset count mov

28、 mov table+4, offset sumtable+4, offset sum mov mov bx, offset tablebx, offset table call call proaddproadd retret main main endp endp 28proadd proc nearproadd proc near push axpush ax push cx push cx push si push si push di push di mov si, bxmov si, bx mov di, bx+2 mov di, bx+2 mov cx, di mov cx, d

29、i mov di, bx+4 mov di, bx+4 xor ax, axxor ax, axnext: add ax, sinext: add ax, si add si, 2 add si, 2 loop next loop next mov di, axmov di, ax pop dipop di pop si pop si pop cx pop cx pop ax pop ax retretproadd endpproadd endpcode endscode ends end start end start aryary 10 10 00000000 20 000220 0002

30、 3030 4040 5050 6060 7070 8080 9090 100100 countcount 10 10 00140014 sum sum ? ? 00160016 table table 00000000 0018 0018 (bx)(bx)0014001400160016(si)(di)29例例6 . 累加数组中的元素(累加数组中的元素(通过堆栈传送变量地址通过堆栈传送变量地址)data segmentdata segment ary dw 10,20,30,40,50,60,70,80,90,100 ary dw 10,20,30,40,50,60,70,80,90,100

31、 count dw 10 count dw 10 sum dw ? sum dw ?data endsdata endsstack segmentstack segment dw 100 dup (?) dw 100 dup (?) tos label word tos label wordstack endsstack ends 30code1 segmentcode1 segmentmain proc farmain proc far assume cs:code1, ds:data, assume cs:code1, ds:data, ss:stackss:stackstart:star

32、t: mov ax, stackmov ax, stack mov ss, ax mov ss, ax mov sp, offset tos mov sp, offset tos push ds push ds sub ax, ax sub ax, ax push ax push ax mov ax, data mov ax, data mov ds, ax mov ds, ax mov bx, offset arymov bx, offset ary push bx push bx mov bx, offset count mov bx, offset count push bx push

33、bx mov bx, offset sum mov bx, offset sum push bx push bx call far ptr call far ptr proaddproadd ret retmain endpmain endpcode1 endscode1 ends31code2 segmentcode2 segment assume cs: code2 assume cs: code2proadd proc farproadd proc far push bppush bp mov bp, sp mov bp, sp push axpush ax push cx push c

34、x push si push si push di push di mov si, bp+0ahmov si, bp+0ah mov di, bp+8 mov di, bp+8 mov cx, di mov cx, di mov di, bp+6 mov di, bp+6 ( b p ) + 0 a ( b p ) + 0 a 00000000 (sp) (sp) (di)(di) (si)(si) (cx)(cx) (ax)(ax) (bp) (bp) ( (bp)bp) (ip)(ip) (cs)(cs) (bp)+6(bp)+6 0016 0016 (bp)+8 (bp)+8 0014

35、0014 0 0 (ds)(ds) xor ax, axxor ax, axnext: add ax, sinext: add ax, si add si, 2 add si, 2 loop next loop next mov di, axmov di, ax pop dipop di pop sipop si pop cx pop cx pop ax pop ax pop bppop bp ret 6ret 6proadd endpproadd endpcode2 endscode2 ends end start end start32例例8 十六进制到十进制的转换程序(十六进制到十进制的

36、转换程序(通过寄存器传送变量通过寄存器传送变量)hexidechexidec segment segment ; ; 1610 main proc farmain proc far assume cs: hexidec assume cs: hexidecstart:start: push ds push ds sub ax, ax sub ax, ax push ax push axrepeat:repeat: call call hexibinhexibin ; ; 162 call crlf call crlf call call binidec binidec ; ; 210 call

37、 crlf call crlf jmp repeat jmp repeat ret retmain endpmain endp33hexibinhexibin proc near ; proc near ; 162 mov bx, 0 mov bx, 0newchar:newchar: mov ah, 1mov ah, 1 int 21h int 21h sub al, 30h sub al, 30h jl exit jl exit cmp al, 10d cmp al, 10d jl add_to jl add_to sub al, 27h ; sub al, 27h ; a f cmp a

38、l, 0ah cmp al, 0ah jl exit jl exit cmp al, 10h cmp al, 10h jge exit jge exitadd_to:add_to: mov cl, 4 mov cl, 4 shl bx, clshl bx, cl mov ah, 0 mov ah, 0 add bx, axadd bx, ax jmp newchar jmp newcharexit: retexit: rethexibinhexibin endp endp34binidecbinidec proc near ; proc near ; 210 mov cx, 10000d mo

39、v cx, 10000d call dec_divcall dec_div mov cx, 1000d mov cx, 1000d call dec_divcall dec_div mov cx, 100d mov cx, 100d call dec_divcall dec_div mov cx, 10d mov cx, 10d call dec_divcall dec_div mov cx, 1d mov cx, 1d call dec_divcall dec_div ret retbinidecbinidec endp endpdec_divdec_div proc near proc n

40、ear mov ax, bx mov ax, bx mov dx, 0 mov dx, 0 div cx div cx mov bx, dx mov bx, dx mov dl, almov dl, al add dl, 30h add dl, 30h mov ah, 2 mov ah, 2 int 21h int 21h ret retdec_divdec_div endp endp35crlf proc nearcrlf proc near mov dl, 0ah mov dl, 0ah mov ah, 2 mov ah, 2 int 21h int 21h mov dl, 0dh mov

41、 dl, 0dh mov ah, 2 mov ah, 2 int 21h int 21h ret retcrlf endp crlf endp hexidec hexidec ends ends end start end start364.4 I/O4.4 I/O程序设计程序设计1. 1. I/OI/O设备的数据传送方式设备的数据传送方式 程序控制方式程序控制方式(查询方式)(查询方式) CPU利用指令反复查询利用指令反复查询I/O的状态,直到的状态,直到I/O准备好,才进行输入准备好,才进行输入/ /输出。此间输出。此间CPU处于循环等待状态,未做有效的工作。处于循环等待状态,未做有效的工

42、作。中断方式中断方式 CPU在执行程序的同时兼顾对在执行程序的同时兼顾对I/O设备的控制或数据传送。当设备的控制或数据传送。当I/O设备准备好(空闲),由设备准备好(空闲),由I/O通知通知CPU暂停正在运行的程序,转而处暂停正在运行的程序,转而处理理I/O设备的请求,处理完即返回主程序继续执行。设备的请求,处理完即返回主程序继续执行。DMA方式方式(直接存储器存取方式(直接存储器存取方式/成组传送方式)成组传送方式) 主要适用于高速主要适用于高速I/O设备(如磁盘),设备(如磁盘),CPU向向I/O接口提供控制信接口提供控制信息(如数据块的首地址及字节数),息(如数据块的首地址及字节数),I

43、/O设备直接和存储器进行成批设备直接和存储器进行成批数据的快速传送。数据的快速传送。372. 2. 程序直接控制程序直接控制I/OI/O方式方式I/O端口端口 外设接口由一组寄存器(数据寄存器外设接口由一组寄存器(数据寄存器/状态寄存器状态寄存器/命令命令寄存器)组成,每个寄存器有一个寄存器)组成,每个寄存器有一个端口地址端口地址(端口号端口号),IBM-PC机的机的I/O地址空间可达地址空间可达64K(0000FFFFH)。I/O指令指令 主机与外设进行通信的最基本途径。主机与外设进行通信的最基本途径。DOS功能调用和功能调用和BIOS例行程序中的输入例行程序中的输入/ /输出功能也是由输出

44、功能也是由IN和和OUT指令完指令完成的。成的。例例:测试某状态寄存器(端口号测试某状态寄存器(端口号27H)的第)的第2位是否为位是否为1IN AL, 27HTEST AL, 00000100BJNZ ERROR 38例例1. Sound程序程序 mov dx, 6000mov dx, 6000; ;声音声音频率频率 in al, 61hin al, 61h and al, 111111 and al, 1111110 00b0btrig: xor al, 000000trig: xor al, 0000001 10b0b out 61h, alout 61h, al mov cx, 100

45、0 mov cx, 1000; ;声音声音延迟延迟delay: loop delaydelay: loop delay dec dx dec dx jne trig jne trig设备控制寄存器设备控制寄存器端口端口61H1 / 0 0 控制其它外部设备控制其它外部设备与门与门放大器放大器2号定时器门控号定时器门控1 039例例2.CPU要从要从3个设备轮流输入数据,设备个设备轮流输入数据,设备1,2,3的状态寄存器的状态寄存器 端口号分别用端口号分别用STAT1,STAT2,STAT3表示,第表示,第5位是输入位是输入 准备位。准备位。INPUT: INPUT: IN AL, STAT1I

46、N AL, STAT1 TEST AL, 20HTEST AL, 20H;0010 0000b;0010 0000b JZ DEV2 JZ DEV2 CALL FAR PTR CALL FAR PTR PROC1PROC1DEV2: DEV2: IN AL, STAT2IN AL, STAT2 TEST AL, 20HTEST AL, 20H JZ DEV3 JZ DEV3 CALL FAR PTR PROC2 CALL FAR PTR PROC2DEV3: DEV3: IN AL, STAT3IN AL, STAT3 TEST AL, 20HTEST AL, 20H JZ NO_INPUT

47、JZ NO_INPUT CALL FAR PTR PROC3 CALL FAR PTR PROC3NO_INPUT:NO_INPUT: 403. 3. 中断程序设计中断程序设计中断源:引起中断的事件中断源:引起中断的事件外中断(硬中断):外设的外中断(硬中断):外设的I/O请求请求 可屏蔽中断可屏蔽中断 电源掉电电源掉电/奇偶错奇偶错 非屏蔽中断非屏蔽中断内中断(软中断):内中断(软中断):INT指令指令/CPU错(除法错、溢出)错(除法错、溢出)非屏蔽中断请求非屏蔽中断请求 中断逻辑中断逻辑INT nINTO除法错除法错单步单步 n 4 0 1CPU 2 NMI8259A可编程中断控制器可编

48、程中断控制器(PIC)IR0 系统定时器系统定时器IR1 键盘键盘IR2 彩色彩色/图形接口图形接口IR3 保留保留IR4 串行通讯口串行通讯口IR5 保留保留IR6 软盘软盘IR7 打印机打印机INTR08090A0B0C0D0E0F41中断操作的中断操作的5个步骤个步骤:(1) 取中断类型号取中断类型号(2) 计算中断向量地址计算中断向量地址(3) 取中断向量,偏移地址送取中断向量,偏移地址送IP,段地址送,段地址送CS(4) 转入中断处理程序转入中断处理程序(5) 中断返回到中断返回到INT指令的下一条指令指令的下一条指令例例:BIOS中断中断 INT 4AH (P.136 图图4.13

49、) 4AH 4 = 128H 4AH 4+2 = 12AH (128H) IP (12AH) CS42中断向量表中断向量表IBM-PC中断系统能处理中断系统能处理256种类型的中断,类型号为种类型的中断,类型号为00FFH。中断向量表是各种。中断向量表是各种中断处理程序的地址表。中断处理程序的地址表。 类型类型0的的(IP) 类型类型0的的(CS) 类型类型1的的(IP) 类型类型1的的(CS) 类型类型N的的(IP) 类型类型N的的(CS) 类型类型255的的(IP) 类型类型255的的(CS)0000000004 4*N003FC43DOS功能调用(功能调用(21H)存取中断向量)存取中断

50、向量设置中断向量:设置中断向量:AH=25HAL=中断类型号中断类型号DS:DX=中断向量中断向量INT 21H取中断向量:取中断向量:AH=35HAL=中断类型号中断类型号INT 21H返回时送返回时送ES:BX=中断向量中断向量44例例1用用DOS功能调用存取中断向量功能调用存取中断向量 MOV AL, NMOV AL, N MOV AH, 35H MOV AH, 35H INT 21H INT 21H ; ; 取原中断向量取原中断向量 PUSH ESPUSH ES PUSH BX PUSH BX ; ; 保存原中断向量保存原中断向量 PUSH DSPUSH DSMOV AX, SEG I

51、NTHANDMOV AX, SEG INTHANDMOV DS, AX MOV DS, AX MOV DX, OFFSET INTHANDMOV DX, OFFSET INTHANDMOV AL, NMOV AL, NMOV AH, 25HMOV AH, 25HINT 21HINT 21H ; ; 设置新的中断向量设置新的中断向量POP DSPOP DSPOP DXPOP DXPOP DSPOP DSMOV AL, NMOV AL, NMOV AH, 25HMOV AH, 25HINT 21HINT 21H ; ; 恢复原中断向量恢复原中断向量RETRET; ;INTHAND: INTHAND

52、: IRET IRET45中断程序的编写步骤:中断程序的编写步骤:主程序:主程序:(1) 设置中断向量设置中断向量 ( DOS调用调用 AH=25H, AH=35H ) (2) 设置设置CPU中断允许位中断允许位 FLAGS中的中的IF位位=1 允许中断允许中断 (STI 开中断)开中断) =0 禁止中断禁止中断 (CLI 关中断)关中断) (3) 设置中断屏蔽位设置中断屏蔽位 I/O端口端口 21H 中断屏蔽寄存器中断屏蔽寄存器 中断屏蔽位中断屏蔽位=0 允许中断允许中断 =1 禁止中断禁止中断 7 6 5 4 3 2 1 0定时器定时器键键 盘盘 打印机打印机中断屏蔽寄存器中断屏蔽寄存器2

53、1H46 7 6 5 4 3 2 1 0中断命令寄存器中断命令寄存器20H EOIMOV AL, 20HOUT 20H, AL中断处理子程序:中断处理子程序:(1) 保存工作寄存器保存工作寄存器 (PUSH)(2) 开中断(开中断( STI )(3) 中断处理功能中断处理功能(4) 关中断(关中断( CLI )(5) 送中断结束命令(送中断结束命令( EOI ,仅对硬中断)仅对硬中断)(6) 恢复工作寄存器(恢复工作寄存器( POP)(7) 中断返回(中断返回( IRET )47例例2 .2 . 编写一个中断处理程序,要求在主程序运行期间,每隔编写一个中断处理程序,要求在主程序运行期间,每隔

54、1010秒响铃一次,同时显示秒响铃一次,同时显示The bell is ring!The bell is ring!dseg segmentdseg segment count count dw 1dw 1 mess mess db The bell is ring!,0ah,0dh,$ db The bell is ring!,0ah,0dh,$dseg endsdseg endscseg segmentcseg segmentmain proc farmain proc far assume cs:cseg, ds:dseg, es:dseg assume cs:cseg, ds:dseg

55、, es:dsegstart:start: push ds push ds mov ax, ax mov ax, ax push ax push ax mov ax, dseg mov ax, dseg mov ds, ax mov ds, ax 48 mov al, 1chmov al, 1ch mov ah, 35h mov ah, 35h int 21h int 21h ; ; 取原中断向量取原中断向量 push espush es push bx push bx ; ; 保存原中断向量保存原中断向量 push dspush ds mov dx, offset mov dx, offse

56、t ringring mov ax, seg mov ax, seg ringring mov ds, ax mov ds, ax mov al, 1ch mov al, 1ch mov ah, 25h mov ah, 25h int 21h int 21h ; ; 设置新的中断向量设置新的中断向量 pop dspop ds in al, 21hin al, 21h and al, 11111110b and al, 11111110b out 21h, al out 21h, al ; ; 设置中断屏蔽位设置中断屏蔽位, ,允许定时器中允许定时器中断断 sti sti ; ; 开中断开中断4

57、9 mov di, 2000mov di, 2000delay: mov si, 3000delay: mov si, 3000delay1:delay1: dec si dec si jnz delay1 jnz delay1 dec di dec di jnz delay jnz delay ; ; 主程序工作(期间每秒产生中断主程序工作(期间每秒产生中断18.218.2次次) pop dxpop dx pop ds pop ds mov al, 1ch mov al, 1ch mov ah, 25h mov ah, 25h int 21h int 21h ; ; 恢复原中断向量恢复原中断

58、向量 retretmain endpmain endp50ring proc farring proc far push ds push ds push ax push ax push cx push cx push dx push dx mov ax, dseg mov ax, dseg mov ds, ax mov ds, ax sti sti ; ; 开中断开中断, ,允许更高级的中断允许更高级的中断 dec countdec count jnz exit jnz exit mov dx, offset messmov dx, offset mess mov ah, 09 mov ah,

59、 09 int 21h int 21h ; ; 显示显示The bell is ring!The bell is ring!51 movmovdx, 100dx, 100 ininal, 61hal, 61h and al, 11111100band al, 11111100bsound:sound: xor al, 2xor al, 2 out 61h, alout 61h, al mov cx, 140hmov cx, 140hwait1:wait1: loop wait1 loop wait1 dec dec dxdx jne sound jne sound ; ; 响铃响铃 mov c

60、ount, 182mov count, 182exit: exit: cli ; cli ; 关中断关中断 pop pop dxdx pop pop cxcx pop pop axax pop pop dsds iretiretring endpring endpcseg endscseg ends end startend start 52例例3 . 从键盘接收字符,同时对从键盘接收字符,同时对32字节的输入缓冲区进行测试。如果字节的输入缓冲区进行测试。如果 缓冲区已满,则将键盘挂起,由打印机输出一个提示信息。缓冲区已满,则将键盘挂起,由打印机输出一个提示信息。程序包括以下几个部分:程序包括

温馨提示

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

评论

0/150

提交评论