|
|
|
In 1995 I try to experiment a new kind of programming technique: it is possible to have a program that make the same result if it is executed by the Dos batch process or directly from machine language? In other words, can a BAT file be executed like a COM file and produce the same results?
I find a solution that codify in a program that generate this file that I simple call Bat Com Equal (BCE). if you have a BCE file, you must rename it into BAT or COM extension, run it and obtain the same (99%) equal result.
How this is possible?
The solution is to divide the program into 3 part:
The first instruction we usually want that a BAT file performs is a disable of it's command output. This is done by
@echo offBut what happen if we execute the previous code using it like machine code?
ASCII HEX ASSEMBLY
@ 40 inc ax
e 65 arpl [bx+si+6F],bp
c 63
h 68
o 6F
20 and [bx+66],eax
o 6F
f 66
f 66 ...
How you can see the machine execution is not possible because we modify some
memory locations that we don't know.
Well, we can try with the upper case mode:
ASCII HEX ASSEMBLY
@ 40 inc ax
E 45 inc bp
C 43 inc bx
H 48 dec ax
O 4F dec di
20 and [bx+46],cl
O 4F
F 46
F 46 inc si
This is little better, but the use of the space give us an operation that
modify memory location, so the space will be substituted.
ASCII HEX ASSEMBLY
@ 40 inc ax
E 45 inc bp
C 43 inc bx
H 48 dec ax
O 4F dec di
0A or cl,[bx+46]
O 4F
F 46
F 46 inc si
0A or cl,[di]
0D
0A or al,[...]
xx other line with ECHO of point 2
yy
In this version I use the change row key instead of the space, and a combination
of change row, return, change row to finish the BAT instruction.
In point 2 we want a line that do nothing in BAT mode, but do something in COM mode. The instruction is so like this:
ECHO ..... >NULL
In fact this instruction in BAT mode produce a echo in the null file of it's body
(the .....). So look at the machine code:
ASCII HEX ASSEMBLY
E 45 inc bp
C 43 inc bx
H 48 dec ax
O 4F dec di
0A or ah,[bx+si]
20
.....
74 je xx+2
xx+2
75 jne xx
xx
> 3E
N 4E
U 55
L 6C
0D
0A
How you can see this is the form of the instruction we need: it is in the form
we want for the BAT, and due to the 0Ah, 20h, we can put the COM body where
there's the points. At the end of COM, I insert a jump to xx, the next
instruction of point 2, so the 3 point is simple...
Due to the previous jump the instruction we need in this point is a normal BAT that is equals to the previous COM instruction.
End of Program
HEX ASSEMBLY
CD int 20h
20
Write a string
HEX ASSEMBLY
E8 00 00 call $+1
5A pop dx
0E push cs
1F pop ds
83 C2 xx add dx,00xx
8B DA mov bx,dx
83 C3 yy add bx,yy
C6 07 24 mov [bx],'$'
B4 09 mov ah,09
CD 21 int 21h
In this case the string must not contains the $ char, and the address of string
is taken from BAT instruction of point 3 (so only one string is needed).
Clear Screen
HEX ASSEMBLY B4 0F mov ah,0f CD 10 int 10h B4 00 mov al,00 CD 10 int 10hECHO %1
HEX ASSEMBLY B4 62 mov ah,62h CD 21 int 21h 53 push bx 1F pop ds BE 82 00 mov si,82h 3E 8A 14 yy: mov dl,ds:[si] 80 FA 20 cmp dl,20h 74 10 je xxxx FE CA dec dl 80 FA 0C cmp dl,0C 74 09 je xxxx FE C2 inc dl B4 02 mov ah,02 CD 21 int 21h 46 inc si EB E8 xx: jmp yyThe BCE generator is a C program containing the above coded instructions: all you need is to give it the call to the instructions you want to generate.
Download the BCE (2K) source package.
| PC |