PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stack bei "Hallo Welt" Programm


Format C:
31.08.2002, 02:16
moin

folgendes Tutorial in der Doc von NASM :


An example of a NASM source file which can be assembled
to a .OBJ file and linked on its own to a .EXE is given here.
It demonstrates the basic principles of defining a stack,
initialising the segment registers, and declaring a start point.
This file is also provided in the test subdirectory of the
NASM archives, under the name objexe.asm.


segment code

..start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,stacktop

This initial piece of code sets up DS to point to the data segment,
and initialises SS and SP to point to the top of the provided
stack. Notice that interrupts are implicitly disabled for one
instruction after a move into SS, precisely for this situation, so
that there's no chance of an interrupt occurring between the
loads of SS and SP and not having a stack to execute on.

Note also that the special symbol ..start is defined at the
beginning of this code, which means that will be the entry point
into the resulting executable file.


mov dx,hello
mov ah,9
int 0x21

mov ax,0x4c00
int 0x21


segment data

hello: db 'hello, world', 13, 10, '$'

The data segment contains the string we want to display.


segment stack stack
resb 64
stacktop:



Frage 1: warum wird hier der Stack selbst angelegt ? Es wird doch in diesen kleinen Prog kein Byte an Stack gebraucht ?

Frage 2: Muß man in einen Assembler Programm die größe des Stacks selber festlegen ? Ich dachte immer das macht alles der Linker


Felix Kaiser
31.08.2002, 10:44
Man muss selber den Stackfestlegen. Die Stackgröße kann bis zu 64k betragen. In der Regel, wenn man diese Deklaration vergisst (mit Ausnahme Model TINY), weißt einen der Linker mit einer Warnung darauf hin. Der Stack wird bei Programmstart von EXE Files vom Betriebssystem gesetzt. Die Informationen stehen im EXE Header.

Und sobald CALLS (auch Interrupts) etc. im Spiel sind wird immer Stack gebraucht. Ein stackloses Programm zu benutzen ist riskant, da jederzeit ein IRQ die Ausführung unterbrechen kann und wenn dann kein Stack da ist, weniger gut.

Format C:
31.08.2002, 14:30
D.h. für die Zeichenkette 'hallo..... ' würde ich 28 Byte brauchen, weil beim INT die Rücksprungadresse auf den Stack gelegt wird und der SP immer um 2 erniedrugt wird ?

Felix Kaiser
31.08.2002, 14:37
Versteh grad nicht was du willst. Deine Message liegt im Datensegment, was willst du da mit Stack? Und mit PUSH kannst du immer nur Words und DoubleWords auf den Stack hauen. Es müssen nicht 2 Byte sein.

Format C:
31.08.2002, 14:51
ups, war ein leichter Denkfehler meinerseits.

bei einen INT wird doch das Flagregister auf den Stack gesichert (PUSHF). Wenn im Prog oben der INT 21h aufgerufen wird, wird also nur einmal was auf den Stapel gelegt.

Jan Krüger
31.08.2002, 23:33
die flags und die adresse, an der der int aufgerufen wurde (macht zusammen 6-10 bytes). wenn dann allerdings (wie felix schon sagte) noch irgendwelche hardware-interrupts dazwischenhauen, können mit dem stack (so vorhanden) schon mal merkwürdige sachen passieren, oder, wenn man keinen stack hat, ulkige nebenwirkungen auftreten.
außerdem weißt du ja gar nicht, was der int 21h noch für kunststücke mit dem stack anstellt. :)