![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 20:41 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 求助DOS编写驱动程序的问题 |
| 可打印版本 1,590 / 6 |
| 第1楼 leonner | 发表于 2006-09-30 19:53 |
| 新手上路 发帖 1 积分 5 | |
|
求助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 |
|
| 第2楼 本是 | 发表于 2006-09-30 20:47 |
| 银牌会员 发帖 790 积分 2,227 | |
|
请尝尝试下面的任一种方案:
方案1>将IRET改为RET。 方案2>将IRET和RET改作RETF。 |
|
| 第3楼 proof | 发表于 2006-10-03 02:00 |
| 高级用户 发帖 222 积分 691 | |
|
顶一下。
![]() |
|
| 第4楼 gezi322 | 发表于 2007-01-12 05:59 |
| 初级用户 发帖 12 积分 27 | |
|
偶也看了这本书上的程序,里面明明有语言解释说,中断例程不是一个中断,不是以IRet而是以Ret终止!!木是果然厉害。羡慕
|
|
| 第5楼 本是 | 发表于 2007-01-12 08:33 |
| 银牌会员 发帖 790 积分 2,227 | |
|
1楼的源程序有两处错:
1)如gezi322所说“中断例程不是一个中断”,IRET必须改成RET; 2)“开机后显示完“Sample Device Driver..Version”,系统就没有反应了,不能返回DOS提示符了”:因为加载.SYS时还未进入DOS,DOS中断int 21h是不应该调用的,可改用BIOS中的INT 10h的09h/0ah/0eh/13h功能实现显示。 |
|
| 第6楼 osfree | 发表于 2007-01-13 01:55 |
| 初级用户 发帖 34 积分 72 来自 中国大陆 | |
|
支持,在交流中成长。
|
|
| 第7楼 gezi322 | 发表于 2007-01-17 05:33 |
| 初级用户 发帖 12 积分 27 | |
|
这个驱动的嵌套结构好像有点问题?
interrupt endp,这句是否应该去掉?? |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |