EN STOMME F�R K�LLKOD TILL EN .EXE-FIL
            --------------------------------------

St�rre program utformas vanligen s� att slutprodukten blir en
.EXE-fil. Det inneb�r att k�llkoden till en b�rjan utformas
annorlunda j�mf�rt med utformningen av k�llkoden f�r en .COM-fil.

F�ljande skiljer en .COM-fil fr�n en .EXE-fil:

1. Programkod, data och stack placeras i skilda segment, dvs CS-,DS-
  och SS-regitren har i motsats till en .COM-fil olika inneh�ll.

2. En .EXE-fil har ett annorlunda, av DOS skapat PSP �n en .COM-fil.
  Givetvis m�ste �ven n�r det g�ller .EXE-filer finnas information
  om kopplingen tillbaka till DOS n�r programmet avslutas.


Nedan f�ljer k�llkoden f�r filen Test3.ASM. N�gra p�pekanden:

1. Segmenten �r godtyckligt valda i ordning:

STACK - segment (H�gst i minnet = Sist i k�llkoden)
CODE  - segment
DATA  - segment (L�gst i minnet = F�rst i k�llkoden)

D� vi definierar Stacksegmentet skall ordet STACK finnas angivet. Vi
har full frihet att i f�rv�g fylla den area vi avdelar som
Stackarea med det vi finner l�mpligt.



TITLE Test3.ASM
;---------------------------------------------------------------------------
;Segmenten inf�res i ordning DATA-,CODE-,STACK-segment
;---------------------------------------------------------------------------
;===== Datasegmentet definieras
DSEG    SEGMENT
Buffer dw 1 dup (0)
DSEG    ENDS
;---------------------------------------------------------------------------
;===== CodeSegmentet definieras
CSEG    SEGMENT
       ASSUME CS:CSEG
;---------------------------------------------------------------------------
Start:  jmp Begin
;---------------------------------------------------------------------------
;===== Huvudprogram
Main    PROC FAR

       push ds                 ;V�rdet i DS-registret sparas inf�r �terhopp

       xor ax,ax
       push ax                 ;�ven '0' sparas inf�r �terhoppet

       mov ax,dseg
       mov ds,ax               ;DS-segmentv�rdet f�r v�rt program tillf�res
                               ;DS-registret

;- - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - -
       mov ax,1234             ; V�rt program
       mov buffer,ax
       mov bx,buffer
       ret
Main    ENDP
;----------------------------------------------------------------------------
;===== StackSegmentet definieras
SSEG    SEGMENT STACK
       db 5 dup ('STACK           ')
SSEG    ENDS
;============================================================================
Begin:  call Main
       ret                     ; -> DOS
;----------------------------------------------------------------------------
CSEG ENDS
END Start
;----------------------------------------------------------------------------


Vi skall ha klart f�r oss att DOS placerar PSP-arean f�r v�r
.EXE-fil p� f�rsta lediga plats i minnet. Denna plats kan
f�ljdaktligen variera fr�n maskin till maskin beroende p� vilka
minnesresidenta program som laddas in vid upstart av datorn.

L�t oss nu titta p� vad som finns i DS:0000.


-d ds:0000

1853:0000 CD 20 00 00 9a F0 FE-1D F0 F4 02 89 14 2F 03......
         -----

Vad betyder nu detta att instruktionen INT 20h finns placerad i
1853:0000? Jo, att vi p� ett eller annat s�tt m�ste hitta
tillbaka till just denna minnescell n�r vi l�mnar v�rt program.

Denna f�rberedelse m�ste vi sj�lva ombes�rja. Det g�r vi genom
att i b�rjan av v�rt program spara undan inneh�llet i
DS-registret p� stacken. Vi m�ste vidare spara undan
offset-v�rdet dvs 0000h.

Men eftersom vi kommer att arbeta i ett annat segment i samband
med exekveringen av programmett �n det segment som DS-registret
pekar p� vid inladdningen av programmet s� m�ste vi ladda om
DS-registret under k�rningen, s� att detta pekar p� 'v�rt'
Datasegment. Dessa �tg�rder m�ste �terfinnas som ett inledande
block d� vi skriver k�llkoden till en godtycklig blivande
.EXE-fil.