![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-01 20:01 |
共 48,037 主题排行 / 350,122 发帖 / 今日 2 篇 / 48,249 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 请教,如何编写一个能在CONFIG.SYS运行的SYS格式的文件。 |
| 可打印版本 2,080 / 10 |
| 第1楼 Chearv | 发表于 2006-02-19 11:22 |
| 初级用户 发帖 15 积分 36 | |
|
请教,如何编写一个能在CONFIG.SYS运行的SYS格式的文件。 不管是用C还是汇编最终编译得到的不是COM文件就是EXE文件,请问要用什么方法才能得到SYS格式的文件呢?我想编写一个能在CONFIG中加载的程序。我在网上找了好久都没能找到这方面的资料。我只知道有什么Device Driver header Device Driver codes的构架 ,但具体的我就没找到了。 有人能提供我一些SYS文件的格式吗?最好附上一段源代码。
先谢谢各位了。 |
|
| 第2楼 本是 | 发表于 2006-02-19 14:46 |
| 银牌会员 发帖 790 积分 2,227 | |
|
但此处的COM/EXE与普通的同类文件结构和入口上有天壤之别。给你几个源文件,你对照着研究,应该能较快入门。只是详细注释是英文的。你搞懂了SYS的结构后,再跟你讲SYS/EXE合一的"EXE"文件--像我的VTmagic.com能生成的EXE。
抱歉:附件我发不上来,邮到你的信箱! [ Last edited by 本是 on 2006-2-19 at 14:51 ] |
|
| 第3楼 Chearv | 发表于 2006-02-19 15:31 |
| 初级用户 发帖 15 积分 36 | |
|
我先去看看,多谢本是。
|
|
| 第4楼 Chearv | 发表于 2006-02-19 17:49 |
| 初级用户 发帖 15 积分 36 | |
|
本是,你好,你发的信件我已经收到了。但我的英文水平太低了,基本看不懂。想问你一下,
; Device header for ROT13 dd -1 ; Link to next driver, set by dos ; always set to FFFFFFFF by default, let ; dos take care of it later 链接下一驱动是什么意思?我看了很多SYS文件前四个字节都是FF。 dw 0A800h ; Device attributes 这个设备属性又是什么意思? 我基本不懂汇编,能否用C写这类程序呢?如果不行,你能不能用汇编写一个简单的类似于Hello,world这样的程序让我参考一下? |
|
| 第5楼 Chearv | 发表于 2006-02-19 18:47 |
| 初级用户 发帖 15 积分 36 | |
|
再仔细看了一下。好像接下来就是两个段了,
dw offset Strategy ; Strategy, called prior to calling the ; interrupt dw offset Interrupt ; The interrupt does the gruntwork ; the term interrupt in this case ; is used rather liberally 我理解是,运行的程序代码是在Interrupt中。是不是这样的,如果是,那么那个Strategy是干什么用的?是不是还应该有个BPB (BIOS参数块)? |
|
| 第6楼 kongying75 | 发表于 2006-02-20 09:14 |
| 初级用户 发帖 7 积分 150 | |
|
楼上的兄弟,可否给俺一份,俺也要做dos下的device driver,俺的邮箱是kongyuchu@163.com,谢谢!请问本是朋友,你可否有c语言版的dos device driver?俺急需这方面的资料,谢谢!
|
|
| 第7楼 Chearv | 发表于 2006-02-20 17:05 |
| 初级用户 发帖 15 积分 36 | |
|
这方面的资料国内比较少。我把本是发给我的转发给你吧,希望对你有用。
|
|
| 第8楼 本是 | 发表于 2006-02-20 17:22 |
| 银牌会员 发帖 790 积分 2,227 | |
|
《MS-DOS高级开发指南》(希望公司91年版)一书中有两章专门讨论SYS文件结构。找一找。搜一搜。
另外有网上以“设备驱动程序”、“SYS程序”等关键词再搜搜。 |
|
| 第9楼 本是 | 发表于 2006-02-20 17:24 |
| 银牌会员 发帖 790 积分 2,227 | |
|
过几天,等我闲一点给一份我注释的简单SYS的源码。
|
|
| 第10楼 本是 | 发表于 2006-02-24 21:23 |
| 银牌会员 发帖 790 积分 2,227 | |
|
下面是一个完整的.SYS的源程序,用中文详细注释,用途在其中有清楚说明。
title ECHO - 通过设备驱动程序完成简单任务 ; (c)2005 版权所有 ; 罗明安(本是) ; lmayylxt@pub.sz.jsinfo.net ; 本MS-DOS设备驱动程序用于 CONFIG.SYS: ; device=echo.sys 参数 ; MS-DOS 5以上的版本在用户设备驱动程序收到参数之前已经将其大写 ; 所以本程序的任务就是: ; 1.将" "内的参数小写 ; 2.临时需要的单个大写字母用^引导,如: ; device=echo.sys H"I. ^T"HIS IS A SAMPLE STRING FOR" MS-DOS CONFIG.SYS. ; 上一行将显示为: ; Hi. This is a sample string for MS-DOS CONFIG.SYS. CR equ 13 ; 回车 LF equ 10 ; 换行 ; MS-DOS 请求定义 Request struc Rlength db ? ;+0 长度 Unit db ? ; 1 单元 Command db ? ; 2 命令 Status dw ? ; 3 状态 Reserve db 8 dup(?) ; 5 保留 Media db ? ; 0D 介质 Addroff dw ? ; 0E 偏移地址 Addrseg dw ? ; 10 段地址 Nameoff dw ? ; 12 名称偏移地址/计数器 Nameseg dw ? ; 14 名称段地址/扇区 Request ends DevD segment word header label word dw -1,-1 dw 0000h ;空设备;/字符/块设备 dw offset init ;/策略=初始化而不安装任何东西 dw offset interrupt ;/命令 db 1,7 dup(0) ; /'设备名称' ; 总是最先执行 interrupt proc far xor ax,ax ret interrupt endp init_msg: db CR, LF, 'ECHO v1.0', CR, LF db ' (C)2005 版权所有 罗明安(本是)' db ' e-mail: lmayylxt@pub.sz.jsinfo.net', CR, LF, '$' ; 执行部分从此开始 ; es:bx 指向请求头 init proc far assume cs: DevD, ds: DevD mov dx, offset init_msg mov ah, 9 int 21h mov di, bx push di push es mov si, es: ; config.sys中设备名称偏移址 mov ds, es: ; config.sys中设备名称段地址 ; 跳过设备名称前的空格 trim_beginning: lodsb cmp al, ' ' jbe trim_beginning ; 跳过设备名(转成大写) find_driver: lodsb cmp al, ' ' ja find_driver ; 跳过尾随的空格 trim_end: lodsb cmp al, ' ' jbe trim_end dec si ; si 已经越过第一个字符 ; ds:si 现在指向命令行参数或回车符如果无参数 ;;用户任务在此! echo_: ;大小写=UPPER"lo^Wer"UPPER xor bx,bx ;清引号标志 lodsb cmp al,' ' jnz cmpOthers jmp short echo_1 echo_1: lodsb ;如为回车, 退出 cmpOthers: cmp al,0Dh jbe echo_4 cmp al,'"' ;测双引号 jne echo_2 not bl ;开引号标志 cmp byte ptr ds:,'"' jne echo_1 inc si ;跳过多余引号 not bl ;关引号标志 jmp echo_3 echo_2: or bl,bl ;看是否在引号内 je echo_3 cmp al,"^" ;是暂时的单个大写吗? jnz ifUpper lodsb cmp al,0Dh jbe echo_4 and al,0DFh ;转大写 jmp short echo_3 ifUpper: cmp al,'A' ;比'A'? jb echo_3 ;小,直接显示 cmp al,'Z' ;比'Z'? ja echo_3 ;大,直接显示 or al,20h ;转小写 echo_3: mov ah,2 ;字符显示 mov dl,al int 21h jmp short echo_1 echo_4: mov ah,2 ;字符显示 mov dl,0dh ;换行回车 int 21h mov dl,0ah int 21h echo_exit: mov ax,0100h ;完成 jmp short done quit: mov ax,8103h ;出错 done: pop es pop di mov byte ptr es:, 0 ; 安装0个单元 mov word ptr es:, 0 ; 空闲内存偏移址 = 0 mov es:, cs ; 空闲内存段地址 mov word ptr es:, ax ; 返回代码 = 8000h : 设置出错码 ret ; + 100h : 完成 ; + 3h : 未知错 init endp DevD ends end |
|
| 第11楼 Chearv | 发表于 2006-05-04 15:29 |
| 初级用户 发帖 15 积分 36 | |
|
本是这么一写,我对SYS文件的结构也略知一二了。 多谢。
不知道,你能不能再介绍一下SYS和EXE合一的文件结构。 |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |