![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-05 04:56 |
共 47,813 主题排行 / 349,918 发帖 / 今日 0 篇 / 48,281 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 超小的COM执行库(骨架只有150字节) |
| 可打印版本 1,862 / 5 |
| 第1楼 本是 | 发表于 2008-11-15 11:28 |
| 银牌会员 发帖 790 积分 2,227 | |
|
超小的COM执行库(骨架只有150字节) 超小的COM执行库(骨架只有150字节)
我在开发VT系列字模载入软件的过程中,一般是先开发该功能的独立程序,等到一定时候再合成。合成前,可能有一段想集成多个COM文件为一个库的想法,DOS过一定时间的人肯定会想到XEQ.com但它比较“大”——虽然只有5、6K,因为我常常开发小型COM文件好几个加起来还不到5、6K,所以就想到自己搞个简易COM库。现在终于调试成功了。直够小的——才150字节!可是调试所花的时间却无法想象,特别是在命令行出现重定向符的时候。 汇编源代码如下: COMMENT \ 超小的COM库K.com—— 如果你某一主题下有10个独立.COM程序,都不大,加起来不超过60K, 那么你可以用以下的办法将它们集合成一个库程序,执行时只在原命令行 参数前增加一个数字0到9和一个空格,就可以了. 虽然已经有了个功能更加强大的XEQ.COM,但且不论它体积小巧(只增 加150字节,不算上帮助信息的长度),此程序完全自主版权,拥有源程序, 自己怎么扩充/修改/加密/等等都行. 如果增加大写/小写字母的判断,命令数量可轻松地加到66个或更多! 程序结构—— JMP 预处理程序块 库程序块: 库帮助程序 库程序0 库程序1 库程序2 ... 库程序9 预处理程序块: 命令行取单数字命令并转换成库程序起始位置 命令行用空格填充命令数字 命令行从第1个非空格字符位置起搬移到命令行常规起始位置DS:81h并修正命令行长 按最大程序长度搬移库程序从存储起始位置到执行起始位置DS:100h 跳转到DS:100h执行该库程序 程序库构建须知—— 1)要保证执行搬移的预处理程序块不在最大预留空间之内,以免被覆盖! 2)因为库中程序或数据会被覆盖(而误执行)/分断(而不可预测)/搬移(而寻址错), 所以要保证搬移后执行的程序行或调用的数据,要么在已全部在搬移部分中, 要么在未被覆盖的未被搬移的程序块(含预处理程序块)之中(含之后)! 3)库的命令行除了单数字命令外,可直接跟或加空格后跟上原单个程序的命令行参数, 命令行上的重定位符号要与它前面的参数隔开至少1个空格,否则可能被忽略! 程序执行后提示—— K 0 0 K 1 1 K 2 2 K 3 3 K 4 4 K 5 5 K 6 6 K 7 7 K 8 8 K 9 9 (0-9为合法命令) K ? (无命令) K a ? (非法命令) \ .286 CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100h START: jmp _real help: db 0BAh,8,1,0B4h,9,0CDh,21h,0C3h db '?' ;此处增加你的帮助信息 db '$' ;此行必须保留! ;注意:所有库程序必须独立正常编译后由.COM二进制数据转换而来, ;有绝对地址调用的要特别小心,因为要搬移其到DS:100h后才执行的! MaxSizeProg label byte proc9:inc al proc8:inc al proc7:inc al proc6:inc al proc5:inc al proc4:inc al proc3:inc al proc2:inc al proc1:inc al proc0:inc al add al,'0'-1 int 29h ret LenOfMaxSizeProg=$-MaxSizeProg ;库中最长的单个程序!此处指proc9 _real: push 100h ;保存地址(为ret) pusha ;保存现场(为popa) push cs pop es xor ah,ah mov si,80h cld lodsb mov cx,ax or al,al jnz trim _err: mov al,'/' jmp short $+3 trim:lodsb cmp al,0Dh jz cmdend cmp al,' ' jz trim cmp al,'/' jb _err cmp al,'9' ja _err sub al,'/' mov bx,ax shl bx,1 mov byte ptr ,' ' cmdend: push bx mov di,80h push di inc di mov si,di jmp short $+3 isspc: dec cx lodsb cmp al,' ' jz isspc dec si mov al,cl inc cx rep movsb pop di stosb pop bx mov si,begTab mov di,offset start mov cx,LenOfMaxSizeProg rep movsb popa ;恢复pusha中保存的现场 ret ;跳转到push 100h中的DS:100h处,即通常的程序起始执行地 even begTab label word dw offset help ;没有命令/非法命令 dw offset proc0;'0' dw offset proc1;'1' dw offset proc2;'2' dw offset proc3;'3' dw offset proc4;'4' dw offset proc5;'5' dw offset proc6;'6' dw offset proc7;'7' dw offset proc8;'8' dw offset proc9;'9' CODE ENDS END START |
|
| 第2楼 19951001 | 发表于 2008-11-15 11:48 |
| 高级用户 发帖 272 积分 570 来自 北京 | |
|
楼主真是汇编真高手,支持一下
|
|
| 第3楼 本是 | 发表于 2008-11-15 12:10 |
| 银牌会员 发帖 790 积分 2,227 | |
Originally posted by 19951001 at 2008-11-15 11:48: 你是C++高手。我对汇编语言的复杂命令行处理还不太得心应手。也许你有些心得! |
|
| 第4楼 netbenton | 发表于 2009-03-07 13:42 |
| 银牌会员 发帖 752 积分 1,916 来自 广西 | |
|
高手,偶收藏了,学习中。。。
|
|
| 第5楼 gmy | 发表于 2009-03-08 12:23 |
| 版主 发帖 392 积分 1,113 | |
|
一个汇编高手、一个C++高手,都是真正的核心级高手。
我只不过算是一个批处理爱好者,太外围了。 |
|
| 第6楼 netwinxp | 发表于 2009-04-03 08:16 |
| 高级用户 发帖 366 积分 741 | |
|
正常的COM文件只在一个64K的段里面(数据和代码在一个代码段内,没堆栈段),所以理论上只要能分给它一个完整的64K段就可以保证它的正常运行。
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |