Win3x.Org

Windows & DOS Community

Correction des assembleurs 80286 MASM 2.0 et 3.0

Répondre   Page 1 sur 1  [ 1 message ]
Auteur Message
gm86
Sujet du message : Correction des assembleurs 80286 MASM 2.0 et 3.0
Publié : 11 mars 2020 10:05
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 617
Inscription : 01 sept. 2008 19:07
 
Je qualifie directement ce projet comme abouti, puisque le résultat a immédiatement suivi l'idée.

Il y a neuf ans, je tombais sur les prédécesseurs du macro-assembleur 4.0 de Microsoft. Ce dernier est la première version écrite en C de cet utilitaire, tout en représentant le standard de l'époque avant l'arrivée des directives simplifiées de segment (.CODE, .DATA, par exemple). Les versions d'avant remplissaient le même boulot et existaient en version OEM mais bridée :
viewtopic.php?f=2&t=6868
Elles se basent sur le code de MASM 1.27 auquel manque la gestion 80286/80287.

J'ai lu que cette version IBM a récemment été utilisée pour reconstruire le BIOS des PC/XT et AT :
http://sites.google.com/site/pcdosretro/ibmpcbios
J'ai donc procédé à sa correction dont j'ai survolé les étapes dans le sujet en question.

À suivre...


Lundi 16 mars 2020

L'encodage de PUSH imm. avait été corrigée. Restait à voir la réaction du small assembler ASM face à cette instruction 186/286 qui lui est donc inconnue. Ce qui a conduit à deux bugs latents du macro-assembleur MASM (valeur immédiate avec POP ou avec un pointeur autre que BYTE ou WORD).

Avant :
 IBM Personal Computer Assembler   Version 2.00  	Page	1-1
	 	 	 	 	 	 	 	03-16-<0    


 	 	 	 	.186
 E r r o r   ---	84
 = 9876	 	 	 	imm     equ     09876h
 0000	 	 	 	code    segment
 	 	 	 	        assume  cs:code
 0100	 	 	 	 	org	256
 0100	 	 	 	start:
 0100  FF 36 7F	 	 	        push    7Fh
 0103  FF 36 80	 	 	        push    80h
 0106  53	 	 	        push    bx
 0107  FF 70 01	 	 	        push    [bx+si+1]
 010A  FF 36 76	 	 	        push    byte ptr imm
 E r r o r   ---	57
 010D  FF 36 9876	 	        push    word ptr imm
 0111  FF 36 9876	 	        push    dword ptr imm
 E r r o r   ---	57
 0115  8F 06 9876	 	        pop     imm
 0119  8F 06 9876	 	        pop     qword ptr imm
 E r r o r   ---	57
 011D  CD 20	 	 	        int     20h
 011F	 	 	 	code    ends
 	 	 	 	
 	 	 	 	        end     start

 IBM Personal Computer Assembler   Version 2.00  	Page	Symbols-1
	 	 	 	 	 	 	 	03-16-<0    
(...)
 IBM Personal Computer MACRO Assembler   Version 2.00  	Page	1-1
	 	 	 	 	 	 	 	03-16-<0    


 	 	 	 	.186
 = 9876	 	 	 	imm     equ     09876h
 0000	 	 	 	code    segment
 	 	 	 	        assume  cs:code
 0100	 	 	 	 	org	256
 0100	 	 	 	start:
 0100  6A 7F	 	 	        push    7Fh
 0102  68 80	 	 	        push    80h
 0104  53	 	 	        push    bx
 0105  FF 70 01	 	 	        push    [bx+si+1]
 0108  6A 76	 	 	        push    byte ptr imm
 010A  68 9876	 	 	        push    word ptr imm
 010D  68 9876	 	 	        push    dword ptr imm
 0110  68 9876	 	 	        pop     imm
 0113  68 9876	 	 	        pop     qword ptr imm
 0116  CD 20	 	 	        int     20h
 0118	 	 	 	code    ends
 	 	 	 	
 	 	 	 	        end     start

 IBM Personal Computer MACRO Assembler   Version 2.00  	Page	Symbols
	 	 	 	-1
	 	 	 	 	 	 	 	03-16-<0    
(...)
Le sens de l'erreur 84, 8087 opcode can't be emulated selon MASM, devient avec ASM : Feature not supported by the small Assembler.

Après :
 IBM Personal Computer Assembler   Version 2.00  	Page	1-1
	 	 	 	 	 	 	 	03-16-20    


 	 	 	 	.186
 E r r o r   ---	84
 = 9876	 	 	 	imm     equ     09876h
 0000	 	 	 	code    segment
 	 	 	 	        assume  cs:code
 0100	 	 	 	 	org	256
 0100	 	 	 	start:
 0100  FF 36 7F	 	 	        push    7Fh
 E r r o r   ---	56
 0103  FF 36 80	 	 	        push    80h
 E r r o r   ---	56
 0106  53	 	 	        push    bx
 0107  FF 70 01	 	 	        push    [bx+si+1]
 010A  FF 36 76	 	 	        push    byte ptr imm
 E r r o r   ---	56
 010D  FF 36 9876	 	        push    word ptr imm
 E r r o r   ---	56
 0111  FF 36 9876	 	        push    dword ptr imm
 E r r o r   ---	56
 0115  8F 06 9876	 	        pop     imm
 E r r o r   ---	56
 0119  8F 06 9876	 	        pop     qword ptr imm
 E r r o r   ---	56
 011D  CD 20	 	 	        int     20h
 011F	 	 	 	code    ends
 	 	 	 	
 	 	 	 	        end     start

 IBM Personal Computer Assembler   Version 2.00  	Page	Symbols-1
	 	 	 	 	 	 	 	03-16-20    
(...)
 IBM Personal Computer MACRO Assembler   Version 2.00   Page	1-1
	 	 	 	 	 	 	 	03-16-20    


 	 	 	 	.186
 = 9876	 	 	 	imm     equ     09876h
 0000	 	 	 	code    segment
 	 	 	 	        assume  cs:code
 0100	 	 	 	 	org	256
 0100	 	 	 	start:
 0100  6A 7F	 	 	        push    7Fh
 0102  68 0080	 	 	        push    80h
 0105  53	 	 	        push    bx
 0106  FF 70 01	 	 	        push    [bx+si+1]
 0109  6A 76	 	 	        push    byte ptr imm
 010B  68 9876	 	 	        push    word ptr imm
 010E  68 9876	 	 	        push    dword ptr imm
 E r r o r   ---	57:Illegal size for item         
 0111  68 9876	 	 	        pop     imm
 E r r o r   ---	56:No immediate mode             
 0114  68 9876	 	 	        pop     qword ptr imm
 E r r o r   ---	57:Illegal size for item         
 0117  CD 20	 	 	        int     20h
 0119	 	 	 	code    ends
 	 	 	 	
 	 	 	 	        end     start

 IBM Personal Computer MACRO Assembler   Version 2.00   Page	Symbols-1
	 	 	 	 	 	 	 	03-16-20    
(...)

Dimanche 22 mars et mardi 7 avril

Bien que facile à corriger en assembleur, il est clair que le code en PASCAL se fiche de savoir si au moins un des deux opérandes 8087 est le registre ST(0). Par contre, MASM version 2 à 4 vérifiaient bien que l'ordre des opérandes, cas des instructions 8087 à suffixe P, était respecté.

Quant à l'erreur due à l'option /ML (MASM 3, 4 et MASM/2), elle s'est immiscée dans du code non prévu pour l'accepter (MASM suppose que les instructions 8087 sont en majuscules) :
https://www.pcjs.org/documents/books/ms ... /section4/

_________________

C:\ONGRTLNS.W95


Haut
Profil
Afficher : Trier par : Ordre :
Répondre   Page 1 sur 1  [ 1 message ]
Revenir à « Projets aboutis »
Aller :