;********************************************************************
;* Copyright (c) 2006 All rights reserved.
;* 文件名:SetInterrupt.asm
;*
;* 文件标识:修改中断向量
;* 摘要:设置5号和6号中断类型号的中断向量
;* 输入:输入字符串
;* 输出:输出刚刚输入的字符串,以及success缓冲区的字符串
;*
;* 当前版本 0.01
;* 作者:罗
;* 完成日期:2006年4月2日
;********************************************************************
;========== 堆栈段 ===========
sseg segment stack
db 1024 dup(?)
sseg ends
;========== 代码段 ===========
code segment
assume cs:code, ss:sseg
main proc far
push ds ;这三条语句和mov ah, 4ch int 21h的功能是一样的,返回DOS
xor ax, ax
push ax
cli ;关中断(除非是不可屏蔽中断来了,否则禁止中断)
; Dos 25H号功能调用,设置中断向量
; 入口参数:al = 中断类型号 ds:dx = 中断向量(中断处理程序的入口地址) ah = 25h
; 这里修改的中断类型号是 0ah, 也可以换成别的
mov ax, seg myinterrupt5
mov ds, ax
mov dx, offset myinterrupt5
mov ah, 25h
mov al, 5h
int 21h
mov ax, seg myinterrupt6
mov ds, ax
mov dx, offset myinterrupt6
mov ah, 25h
mov al, 6h
int 21h
sti ;开中断
int 6h ;使用自己的6号中断服务程序
int 5h ;使用自己的5号中断服务程序
ret
main endp
prompt db 'qing shu ru ni xi huan de ren de ming zhi:', '$'
success db 'luo jia feng yi ding hui cheng gong!', '$' ;待输出的字符串
strlen equ $ - success - 1 ;字符串长度,不包含结束符
buf db 80, 0, 80 dup('$') ;输入缓冲区
;========== 自己的中断服务程序 ===========
;========== 子程序名称:myinterrupt5 =====
;========== 入口参数:dx = 字符串首地址 ==
;========== 功能:输出字符串 =============
myinterrupt5 proc far
push ax
push bx
push cx
push dx
mov bx, offset success
mov cx, strlen
outchar:
mov al, cs:[bx]
call dispchar
inc bx
loop outchar ;outchar是按字符方式输出success缓冲区的内容
call outenter
mov dx, offset success
call dispstring ;按字符串方式输出success缓冲区的内容
call outenter
pop dx
pop cx
pop bx
pop ax
iret ;中断返回
myinterrupt5 endp
;========== 自己的中断服务程序 ==================
;========== 子程序名称:myinterrupt6 ============
;========== 入口参数:dx = 输入字符串首地址 =====
;========== 功能:输入字符串,输出刚刚输入的字符串
myinterrupt6 proc near
push dx
mov dx, offset prompt
call dispstring ;输出提示信息
call outenter
mov dx, offset buf
mov ah, 0ah ;输入字符串到缓冲区
int 21h
call outenter ;输出回车换行
mov dx, offset buf+2
call dispstring ;输出刚刚输入的字符串
call outenter ;输出回车换行
pop dx
iret ;中断返回
myinterrupt6 endp
;======== 输出字符串的子程序 ==============
;======== 入口参数:dx = 字符串首地址 =====
;======== 出口参数:无 ====================
dispstring proc near
mov ah, 09h ;DOS 09号功能调用,输出字符串
int 21h
ret
dispstring endp
;======== 输出回车换行的子程序 ============
;======== 入口参数:无 ====================
;======== 出口参数:无 ====================
outenter proc near
mov dl, 0dh ;0dh是回车符的ASCII码
mov ah, 02h ;Dos 02号功能调用,输出字符
int 21h
mov dl, 0ah ;0ah是换行符的ASCII码
mov ah, 02h
int 21h
outenter endp
;======= 输出字符的子程序 =================
;======= 注意,这里使用的是BIOS功能调用 ===
;======= 入口参数是 al = 要输出的字符 =====
;======= bx = 0是设置前景色 ===============
;======= BIOS 10号中断 0eh号功能是输出字符=
dispchar proc near
push bx
mov bx, 0
mov ah, 0eh
int 10h
pop bx
ret
dispchar endp
code ends
end main
阅读(3156) | 评论(5) | 转发(0) |