中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 超小的COM执行库(骨架只有150字节)
作者:
标题: 超小的COM执行库(骨架只有150字节) 上一主题 | 下一主题
本是
银牌会员





积分 2201
发帖 789
注册 2005-1-27
状态 离线
『楼 主』:  超小的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 [si-1],' '
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[bx]
  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 点积分     点击查看详情   
评分人:【 netbenton 分数: +2  时间:2009-3-7 13:41




my major is english----my love is dos----my teacher is the buddha----my friends--how about U
2008-11-15 11:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
19951001
高级用户

流落街头



积分 570
发帖 272
注册 2005-10-17
来自 北京
状态 离线
『第 2 楼』:  

楼主真是汇编真高手,支持一下

2008-11-15 11:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
本是
银牌会员





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



  Quote:
Originally posted by 19951001 at 2008-11-15 11:48:
楼主真是汇编真高手,支持一下

你是C++高手。我对汇编语言的复杂命令行处理还不太得心应手。也许你有些心得!



my major is english----my love is dos----my teacher is the buddha----my friends--how about U
2008-11-15 12:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 4 楼』:  

高手,偶收藏了,学习中。。。



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-3-7 13:42
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
gmy
版主

操作系统爱好者


积分 1113
发帖 392
注册 2002-11-11
状态 离线
『第 5 楼』:  

一个汇编高手、一个C++高手,都是真正的核心级高手。
我只不过算是一个批处理爱好者,太外围了。



DOS之家 http://doshome.com 站长 葛明阳
2009-3-8 12:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 6 楼』:  

正常的COM文件只在一个64K的段里面(数据和代码在一个代码段内,没堆栈段),所以理论上只要能分给它一个完整的64K段就可以保证它的正常运行。

2009-4-3 08:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: