2016-04-18 22 views
1

Es ist mir gelungen, separate Stack-, Daten-und Code-Segmente unter TASM mit der SEGMENT Direktive zu erstellen, aber etwas stört mich noch. Wenn der folgende Code mit Turbo Assembler 2.0 assembliert wird, erzeugt TLINK eine Binärdatei, deren Größe in der Nähe von 90 KB liegt.Zuordnung von Stack und Daten in einem Real-Modus MZ .exe unter Turbo Assembler 2.0

.286 

myStack segment para stack 'stack' 
db 0FFFFh dup (?) 
ends myStack 

myData segment para 'data' 
msg db 'Memes!$' 
db 7FFFh dup (?) 
ends myData 

myCode segment para 'code' 
assume cs:myCode 
assume ss:myStack 

start: 
mov ax,myData 
mov ds,ax 

push offset msg 
call write 
add sp,2 

mov ah,4ch 
int 21h 

write: 
push bp 
mov bp,sp 
mov dx,[bp+4] 
mov ah,9h 
int 21h 
pop bp 
ret 

ends myCode 
end start 

Nun scheint es mir, dass das MZ-Dateiformat eine Exe ermöglichen sollte festlegen, dass es Speicherzuweisung über erfordert, was in dem binären Bild tatsächlich enthalten ist (über die min/max Absätze Speicher zusätzlich zugewiesen zu dem Code-Größeneintrag ich rate).

Also meine Frage ist: wie koaxiert man den Assembler/Linker in eine .exe mit der entsprechenden Kopfzeile für die Zuweisung von Speicher zu generieren, ohne direkt Platzhalter Werte in das Binärbild aufzunehmen?

Antwort

3

Schon eine Weile, aber ich denke, dass Sie erreichen können, was Sie versuchen, indem Sie zuerst das Code-Segment platzieren. Platzieren Sie anschließend alle initialisierten Daten am Anfang des Segments data, gefolgt von allen nicht initialisierten Daten im Segment data, gefolgt vom Stapelsegment, das nicht initialisiert ist. Da alle nicht initialisierten Daten bis zum Ende erzwungen wurden, ist es nicht erforderlich, den Speicherplatz in der Datei zuzuordnen.

Ihr Code würde Ihnen wahrscheinlich die gewünschten Ergebnisse, wenn es ausgesehen:

.286 

myCode segment para 'code' 
assume cs:myCode 
assume ss:myStack 

start: 
mov ax,myData 
mov ds,ax 

push offset msg 
call write 
add sp,2 

mov ah,4ch 
int 21h 

write: 
push bp 
mov bp,sp 
mov dx,[bp+4] 
mov ah,9h 
int 21h 
pop bp 
ret 

ends myCode 

myData segment para 'data' 
msg db 'Memes!$'    ; Initialized data first 
db 7FFFh dup (?)    ; Uninitialized data after all initialized data 
ends myData 

myStack segment para stack 'stack' 
          ; Leave blank, this will allow the stack to 
          ; to use the full 64k segment 
ends myStack 

end start 
+0

Das funktionierte. Lustig ist, dass ich es vor ein paar Stunden selbst ausprobiert habe und der Assembler sich über unbekannte Symbole für die Segmentnamen beschwert hat! Ich schwöre, es war genau das gleiche wie Ihres, aber selbst mit dem/m2 Multipass-Schalter würde es nicht zusammenbauen. Seltsam. – chili

+1

@chili Möglicherweise haben Sie die Segmente ** nach ** 'Endstart' verschoben anstatt vorher? –

+1

Ich denke du magst Recht haben, o Danke, Mann! – chili