L'assembleur 1.00d de Arrowsoft qui est compatible MASM 3 contient aussi ces inscriptions PS1 & .MSF. Quant à l'archive, l'ensemble des fichiers ne peut dépasser la taille d'une disquette de 320 Ko (compatible DOS 1.1). De plus, le fichier .PAS constitue un exemple d'appel de routine d'assemblage dans un langage de haut niveau, ici le PASCAL. Le seul fichier un tant soi peu suspect est LINK.EXE qui possède beaucoup d'octets nuls.
Par contre, j'ai remarqué de grandes ressemblances entre IBM MASM 2 et la version 1.00d de Arrowsoft. Les données sont issues des mêmes fichiers .MSF. La correction est en adéquation avec l'exécutable d'origine.
Quoi qu'il en soit, cet assembleur me semble être un outil correct. Lors d'essais, je n'ai guère eu à modifier les fichiers sources destinés à MASM 4, juste eu besoin de savoir que l'apostrophe (caractère 39) ne peut être doublée pour être représentée dans une chaîne de caractères. La différence principale entre les deux est leur manière d'ordonner les segments par défaut :
- alphabétiquement (/A) pour IBM MASM 2 ;
- par ordre d'apparition dans le fichier source (/S) avec les versions suivantes.
----
Publié : Mardi 07 Décembre 2010 15:31:41
Voici la syntaxe des outils fournis dans l'archive :
MASM asm,obj,lst,crf [options][;]
/A Range les segments par ordre alphabétique
/D Liste la première passe (pour trouver les erreurs de phase)
/E Assemble en vue de l'émulation du coprocesseur arithmétique
/N Supprime la table des symboles du listing
/O Notation octale et non hexadécimale dans le listing
/R Usage des réels du coprocesseur arithmétique
/S Range les segments par ordre d'apparition
/X Inclut les assemblages conditionnels faux dans le listing
Option par défaut : /A (et non /S)
Options non supportées par ASM : /E & /R
CREF crf,ref
|
LINK [options] objets,exe,map,libs[;]
Les différents objets et bibliothèques doivent être séparés par le signe +
ou par un blanc.
/DSALLOCATE
/HIGH
/LINENUMBERS
/MAP[:symboles_max]
/NODEFAULTLIBRARYSEARCH
/NOGROUPASSOCIATION
/PAUSE
/QQDEBUG
/STACK:octets
Chaque option peut être abrégée tant que cela n'apporte aucune ambiguïté.
LIB lib [opérations],lst,nouvelle lib
Opérations : -objet Supprimer le module de la bibliothèque
+objet Ajouter le module dans la bibliothèque
*objet Placer le module de la bibliothèque dans un fichier objet
|
Vu que le petit assembleur ASM (
the small assembler) n'indique que les numéros d'erreurs,
il est bon d'avoir la liste des messages du macro-assembleur MASM (
IBM Personal Computer MACRO Assembler Version 2.00 précisément) :
00 Block nesting error
01 Extra characters on line
02 Register already defined
03 Unknown symbol type
04 Redefinition of symbol
05 Symbol is multi-defined
06 Phase error between passes
07 Already had ELSE clause
08 Not in conditional block
09 Symbol not defined
10 Syntax error
11 Type illegal in context
12 Should have been group name
13 Must be declared in pass 1
14 Symbol type usage illegal
15 Symbol already different kind
16 Symbol is reserved word
17 Forward reference is illegal
18 Must be register
19 Wrong type of register
20 Must be segment or group
21 Symbol has no segment
22 Must be symbol type
23 Already defined locally
24 Segment parameters are changed
25 Not proper align/combine/class
26 Reference to mult defined
27 Operand was expected
28 Operator was expected
29 Division by 0 or overflow
30 Shift count is negative
31 Operand types must match
32 Illegal use of external
33 Must be record field name
34 Must be record or fieldname
35 Operand must have size
36 Must be var, label or constant
37 Must be structure field name
38 Left operand must have segment
39 One operand must be const
40 Operands must be same or 1 abs
41 Normal type operand expected
42 Constant was expected
43 Operand must have segment
44 Must be associated with data
45 Must be associated with code
46 Already have base register
47 Already have index register
48 Must be index or base register
49 Illegal use of register
50 Value is out of range
51 Operand not in IP segment
52 Improper operand type
53 Relative jump out of range
54 Index displ. must be constant
54 Illegal register value
56 No immediate mode
57 Illegal size for item
58 Byte register is illegal
59 CS register illegal usage
60 Must be AX or AL
61 Improper use of segment reg.
62 No or unreachable CS
63 Operand combination illegal
64 Near JMP/CALL to different CS
65 Label can't have seg. override
66 Must have opcode after prefix
67 Can't override ES segment
68 Can't reach with segment reg
69 Must be in segment block
70 Can't use EVEN on BYTE seg.
71 Forward needs override or far
72 Illegal value for DUP count
73 Symbol is already external
74 DUP is too large for linker
75 Usage of ?(indeterminate) bad
76 More values than defined with
77 Only initialize list legal
78 Directive illegal in STRUC
79 Override with DUP is illegal
80 Field cannot be overridden
81 Override is of wrong type
82 Register can't be forward ref
83 Circular chain of EQU aliases
84 8087 opcode can't be emulated (MASM)
Feature not supported by the small Assembler (ASM)
85 End of file, no END directive |
Comme on le constate, si le code d'erreur 84 émane du simple assembleur ASM, il indique une fonction supportée par le macro-assembleur MASM seulement.
P.S. : l'archive contient aussi le
linker. Il s'agit de la version 2.2 de LINK.EXE.
Néanmoins, deux choses me chagrinent :
- les premiers assembleurs n'étaient pas livrés avec un linker car celui-ci se trouvait sur la disquette système du DOS ;
- ASM est moins sophistiqué que MASM pour fonctionner dans moins de 64 Ko (bien qu'une plus grande mémoire soit souhaitable avec la version 2),
or LINK en demande plus.
MASM 2 date de l'époque où arriva le DOS 3 destiné au PC/AT d'IBM. Je ne sais pas s'il était fourni avec un linker. En tout cas, le fichier SAMPLE2.BAT de l'archive avertit de ne pas oublier d'introduire la disquette système sous DOS 1.1 pour pouvoir utiliser LINK (DOS 1.x ne pouvant être installé sur un disque dur).
D'ailleurs, dans PC-DOS 2.1, on peut récupérer la version 2.1 de LINK qui est moins gourmande en mémoire -- et dans laquelle les options NOGROUPASSOCIATION et QQDEBUG n'existent pas.
Je vois donc deux possibilité à la présence de la version 2.2 de LINK :
- elle a été ajoutée à l'archive de l'assembleur ;
- elle était livrée avec l'assembleur au cas où l'utilisateur posséderait une version récente de DOS sans linker donc un matériel récent avec suffisamment de mémoire pour son usage.
Je voudrais donc savoir si PC/DOS 3.0 était livré avec LINK.EXE et, comme il n'a pas été jugé utile de l'inclure dans l'archive, avec l'utilitaire EXE2BIN.
----
Publié : Vendredi 10 Décembre 2010 21:22:49
Le hasard fait bien les choses, je suis tombé ici :
http://winworldpc.com/downloads_mu.shtml
La version 2.2 de LINK.EXE provient de PC/DOS 3.0. Ce n'est que par la suite que LINK et EXE2BIN disparurent de PC/DOS. C'est pourquoi LINK était vendu avec MASM 4 et suivants -- je ne sais pas pour MASM 3.
Néanmoins, ce ne fut pas le cas de EXE2BIN pourtant indispensable dans la création de gestionnaires mais surtout de programmes au format COM. En effet, Microsoft cherchait à abandonner ces derniers au profit des exécutables de type EXE. D'ailleurs, les dernières versions de EXE2BIN issues de Microsoft vérifient la version du DOS qui les lancent dans le but d'être inutilisables avec les DOS suivants.
P.S. : ASM & MASM 2 sont conçus pour toutes les versions. Ainsi, ils savent gérer l'arborescence des répertoires existant depuis DOS 2 tout en étant exploitables sous un système antérieur. De même pour CREF, qui transforme le fichier CRF issu de MASM en fichier REF.
Quant à LIB, qui est complémentaire à LINK, il 'agit d'une version IBM livrée avec certaines distributions DOS. Contrairement à LINK, cet outil a la bonté de signaler qu'il ne supporte pas DOS 1. Néanmoins, il existe une version livrée avec MS/DOS 1.25 qui ne peut travailler, en conséquence, que dans le répertoire courant.
Notons que les derniers utilitaires EXE2BIN risquent de surestimer la taille du fichier COM résultant d'un fichier EXE créé par une version de LINK pour DOS 1.
----
Publié : Jeudi 27 Janvier 2011 14:13:20
Finalement, il semble que MASM 2.00 limitait les programmeurs au mode réel du 80286. Au lien suivant, l'auteur du programme a été obligé de créer des macros en vue d'utiliser les instructions LGDT et LMSW du mode protégé :
http://www.programmersheaven.com/download/1295/1/ZipView.aspx
Or, si on applique la correction que je préconise à l'assembleur, ces instructions sont bel et bien disponibles. Pour s'en convaincre, il suffit de modifier le programme avant de l'assembler avec MASM 2.00 ainsi corrigé :
- remplacer .286C par .286P ;
- supprimer les macros LGDT et LMSW ;
- ajouter QWORD PTR dans l'instruction LGDT GDT.
A propos de cet ajout, une version de MASM ultérieure à la 5.00 préférera FWORD (6 octets) à QWORD (8 octets) :
http://support.microsoft.com/kb/67439/en-us
lien de remplacement.
Des questions demeurent.
D'où vient ce bridage ? Etait-il appliqué au fichier original ?