PC: BCE
Previus Credits Index Next

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:

  1. a common initial part that are executed in COM or BAT mode
  2. a BAT line that gives result only if it is executed in COM mode
  3. a BAT line that gives the same result of point 2 but is not executed in COM mode
So a BCE program is a sequence of point 1, 2-3, 2-3, .. 2-3 where the points 2-3 make some equals result for BAT or COM mode.

Point 1

The first instruction we usually want that a BAT file performs is a disable of it's command output. This is done by

      @echo off
But 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.
This is my final version:
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.

Point 2

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...

Point 3

Due to the previous jump the instruction we need in this point is a normal BAT that is equals to the previous COM instruction.

Available instructions

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 10h
ECHO %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   yy
The 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.

 

Top
Pc Logo
PC Pc Logo Tognon Stefano programs