2016-04-18 1 views
1

J'ai réussi à créer des segments de pile, de données et de code distincts sous TASM en utilisant la directive SEGMENT, mais quelque chose me dérange toujours. Lorsque le code suivant est assemblé avec Turbo Assembler 2.0, TLINK produit un binaire dont la taille est de l'ordre de 90 Ko.Allocation de pile et de données en mode réel MZ .exe sous 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 

Maintenant, il me semble que le format de fichier MZ devrait permettre un .exe de préciser qu'il nécessite l'allocation de mémoire au-delà de ce qui est réellement contenue dans l'image binaire (via les min/paragraphes max de mémoire allouée en plus à l'entrée de la taille du code, je devine). Donc ma question est: comment est-ce qu'on amène l'assembleur/éditeur de liens à générer un fichier .exe avec l'en-tête approprié pour allouer de la mémoire sans inclure directement les valeurs d'espace réservé dans l'image binaire?

Répondre

3

Été un certain temps, mais je pense que vous pouvez réaliser ce que vous essayez de faire en plaçant le segment de code en premier. Placez ensuite toutes les données initialisées au début du segment data suivi de toutes les données non initialisées dans le segment data suivi du segment de pile qui n'est pas initialisé. Puisque toutes les données non initialisées ont été forcées à la fin, il ne sera pas nécessaire d'allouer de l'espace dans le fichier.

Votre code vous donnera probablement les résultats que vous voulez si elle ressemblait à:

.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

Cela a fonctionné. Chose amusante, je l'ai essayé moi-même il y a quelques heures à peine, et l'assembleur ne cessait de se plaindre de symboles inconnus pour les noms de segments! Je jure que c'était exactement la même chose que la vôtre, mais même avec le commutateur multipass/m2, il ne serait pas assemblé. Étrange. – chili

+1

@chili Vous avez peut-être déplacé les segments ** après ** 'start fin' plutôt qu'avant? –

+1

Je pense que vous pouvez avoir raison, o Merci l'homme! – chili