Chinaunix首页 | 论坛 | 博客
  • 博客访问: 568624
  • 博文数量: 97
  • 博客积分: 5090
  • 博客等级: 大校
  • 技术积分: 969
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-01 14:56
文章分类

全部博文(97)

文章存档

2011年(1)

2009年(1)

2008年(14)

2007年(37)

2006年(44)

我的朋友

分类:

2006-04-02 12:48:38

;********************************************************************
;* 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
阅读(3137) | 评论(5) | 转发(0) |
给主人留下些什么吧!~~