Board logo

标题: [原创]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