ali@bradley.UUCP (08/26/84)
#N:bradley:900004:000:3796
bradley!ali Aug 12 23:16:00 1984
[]
I'm not sure how familiar you are with the structure of COM files but
basicaly a COM file is a memory image of an executable code with or without
data fields. The loader portion of the DOS performs the following before
giving control to the module:
[] a Program Segment Prefix is built and the appropriate parts of that
prefix is initialized(such as FCB1, FCB2, the INT 20H instruction at
offset 0, this is covered in detail starting on page E-3 in the DOS
manual)
[] All the general purpose registers are set to zero, all the segment
registers are set to the segment address of the PSP(Program Segment
Prefix)
[] The Instruction pointer(IP register) is set to 100H.
[] The COM file is read in at location 100H(this is a straight load
without any modification, editing or relocation)
[] a word of zero is pushed on the stack(since SP is zero from step 2,
the zero word is actually now at the very end of the segment. The
zero word serves as a return address to location zero which contains
the instruction INT 20H)
[] finally control is transfered through a long jump to PSP:100H
(this is how CS and IP are set)
It is very common to make the first three bytes in a COM file a jump
to the program start address(this is done by the programmer and not by the
loader or any other part of the system, usually to make it possible to
put data items before they are refernced in the code, this way the assembler
can generate the correct code knowing the size of the data items)
Creating COM files is restricted by the following:
1) The program may not contain any DATA segments ( you can change the DS
later in your code to point to anything you want, but the header of
EXE file produced by the linker must not contain a DATA segment)
2) there must not be a stack segment (this is trivial since a stack will
be setup by the loader, and there is really no need for the program
to have a seperate stack unless the program is very large, in which
case you can relocate the stack during the initialization part of your
program)
3) The entry point must be at 100H. If you did not specify an entry point
using
END entry-point
statement in your program, in which case the linker assumes entry point
at CS:0 and sets the entry point address in the EXE file header to that,
so exe2bin will perform a simple conversion to produce a COM file. If on
the other hand you did specify an entry point then you better use the
ORG 100H
statement to move the program up, since exe2bin will delete the fisrt
100H locations while converting this EXE file to a COM one and it
better not be part of your program.
In any case try something close to the following format:
CODE SEGMENT
ASSUME CS:CODE
ORG 100H
BEGIN PROC NEAR
JMP INIT
BEGIN ENDP
MSG DB 'Hello world.',0DH,0AH,24H
INIT PROC NEAR
MOV DX,OFFSET MSG
MOV AH,9
INT 21H
RET
INIT ENDP
CODE ENDS
END BEGIN
ofcourse you can ommit the PROC ENDP stuff and use labels followed by
colons. Also you can name the segment so it will be combined with other
segments of the same name in a separately assembeled program but I suggest
you make it relocatable on paragraph boundary.
CODE SEGMENT PARA PUBLIC 'name'
I hope this will help you write COM programs, and I'm sorry for length
of this response, reading it back I noticed that I have included a lot of
information that is already available in the DOS manual.
good luck.
Ali Ezzet {ihnp4,uiucdcs}!bradley!ali