2017-08-25 7 views
0

J'essaie de diviser un très grand fichier .ASM en plusieurs bibliothèques externes en ne laissant que mon programme principal dans main.asm.Comment j'utilise un EQU externe dans une expression dans MASM 5.10

C'est un jeu, donc j'espérais partager mon code d'entrée du clavier en input.asm, et mon code de carte son Adlib dans music.asm etc.

Quoi qu'il en soit, mon problème spécifique est que beaucoup de mes les procédures ont des lignes comme celle-ci qui utilisent EQU dans les expressions.

mov ax, ((scrWidth*YCoord)+XCoord) 

Lorsque je déplace les procédures qui contiennent ces lignes dans une bibliothèque externe et tentent d'assembler cette bibliothèque externe, MASM me donne l'erreur suivante.

A2032: Illegal use of external 

L'erreur a un sens pour moi. Comme ils sont externes, l'assembleur ne sait pas directement ce que scrWidth, YCoord ou XCoord sont, donc il ne peut pas les additionner ou les multiplier. Je suppose que c'est pourquoi il ne peut pas générer le fichier obj. Donc, juste pour clarifier les choses, voici deux exemples de fichiers complets.

main.asm

TheStack SEGMENT STACK 

    DB 64 DUP ('THESTACK') 

TheStack ENDS 





VarData SEGMENT PUBLIC 

PUBLIC const1,const2 

    const1 EQU 1 
    const2 EQU 2 

VarData ENDS 





EXTRN Proc1:PROC 
Code SEGMENT PUBLIC 

    assume cs:Code,ds:VarData 

MAIN PROC 

START: 

    mov ax, VarData ;load DS 
    mov ds, ax 

    call Proc1  ;call external procedure 

    mov ah,4ch  ;exit to dos 
    mov al,0 
    int 21h 


Main ENDP 

Code ENDS 

    END Start 

UTIL.ASM

VarData SEGMENT PUBLIC 

EXTRN const1:ABS,const2:ABS 

VarData ENDS 



Code SEGMENT PUBLIC 

PUBLIC Proc1 

    assume cs:Code,ds:VarData 


Proc1 PROC 

    mov ax, (const1*const2) ;this generates the error 
    ret 

Proc1 ENDP 


Code ENDS 

    END 

Je ne tente une solution de contournement en changeant les années EQU dans main.asm en variables au lieu des constantes, puis les importer dans UTIL.ASM comme octets réels. Puis, à partir de là, j'ai essayé de les mapper en arrière dans EQU dans Util.ASM, mais l'erreur est la même.

Quelqu'un sait-il d'une solution de contournement? Je sais que c'est un assembleur très obsolète, mais je ne sais vraiment pas si c'était une limitation connue qui a été corrigée dans les révisions ultérieures de MASM.

+4

Cela ressemble à une utilisation parfaite de 'include'. Déplacez tous les communs 'equ' dans leur propre fichier. –

+0

@David Eh bien, cela répond à cela. J'ai complètement oublié 'include'. –

+0

Vous aurez peut-être aussi des moyens de réorganiser un peu votre code, donc toutes les parties du code ne devront pas comprendre les coordonnées/tailles d'affichage, etc ... mais seulement afficher les fonctions liées à la sortie, etc. (certaines constantes sera nécessaire dans plusieurs "modules" en même temps, il est donc nécessaire de l'inclure) – Ped7g

Répondre

1

Déplacer ceci vers une «réponse» pour qu'il puisse être fermé.

Tout comme les langages de haut niveau, masm prend en charge les fichiers include.

Comme le mentionne Ped7g, c'est une "bonne technique de programmation" pour définir vos définitions. Par exemple, vos définitions liées au son vont en haut de votre fichier «music.asm» et votre définition de la vidéo en haut de votre fichier «display.asm».

Mais certaines définitions s'appliquent plus généralement. Ceux-ci peuvent être EQU s, EXTERN s, MACRO s, STRUCT s, etc. Pour ceux-ci, vous pourriez avoir un 'common.inc' général qui est inclus par plusieurs fichiers.

+0

Résolu, merci. J'ai trouvé un pdf du guide du programmeur MASM 5.0. Il y a beaucoup d'informations utiles là-dedans. Je ne pouvais pas trouver un pour 5.1, mais il semble que tout dans 5.0 s'applique toujours. –