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