汇编网首页登录博客注册
dpjf的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
友情链接

[2008-07-18 11:43] 实验16 编写包含多个子程序的中断例程 大家帮我看看,怎么老是出现“遇到无效指令”的窗口

大家帮我看看,怎么老是出现“遇到无效指令”的窗口


e16a.asm    这个是编写和安装中断程序的文件
;author:dpjf
;date:2008-07-16
;编写并安装int 7ch中断例程
;包含多个功能子程序的中断例程
;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

assume cs:code
code segment
start:
;;;;;;;;;;;;;;;;;;;
;中断程序安装
;;;;;;;;;;;;;;;;;;;
mov ax,cs
mov ds,ax
mov si,offset setscreen
mov ax,0
mov es,ax
mov di,200h
mov cx,offset setscreenend-setscreen
cld
rep movsb




;;;;;;;;;;;;;;;;;;;
;设置中断向量
;;;;;;;;;;;;;;;;;;;
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0

mov ah,4ch
int 21h

;;;;;;;;;;;;;;;;;;;
;中断处理程序
;;;;;;;;;;;;;;;;;;;
setscreen:
jmp short set
table:dw sub1,sub2,sub3,sub4
set:push bx
cmp ah,3
ja sret
mov bl,ah
mov bh,0
add bx,bx
call word ptr table[bx]
sret:pop bx
iret

sub1:
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
sub1s:
mov byte ptr es:[bx],' '
add bx,2
loop sub1s
pop es
pop cx
pop bx
ret


sub2:
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub2s:and byte ptr es:[bx],11111000b
or es:[bx],al
add bx,2
loop sub2s

pop es
pop cx
pop bx
ret

sub3:
push bx
push cx
push es
mov cl,4
shl al,cl
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub3s:and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub3s

pop es
pop cx
pop bx
ret

sub4:
push cx
push si
push di
push es
push ds
mov si,0b800h
mov es,si
mov ds,si
mov si,160
mov di,0
cld 
mov cx,24
sub4s:push cx
mov cx,160
rep movsb
pop cx
loop sub4s

mov cx,80
mov si,0
sub4s1:
mov byte ptr [160*24+si],' '
add si,2
loop sub4s1
pop ds
pop es
pop di
pop si
pop cx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

setscreenend:nop

code ends
end start

e16.asm 这是调用int 7ch中断的程序
assume cs:code
code segment
start:
mov ah,3
mov al,7
int 7ch

mov ah,4ch
int 21h

code ends
end start
评论次数(1)  |  浏览次数(818)  |  类型(汇编作业) |  收藏此文  | 

[  游客   发表于  2008-07-18 18:10  ]

;中断处理程序 
;;;;;;;;;;;;;;;;;;; 
setscreen: 
jmp short set 
table:dw sub1,sub2,sub3,sub4 
------------------------------
table:dw 中的sub1,sub2,sub3,sub4 ,在编译时就确定地址了,所以当把在加载程序中的地址,在中断程序中去找加载程序中子函数的地址,肯定就会出错了!

博主如果不明白的话,可以在debug下查看一下,table中的地址,然后在调用int7ch的函数跟踪,int7ch中的子函数地址,就明白了......

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码