| Membre inscrit |
 |
| Hors-ligne |
| | |
Inscription : 01 sept. 2008 19:07
|
| |
|
|
Sous DOS, pour qu'une application puisse lancer un programme fils, il faut qu'elle diminue la mémoire qui lui est réservée car elle s'en approprie la totalité. Cela vaut surtout pour les fichiers au format COM car on peut limiter la mémoire supplémentaire allouée à un fichier au format EXE MZ lors du liage (LINK /CPARMAXALLOC:paragraphes). Par contre, vu que le MS-DOS 4 européen est multitâche et que le format NE divise les segments en blocs dont la taille peut différer selon le liage, on est en droit de penser que cette précaution n'est plus valable. Ce qui est vrai.
Voyez le programme fils au format EXE MZ :
; Attention ! programme pour DOS 2 et supérieur.
; Assemblage : MASM FILS;
; LINK FILS;
code segment
assume cs:code,ds:data
Debut:
mov ax,data ;Fait pointer DS sur DATA
mov ds,ax
mov ah,9 ;Affiche chaîne ASCII$ en DS:DX
mov dx,offset Message$
int 33 ;Appel DOS
mov ah,4Ch
int 33
code ends
data segment
Message$ db '* Ne fait rien de spécial *',13,10,'$'
data ends
pile segment stack
db 256 dup(?)
pile ends
end Debut
|
Comparez ensuite le programme père au format MZ à celui au format NE :
; Attention ! programme pour DOS 2 et supérieur.
; Assemblage : MASM PERE2;
; LINK PERE2;
dgroup group data,pile
CODE SEGMENT
assume cs:code, ds:dgroup
MAIN PROC FAR
mov ax,dgroup
mov ds,ax
mov ah,4Ah ;Diminue l'allocation mémoire au minimum
mov bx,Taille ;Nombre de paragraphes à garder
int 33
push ds
pop es
mov segpile,ss ;Sauve la pile
mov ptrpile,sp
mov ax,4b00h ;Exécute un programme fils
mov dx,offset nom ;ds:dx -> spécification du fils
mov bx,offset params ;es:bx -> bloc de paramètres
int 33
cli ;Evite un bug des premiers 8088
mov ss,segpile ;Restitue la pile
mov sp,ptrpile
sti
push ax ;Dépose l'éventuel code d'erreur
mov ax,dgroup ;Restaure DS
mov ds,ax
mov ah,9 ;Affiche le message ASCII$ en DS:DX
mov dx,offset Echec$
jc Message ;Echec du chargement
mov dx,offset Succes$
Message:
int 33
pop ax ;Récupère le code d'erreur
jc Fin ;Echec du chargement
xor al,al ;ERRORLEVEL nul si pas d'err.
Fin:
mov ah,4Ch ;Quitte
int 33
MAIN ENDP
Taille1B equ $-CODE
CODE ENDS
DATA SEGMENT BYTE
nom db 'FILS.EXE',0
params dw envir
dd lncmd
dd fcb1
dd fcb2
lncmd db 0,13
fcb1 db 0
db 11 dup(' ')
db 25 dup(0)
fcb2 db 0
db 11 dup(' ')
db 25 dup(0)
segpile dw (?)
ptrpile dw (?)
Echec$ db 'Fils non chargé',13,10,'$'
Succes$ db 'Le fils s',39,'est exécuté',13,10,'$'
Taille2 equ $-DATA
DATA ENDS
ENVIR SEGMENT PARA ;L'environnement doit débuter un parag.
db 'PATH=',0
db 'COMSPEC=A:\COMMAND.COM',0
db 0
Taille3 equ $-ENVIR
ENVIR ENDS
PILE SEGMENT STACK
DB 256 dup(?)
Taille4 equ $-PILE
PILE ENDS
Taille equ (256+ Taille1B +Taille2+15 +Taille3+15 +Taille4+15) / 16
END MAIN
|
; Programme pour MS-DOS 4 multitâche.
; Assemblage : MASM PERE4;
; LINK4 PERE4;
; Code source compatible avec MS-DOS 2 avec le liage suivant par exemple.
; Assemblage : MASM PERE4,PERE;
; LINK PERE4,PERE /CP:1;
dgroup group data,pile
CODE SEGMENT PUBLIC
assume cs:code, ds:dgroup
MAIN PROC FAR
mov ax,dgroup
mov ds,ax
push ds
pop es
mov segpile,ss ;Sauve la pile
mov ptrpile,sp
mov ax,4b00h ;Exécute un programme fils
mov dx,offset nom ;ds:dx -> spécification du fils
mov bx,offset params ;es:bx -> bloc de paramètres
int 33
cli ;Evite un bug des premiers 8088
mov ss,segpile ;Restitue la pile
mov sp,ptrpile
sti
push ax ;Dépose l'éventuel code d'erreur
mov ax,dgroup ;Restaure DS
mov ds,ax
mov ah,9 ;Affiche un message
mov dx,offset Echec$
jc Message ;Echec du chargement
mov dx,offset Succes$
Message:
int 33
pop ax ;Récupère le code d'erreur
jc Fin ;Echec du chargement
xor al,al ;ERRORLEVEL nul si pas d'err.
Fin:
mov ah,4Ch ;Quitte
int 33
MAIN ENDP
CODE ENDS
DATA SEGMENT BYTE PUBLIC
nom db 'FILS.EXE',0
params dw envir
dd lncmd
dd fcb1
dd fcb2
lncmd db 0,13
fcb1 db 0
db 11 dup(' ')
db 25 dup(0)
fcb2 db 0
db 11 dup(' ')
db 25 dup(0)
segpile dw (?)
ptrpile dw (?)
Echec$ db 'Fils non chargé',13,10,'$'
Succes$ db 'Le fils s',39,'est exécuté',13,10,'$'
DATA ENDS
ENVIR SEGMENT PARA PUBLIC
db 'PATH=',0
db 'COMSPEC=A:\COMMAND.COM',0
db 0
ENVIR ENDS
PILE SEGMENT STACK
DB 256 dup('Z') ;LINK4 ne fait pas Zzz... dans DGROUP
PILE ENDS
END MAIN
|
Les données PARAMS sont requises pour créer le PSP du fils.
P.S. : j'ai tenté d'installer 386Max... sans succès.
Finalement, ce DOS est compatible avec la version 3.1 (réseau), à quelques exceptions près. Ainsi, comme on peut s'en douter, la fonction d'obtention ou de définition de la stratégie d'allocation mémoire DOS traditionnelle n'existe pas. En outre, j'ai pu déduire l'ossature minimale d'un EXE NE à partir de celle d'un EXE MZ donnée par l'ouvrage MS-DOS avancé, deuxième édition :
; EXE MZ
; Fichier objet obtenu (.OBJ) reconnu par les compilateurs Microsoft.
; MASM /S (segments classés dans l'ordre d'apparition)
DGROUP _DATA,STACK
module_TEXT SEGMENT WORD PUBLIC
(...)
donnees SEGMENT PARA PRIVATE
(...)
_DATA SEGMENT BYTE PUBLIC
(...)
STACK SEGMENT STACK
|
; EXE NE
; MASM /S (segments classés dans l'ordre d'apparition)
DGROUP _DATA,STACK
_TEXT SEGMENT PUBLIC
...
_DATA SEGMENT PUBLIC
...
STACK SEGMENT STACK
...
|
J'ajouterais bien dans DGROUP le segment _BBS pour les variables qui n'ont besoin d'être initialisées dans le fichier (gain d'espace disque). Le document suivant donne un tableau instructif avec, en prime, les directives de MASM 5 qui remplacent la désignation complète des segments :
http://web.sau.edu/LillisKevinM/csci240 ... APGAPE.pdf ou .doc
----
Publié : Mercredi 08 Mai 2013 19:56:28
Les segments d'un exécutable NE peuvent être décrits par un fichier de définition. Plusieurs directives sont reconnues par LINK4 :
CLASS CODE CONFORMING
DATA DESCRIPTION DISCARDABLE
EXECUTE-ONLY EXPORTS
FIXED
HEAPSIZE
IMPORTS IMPURE
LIBRARY LOADONCALL
MOVABLE MOVEABLE MULTIPLE
NAME NODATA NON-CONFORMING NONE
OLD
PRELOAD PURE
RESIDENTNAME
SEGMENTS SINGLE STACKSIZE STUB
|
Il n'y a pas d'attribut SHARED (partageable) pour le code vu qu'il ne semble être employé que par les routines des fichiers DLL pour Windows et OS/2.
Pour l'instant, je n'ai testé avec succès que la directive STUB. Elle permet d'insérer un exécutable MZ dans l'exécutable NE. Considérons les deux fichiers suivants :
TEST.DEF
TEST.ASM
dgroup group data,pile
CODE SEGMENT PUBLIC 'CODE'
assume cs:code,ds:dgroup
Debut:
mov ax,dgroup
mov ds,ax
mov ah,9
mov dx,offset Phrase
int 33
mov ah,4Ch
int 33
CODE ENDS
DATA SEGMENT BYTE PUBLIC 'DATA'
Phrase db 'Salut',13,10,'$'
DATA ENDS
PILE SEGMENT STACK
db 256 dup(?)
PILE ENDS
END Debut
|
Entrons les commandes suivantes :
masm test;
link test,testdos;
link4 test,,,,test
|
On obtient un hybride TEXTE.EXE pour MS-DOS 4 multitâche contenant une version DOS traditionnelle.
N.B. : correction de l'avant-dernier message. Le fait que l'option ALIGNMENT de LINK4 ait la valeur 512 par défaut doit être lié à la taille des secteurs d'un disque.
Dernière modification par gm86 le 04 juin 2013 09:46, modifié 3 fois.
_________________ C:\ONGRTLNS.W95
|
|