2012-03-25 17 views
1

Ich versuche, das folgende Programm (.EXE, nicht .COM) zu montieren und verknüpfen, bezogen auf das Beispiel in der NASM manual:Verknüpfung ein einfaches DOS-Programm (ASM), wLink warnt vor kein Stapelsegment

segment data 

hello: db "hello",13,10,"$" 

segment code 
..start: 
     mov ax,data 
     mov ds,ax 
     mov ax,stack 
     mov ss,ax 
     mov sp,stacktop 
     mov dx,hello 
     mov ah,9 
     int 0x21 
     mov ax,0x4c00 
     int 0x21 

segment stack stack 
     resb 64 
stacktop: 

I mit dem folgenden Befehl zusammenzusetzen (die nichts auf stdout erzeugt, sondern erzeugen test.obj):

nasm -Wall -f obj test.asm 

und Verbindung mit dem folgenden Befehl (dies ist OpenWatcom 1,9 wLink):

wlink name test.exe format dos file test.obj 

Das gibt mir die folgende Ausgabe (einschließlich einer Warnung):

Open Watcom Linker Version 1.9 
Portions Copyright (c) 1985-2002 Sybase, Inc. All Rights Reserved. 
Source code is available under the Sybase Open Watcom Public License. 
See http://www.openwatcom.org/ for details. 
loading object files 
Warning! W1014: stack segment not found 
creating a DOS executable 

Das Handbuch erklärt:

Der obige Code deklariert einen Stapel Segment 64 Bytes nicht initialisierte Stapelspeicher enthält, und Punkte "stacktop" an der Spitze. Der Anweisungssegmentstapelstapel definiert ein Segment, das "Stapel" genannt wird, und auch vom Typ "STACK". Letzteres ist für die korrekte Ausführung des Programms nicht notwendig, aber Linker geben wahrscheinlich Warnungen oder Fehler aus, wenn Ihr Programm kein Segment vom Typ 'STACK' hat.

Was fehlt mir?

Antwort

2

In NASM-Code müssen Sie das Stack-Segment als eine Klasse von Stack markieren.

Auch DOS wird SS und SP für Sie laden, bevor Ihr Programm startet.

Schließlich ist 64 Bytes Stack etwas zu wenig. Interrupt-Service-Routinen verwenden den aktuellen Stapel und wenn dieser zu klein ist, überschreiben sie Code oder Daten in der Nähe.

Dies ist, wie man es beheben:

segment data 

hello: db "hello",13,10,"$" 

segment code 
..start: 
     mov ax,data 
     mov ds,ax 

;  mov ax,stack 
;  mov ss,ax 
;  mov sp,stacktop 

     mov dx,hello 
     mov ah,9 
     int 0x21 
     mov ax,0x4c00 
     int 0x21 

segment stack class=stack 
     resb 512 ; 64 is too little for interrupts 
;stacktop: 
+2

ich so weit gehen würde, wie 4K zu sagen, ist kaum groß genug für einen DOS jetzt stapeln, alle Müll Treiber betrachtet, die zusammen mit in DOS den letzten Tagen stark vermehrt die Komplikationen, die bestimmte DOS-Emulatoren mit sich bringen. – JimR

+0

@ JimR: Könnte sein. –

+0

@JimR: Ich bin froh, dass es immer noch Leute da draußen gibt, die sich an dieses Zeug erinnern. Du warst eine große Hilfe. –