
标题: [原创]com程序汇编开发工具(批处理版) [打印本页]
作者: netbenton 时间: 2009-2-16 04:05 标题: [原创]com程序汇编开发工具(批处理版)
[code:: made by NetBenton@cn-dos.net 2009-02-23
:: 最后修改:ver 1.2.0 2009-03-19
:: 用批处理写的用汇编开发com程序的工具。
:: 可输出com文件,及其相应的十六进制数据,数据可调用Debug还原成com文件。
::
:: 将产生以下临时文件:
:: %~n0in.asm默认代码文件 %~n0in0.txt预处理结果 %~n0in1.txt初定偏移结果
:: %~n0in2.txt最终处理结果 %~n0error.txt编译详细清单,出错时自动打开
:: %~n0.cod临时二进制文件 %%temp%%\%~n0defined.bat 保存工作环境
:: %~n0workout.txt DEBUG u和d命令的结果输出 %~n0.fc临时文件
::
::
:: 使用方法:
:: 在记事本里编辑程序,在本窗口进行调试、编译、及各种资料输出等操作。
:: 在记事本里进行保存后,不需退出,即可以在这里进行各种操作。
::
:: [Q]Quit [A]重开活动文档 [UD] DEBUG u和d命令的结果输出 [C]存为最终程序.com
:: [H]Help [R]重新编译一次 [G]取可用debug还原代码数据 [O]选择其它源码文件
:: [CMD]调用dos命令行 [RR]强制重新编译调试
::
::. 感谢您的使用,祝君好运。
::;前面为帮助信息显示的内容,临时文件是以主文件名+各自标识来命名的,会随主批处理改变而改变。
本工具开发过程中的各种历史版本在1楼
2009-03-18 最后修改在1楼,ver 1.3.0
此工具已经做到可以生成exe可执行文件了,并已经重新发贴。
从历史版本中可了解到工具的发展过程,中间算法经过了多次改动,一直在发展中,所以所编写的源码并不能通用。
为了速度,有些地方在源码语法错误处理上不是很好。
最新可处理exe版本请看:
http://www.cn-dos.net/forum/viewthread.php?tid=46756&fpage=1
贴上只处理com的最新修改:batcom.bat1.4.0
[ Last edited by netbenton on 2009-4-11 at 12:08 ]
附件
1:
batcom1.4.0.rar (2009-4-11 14:06, 8.89 K,下载次数: 45)
作者: ZJHJ 时间: 2009-2-16 10:10
不会用啊,详细解释一下。。。。。。。
作者: netbenton 时间: 2009-2-16 14:14
就是用来开发dos下的com_flie工具,这只是一个辅助工具,可以说是debug的扩展,
或者二次开发。要用的话,你得会汇编言语,以及DEBUG的用法,又或是你想学习汇编语言。
它的作用是: 用来快速编写dos下以com为扩展名的可执行程序的。就是你在文本编织器里写代码,保存后,可以马上在DEBUG里调试,省去了许多编译过程。
还有在写汇编程序时,遇到一些小功能及算法时,可以贴到这个工具里来调试,
它的特点是: 立杆见影,小巧,可识别指令错误,对初学习汇编者来说,作用很大。
具体用法:打开该工具BAT,会自动同时打开一个文本文件,在文本中输入你的汇编代码保存后,转到工具的BAT窗口(已经进入DEBUG)-,Q退出DEBUG 后,出现选择菜单([RR] [A] [UD] [G] [H] [R][C][O][CMD]):R回车,则自动编译你的汇编代码,完成后自动进入DEBUG,这时你就可以在调试你的代码了。各个临时文件可以看到编译的过程,方便检查调试,确认没有错误后,在选择菜单,输入C回车,就可以把你写的程序生成COM_file文件。
[ Last edited by netbenton on 2009-3-12 at 11:39 ]
作者: netbenton 时间: 2009-2-16 19:51
在论坛潜水二个月了,学到不少东西。中国DOS联盟是个好论坛。
代码的错漏肯定难免,毕竟是学艺不精。
哪位能不能给点建议,或指明Bug,谢谢!
=================================
[A]选项再次打开源码文件
[G]选项可生成代码的16进制数据,在批处理中,可用debug a命令还原,
[CMD]选项,调用cmd回到dos提示符,在命令行调试生成的com程序。
[O]选项,选择打开新的源码文件。
[ Last edited by netbenton on 2009-3-7 at 12:16 ]
作者: netbenton 时间: 2009-2-18 05:43 标题: 大家给点意见呀
今天改进了一下,增加了变量、宏、子程序的使用功能。增加了一个例子作使用说明。下载解压后,直接运行,便进入编写状态(记事本),另外还有个dos窗口,进行调试及输出到com文件。
现在用来它来写一个com程序已经不是问题了。由于标号可以在任可地方定义,有兴趣的的话,可以用来练习做动态代码。
大家一起帮帮忙,一起搞一个cmd版的汇编编译调试器。拜托了。
。。。。。
没人理的,掉下来了,自顶上去。。。
[ Last edited by netbenton on 2009-3-7 at 12:06 ]
作者: netbenton 时间: 2009-2-20 03:17
今天又做了修改:
1。修正了一些Bug,如:原来遇到and指令时会出错
2。把系统变量改为全部以#号结尾,
3。处理注释可以在行尾的问题,
4。把原代码修精简了一点,提高了速度,
5。把使用方法写得更详细,
6。并发现了一些因为dos局限性的问题,
代码还有待改进。。。
只可惜,没人肯出来指点一下,:(
02-20 发布的
batasm.rar ver 1.1.1
[url]http://rthost.fam.cx/cndos-up/img/1317.rar[/url]
02-23修改:
1.改正了不可直接,存取内存的问题。
2.增加了宏扩展时及子过程中对外标号的读取,以及外部指令对宏扩展时和子程序中的标号的读取。增强了宏及子程序的使用功能。
3.修正了,标号后不可跟指令及注释的问题。
4.增加了可以选择源码文件功能。并显示当前活动文件。同时,所有临时文件
自动存在与码的同一目录,不管批处理工具在什么地方。
5.处理了未修改文件时重复编译的问题。
6.改为全中文帮助,并更详细地说明如何使用。
7.工具继续保持只有一个文件,运行后生成几个临时文件,放在与该工具同一目录,是在进行编译时产的的临文件。
02-24 修改:
1.目录增加了两个选项,调用CMD命令行,及强制重新编译
2.修正了一些菜单选项的bug
3.增加了退出时自动关闭子窗口,及切换文件时关关闭旧文件
4.增加了自动记录上次打开的文件,并支持拖放打开
5.改正了set/a ver=11+33,结果不正确的问题。
[[i] Last edited by netbenton on 2009-3-12 at 11:39 [/i]]
作者: netbenton 时间: 2009-2-24 01:43 标题: 实例(一)可以用起来了^_^
CODE: [Copy to clipboard]
;com程序汇编开发工具,批处理版。版本1.1,由netbenton编写。
;ggb.com
;面向该工具的试验程序,功能:《根据参数设置光标位置》
;如执行ggb.com 12 34 后会把光标转到12行34列
;有了它,在批处理中可以定点显示。
set qu=4c00
set dos=21
set 读=3
set 置=2
set 显示=10
macro quit
mov ax,%qu%
int %dos%
endm
macro make ;数据结构定义
;第一位参数字节数,第二位为空格
#tes1 db 00 20
:参数首址
#tes2 dw %#old% %#str1% %#str2%
endm
#old a 80 ;保存原程序入口,并转地地址80
$make jp ;宏扩展,标识为:jp
;扩展后可以这样调用
mov ax,[#tes1.jp]
mov bx,[#tes2.jp]
;这里只作演示用
a 100
;程序开始
mov cl,[#tes1.jp]
cmp cl,5
jg #sok
mov dx,#str1
mov ah,9
int %dos%
jmp #quit
#sok mov si,#tes2.jp
call ##get
jcxz #error
call ##test
cmp al,19
jg #error
mov dh,al
call ##get
jcxz #error
call ##test
cmp al,50
jg #error
mov dl,al
push dx
mov ah,%读%
int %显示%
pop dx
mov ah,%置%
int %显示%
#quit $quit ;调用退出宏
#error mov ah,9
mov dx,#str2
int %dos%
jmp #quit
proc get
#lp
lodsb
cmp al,20
jnz #one
loop #lp
jmp #err
#one
mov bl,al
#tow
lodsb
cmp al,20
jnz #err
loop #tow
jmp #err
#err
endp
proc test
xchg ax,bx
sub al,30
sub bl,30
mov ah,a
mul ah
add al,bl
endp
;数据段定义
#str1 db "参数不够!$"
#str2 db "格式不对!$"
[ Last edited by netbenton on 2009-3-18 at 06:38 ]
作者: netbenton 时间: 2009-2-25 00:12 标题: 为什么只有一个文件关不了?
所有文本都是用记事本打开的。
在batasm.bat程序中使用:
taskkill /fi "windowtitle eq %~n0* " /IM NOTEPAD.EXE*
taskkill /fi "windowtitle eq %asm_file#%* " /IM NOTEPAD.EXE*
为什么除了,batasmin.asm文件
所有子窗口,及源码文件都可以关闭,如:
sub.asm
ggb.asm
batasmin0.txt,
batasmin1.tmp
batasmerror.txt
batasm.cod
batasmin2.tmp
batasm.fc
batasmworkout.txt
哪位高人能否指点一下,
小弟拜谢!
已经自己解决:只是把
taskkill /fi "windowtitle eq %asm_file#%* " /IM NOTEPAD.EXE*
改成:
taskkill /fi "windowtitle eq %asm_file#%" /IM NOTEPAD.EXE*
就可以了。
[ Last edited by netbenton on 2009-3-4 at 10:07 ]
作者: netbenton 时间: 2009-3-3 12:48
今天又做了一些修改,增加了点功能:
1,可以把标号定义到数据里,如:dw #abc #ddd #aaa
2,可以进行标号加减,如mov ax,#abc +2 或mov ax,#aaa - #ddd
3,可以重复定义数据,如:db 5 dup 6 或db 5 dup "zz" 或dw 6 dup 8
4,增加了主程序退出时,保存工作环境,和清理现场。
5,把对调试有用的临时文件改为文本文件.txt
至这里,该工具已经基本成型,已经可以用来方便的为dos批处理开发一些工具了。
本工具由本人原创,授权随意更改,只希望大家能更后给E我一份,谢谢大家使用。
贴上最新版本1.1.6
[ Last edited by netbenton on 2009-3-12 at 11:41 ]
作者: netbenton 时间: 2009-3-5 12:49 标题: 实例(二)
CODE: [Copy to clipboard]
;用于dos批处理中输入密码,显示*号。 输出pas.com
;用法:
;for /f "delims=" %%a in ('pas.com') do set pass=%%a rem 字符串
a 100
mov di,#str
mov ah,3
int 10
mov [#sadl],dl
#lp mov ax,0c07
int 21
;处理回车,退格,及所有控制符转为*号
cmp al,0d
jz #kf
cmp al,08
jz #sub
cmp al,20
ja #gta
jmp #nos
#sub cmp dx,#str +1
jb #lp
dec di
dec byte [#sadl]
call #aa.gba1 ;调用子程序gba1,从#aa标号开始
jmp #lp
#nos mov al,2a
#gta stosb
call ##gba1
jmp #lp
#kf mov ax,2424
stosw
mov ah,9
mov dx,#str
int 21
mov ax,di
sub ax,#str +2
mov ah,4c
int 21
;定义子程序 gba1
proc gba1
inc byte [^#sadl] ;子程序外的标号加^号
#aa mov dl,[^#sadl]
mov cx,1
mov ax,a2a
int 10
mov ah,2
int 10
inc cx
mov ax,a20
int 10
endp
;数据段
#sadl db 0
#str db "make by benton."
[ Last edited by netbenton on 2009-3-18 at 06:40 ]
作者: netbenton 时间: 2009-3-7 10:42
从上面的例子可看出,在这个工具里写一个com程序是完全可行的。
很直观,并易于调试。写一些小程序来增强dos下的功能变得很简单。
今天又改进了一点:
1,改进了重复定义数据时,80个字符长度的限制
2,修正了源码过长时,地址不正确的问题
3,改正了DB DW 原定义数据是后面不能注释的问题
4,增加了宏定义,扩展时参量的使用,
5,inc定义文件已经可以定义并使用。可将宏定义及变量设置集中到一个inc文件中,用
macro $ inc文件名
把inc文件包含进来,就可以使用了。如果文件找不到会报错。
使用时在宏名后面跟一个inc文件名作为后缀,如:
$abc.xxx jp 33 44 22
;如果宏不没有定义会报错
指扩展xxx.inc文件中的宏abc,标识为jp,"33 44 22" 分别为宏的1 2 3个参数。
=======================================
lib库不打算搞了,太难了,而且com小程序,没必要。再说大了,速度太慢。
因debug的限制,80386以后的汇编指令不能支持,但是可以通过宏定义来实现。
2009-03-07修改:
[ Last edited by netbenton on 2009-3-12 at 11:41 ]
作者: netbenton 时间: 2009-3-11 10:45
2009.03.09 进行了宏定义的增强,重复扩展,即如果标识为数字开头的话,进行该数字指定次数扩展,
$pr 3abc 1 2 3 4
相当于原来的:
$pr 3abc1 1 2 3 4
$pr 3abc2 1 2 3 4
$pr 3abc3 1 2 3 4
2009.3.11进行了db/dw重复定义的增强,引入%%n
即%%n 分别用a~b间的数重复定义,并与后面的表达式组合运算。
db/dw a dup %%n b [运算表达式]
相当于重复定义 %%n[表达式]
例:
1.定义1到9的平方表,
dw 1 dup %%n 9 *%%n
2.定义2到20间双数,
db 1 dup %%n 10 *2
最后修改在一楼。。。
这么少人回贴的。。。
[ Last edited by netbenton on 2009-3-12 at 08:00 ]
作者: xiaoyong12 时间: 2009-3-11 13:36
厉害,顶起
作者: netbenton 时间: 2009-3-12 13:13 标题: 哈哈,又增强了!
1,今天增加了目标代码的数据文件嵌入功能(除扩展名为exe/com外的所有文件),相当于lib库的嵌入了。当然最后的目标代码不能超过64K,这是com文件的极限。
用法:
a $ readme.txt
;把readme.txt文件嵌入到当前位置。如果文件找不到会在编译结果中报错。
可以把自述文件、各种文本,com程序(要改了扩展名后),等各种数据文件加到目标代码中。
下来我自己想不到还要增加什么功能了,看哪位高人能否给帮帮忙了。
为了节省空间及方便下载,中间楼层的版本已经删除,并集中打包,与最新版本一起放在1楼。
感谢dos联盟,能够写出这个工具,完全是在此潜水学习的结果,虽然以前写过纯dos下的批处理程序,但因纯dos的编能力实在太弱了,没有写出什么好东西来。
cmd的增强功能是来到cn-dos才学习的。所以这个工具的各个功能的实现完全的是集他人的成果合成。
本工具用到外部命令:
debug.exe、findstr.exe、fc.exe、attrib.exe、taskkill.exe、notepad.exe、chcp.exe、 graftabl.exe。
全部为winxp系统自带外部命令,可以说没有使用到三方软件。
本工具只有一个批处理文件,内包含了使用说明,以及使用例子演示,并且各个功能块都有注释,可以方便使用者自行修改增强。
感谢回贴的人,您的支持是我的动力。
希望该工具能给用得上的人带来一点点方便,
再次感谢dos联盟,及各位斑主。
谢谢!!
[ Last edited by netbenton on 2009-3-12 at 12:10 ]
作者: qicaiyunxia 时间: 2009-3-13 11:04
好东西~!!~
作者: netbenton 时间: 2009-3-18 13:03
还以为不能再增强了,今天又突破了条件汇编,可以支持以下编程了:CODE: [Copy to clipboard]
set equ=nz
set 大于=na
;前面为条件跳转定义,想用什么方式就用什么,只要先定义就可以了。
;支持多个else+多重if 嵌套
if ax equ 0
mov bx,3
else ax equ 10
mov bx,13
if cx 大于 100
mov cx,12
endif
endif
还可以这样进行宏定义:CODE: [Copy to clipboard]
macro call_bios ;$call_bios {标识@中断号} [功能号] [al:??] [bx:??] [cx:??] [dx:??]
%%set z%2$=mov %2,%3
%%set z%4$=mov %4,%5
%%set z%6$=mov %6,%7
%%set z%8$=mov %8,%9
%%zbx$%%
%%zcx$%%
%%zdx$%%
mov ah,%1
%%zal$%%
int %%mm#:~-2%%
%%set z%2$=
%%set z%4$=
%%set z%6$=
%%set z%8$=
endm
;以上可以定义所有中断调用
这样使用:CODE: [Copy to clipboard]
$call_bios int@10 0 al,12
结果为:
mov ah,0
mov al,12
int 10
$call_bios int@21 9 dx,#串首地址
结果为:
mov ah,9
mov dx,#串首地址
int 21
最后修改版本ver 1.2.0 在一楼,
如果能够灵活运用,功能还将更强,
[ Last edited by netbenton on 2009-3-18 at 11:12 ]
作者: linge 时间: 2009-3-18 23:19
谢谢拉,试试看了
作者: qingyuan0o0 时间: 2009-3-19 10:44
顶起~~没想到批处理还能做出这么强大的东西~~最喜欢VBS/BAT/HTML/这种可以直接编译的语言了..如果COM也可以那就太好了
作者: chenall 时间: 2009-4-1 13:29
不懂汇编,看着晕晕的,想学又不知从何学起,很羡慕会汇编编程的人,这些人一般都是高手级的.也是很早接触电脑的.
作者: DJ131452DJ 时间: 2009-4-5 16:19
谢谢分享,
作者: czl1378 时间: 2009-4-5 16:28
netbenton兄的东西。。佩服
作者: echoair 时间: 2010-2-21 21:34
感谢楼主的无私奉献…
作者: 68420799 时间: 2010-2-25 17:57
非常感谢,回家慢慢研究
作者: tachyon 时间: 2010-2-25 23:32
楼主也是一把好手!~ 很好很强大。
我来顶。
| 欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/) |
Powered by Discuz! 2.5 |