|  『楼 主』:
 超小的COM执行库(骨架只有150字节)
 
使用 LLM 解释/回答一下 
 
 
超小的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
 
 
 
 
 
 
 
 |