中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 求助DOS编写驱动程序的问题 上一主题 | 下一主题
leonner
新手上路





积分 5
发帖 1
注册 2006-9-29
状态 离线
『楼 主』:  求助DOS编写驱动程序的问题

最近需要编写一个DOS的驱动程序,在看“DOS程序员参考手册”,里面有一个驱动程序的例子,程序如下,但是开机后显示完“Sample Device Driver..Version”,系统就没有反应了,不能返回DOS提示符了,这里有人做过dos驱动的朋友吗,能不能帮我解决这个问题。
; drvr.asm

CR EQU 0Dh                 
LF EQU 0Ah
MAXCMD EQU 16
ERROR EQU 8000h
BUSY EQU 0200h
DONE EQU 0100h
UNKNOWN EQU 8003h
            cseg segment public 'code'   
org 0
assume cs : cseg , ds : cseg , es : cseg
; ============================================================
drvr proc far
dD -1
dw 8000h
dw strategy
dw interrupt
db 'Driver01'
; =========================================================
rh_seg dw ?
rh_off dw ?
strategy :
mov cs : rh_seg , es
mov cs : rh_off , bx
ret
; ========================================================
; dispatch table
; ===============================================================
d_tbl:
dw s_init ; Initialization
dw s_mchk ;Media Check
dw s_bpb ;BIOS parameter block
dw s_ird ; IOCTL read
dw s_read ; Read
dw s_nrd ; Nondestructive read
dw s_inst ;Current input status
dw s_infl ;Flush input buffer
dw s_write ;Write
dw s_vwrite ;Write with verify
dw s_ostat ;Current output status
dw s_oflush ;Flush output buffers
dw s_iwrt ; IOCTL write
dw s_open ; open
dw s_close ; Close
dw s_media ; Removable media
dw s_busy;output until busy
; ==============================================================
; interrupt routine
; ==============================================================
interrupt proc far
cld
push es
push ds
push ax
push bx
push cx
push dx
push si
push di
push bp
mov dx,cs: rh_seg
mov es , dx
mov bx,cs: rh_off
mov al,es:[bx]+2
xor ah,ah
cmp ax,MAXCMD
jle ok
mov ax,UNKNOWN
jmp finish
ok:
shl aX,1
mov bx,ax
jmp word ptr[bx+d_tbl]
finish:
mov dx,cs:rh_seg
mov es,dx
mov bx,cs:rh_off
or ax,DONE
mov es:[bx]+3,ax
pop bp
pop di
pop Si
pop dx
pop cx
pop bx
pop ax
pop ds
pop es
iret ;Back to DOS
interrupt endp
;======================================================================================================
; main body of driver
;======================================================================================================
s_mchk: ;Media check
s_bpb: ;BIOS parameter block
S_ird: ;IOCTL read
S_read: ;Read
s_nrd: ;Nondestructive read
s_inst: ;Current input status
s_infl: ;Flush input buffers
S_vwrite: ;Current output status
S_ostat:  ;Current Output Status
s_oflush: ;Flush output buffers
S_iwrt: ;IOCTL write
s_open: ;open
s_close:;Close
s_media:;Removable media
s_busy: ;output until busy
MOV AX, UNKNOWN ;Set error bits
jmp finish
ident:
db CR,LF
db 'Sample Device Driver..Version'
db '0,1'
db CR,LF,LF,'$'
s_init:
mov ah,9 ;Print String
mov dx,offset ident
int 21h
mov dx,CS:rh_seg
mov es,dX
mov bx,CS:rh_off
lea aX,end_driver         ;Get end of driver address
mov es:[bX]+14,ax
mov es:[bX]+16,cx
xor aX,ax                           ;Zero the AX register
jmp finish
s_write:
xor ax,ax               
jmp finish
end_driver:
        drvr endp
        cseg ends
              end

2006-9-30 19:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
本是
银牌会员





积分 2201
发帖 789
注册 2005-1-27
状态 离线
『第 2 楼』:  

请尝尝试下面的任一种方案:
方案1>将IRET改为RET。
方案2>将IRET和RET改作RETF。



my major is english----my love is dos----my teacher is the buddha----my friends--how about U
2006-9-30 20:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
proof
高级用户





积分 687
发帖 222
注册 2005-8-21
状态 离线
『第 3 楼』:  

顶一下。



2006-10-3 02:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
gezi322
初级用户





积分 27
发帖 12
注册 2006-12-5
状态 离线
『第 4 楼』:  

偶也看了这本书上的程序,里面明明有语言解释说,中断例程不是一个中断,不是以IRet而是以Ret终止!!木是果然厉害。羡慕

2007-1-12 05:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
本是
银牌会员





积分 2201
发帖 789
注册 2005-1-27
状态 离线
『第 5 楼』:  

1楼的源程序有两处错:
1)如gezi322所说“中断例程不是一个中断”,IRET必须改成RET;
2)“开机后显示完“Sample Device Driver..Version”,系统就没有反应了,不能返回DOS提示符了”:因为加载.SYS时还未进入DOS,DOS中断int 21h是不应该调用的,可改用BIOS中的INT 10h的09h/0ah/0eh/13h功能实现显示。



my major is english----my love is dos----my teacher is the buddha----my friends--how about U
2007-1-12 08:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
osfree
初级用户





积分 72
发帖 34
注册 2007-1-12
来自 中国大陆
状态 离线
『第 6 楼』:  

支持,在交流中成长。



PowsdeRTOS,可运行于FreeDOS,窗口实时操作系统.
2007-1-13 01:55
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
gezi322
初级用户





积分 27
发帖 12
注册 2006-12-5
状态 离线
『第 7 楼』:  

这个驱动的嵌套结构好像有点问题?
interrupt endp,这句是否应该去掉??

2007-1-17 05:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: