2017-10-17 4 views
-1

Je suis novice en matière de langage d'assemblage et j'essaie de créer un programme simple pour ajouter des numéros en langage assembleur. J'ai réussi à lancer le programme quand le .MODEL est minuscule, mais le programme renvoie l'erreur "Duplicate Declaration" quand .MODEL a été changé en petit. Je comprends la différence des deux modèles, mais je n'arrive pas à comprendre ce qui change.Duplication de la décotation des données dans l'assemblage .MODEL SMALL

Ce que j'ai essayé:

  • J'ai changé le nom de données données1 et il fonctionne dans les petites, mais pas dans TINY.
  • I a ajouté le code .org 100h après .MODEL et il fonctionne, car il a fait l'exécution du programme en mémoire près (?)

Quelle notion suis-je manque?

Nous vous remercions à l'avance

.MODEL TINY 

.DATA 
data DB 10D, 11D, 12D, 13D, 14D, 15, 16D, 17D, 18D, 19D 
.CODE 
.STARTUP 
XOR AX, AX 
MOV BX, OFFSET data 
MOV CX, 5 
ulang: 
ADD AX, [BX] 
INC BX 
LOOP ulang 
.EXIT 
END 

Screenshot of the error and the code.

+0

Veuillez ne pas ajouter de code et d'erreurs en tant qu'images. Cela rend la question moins interrogeable et est moins lisible et pratique pour nous. –

+1

Lorsque vous utilisez minuscule si vous placez des données avant le code les données seront exectuées comme code. Déplacez votre section DATA après le code. –

+0

en parlant de DOS: .tiny va créer un fichier .com, donc vous devez ajouter .org 0100h pour commencer à la bonne adresse. Supprimez tous les segments, car tous les registres de segment auront la même valeur. Et vous (comme Michael a dit) besoin soit de déplacer les données à la fin, ou ajouter un saut au démarrage en face de lui. sinon, il sera considéré comme du code (et exécuté, ce qui sera probablement crash, ou faire des choses que vous ne voulez pas) – Tommylee2k

Répondre

1

Le problème est que le segment de données a également un nom de symbole qui est - étonnamment - DATA.

En d'autres termes:

L'assembleur met implicitement symboles après le début des segments. Vous écrivez:

.DATA 
... 
.CODE 
... 

... et l'assembleur ne implicitement quelque chose comme:

.DATA 
DATA: 
... 
.CODE 
CODE: 
... 

... donc l'étiquette DATA: est défini deux fois si vous l'utilisez dans votre code!

Notez que vous ne pouvez pas "juste" juser ces étiquettes générées implicitement, donc vous devez utiliser un autre nom comme DATA1.

Je ne réussirons à lancer le programme lorsque le .MODEL est minuscule

pas absolument sûr, mais dans le modèle de mémoire « minuscule » les étiquettes « implicites » dont je parle ne sont pas nécessaires. Peut-être que l'assembleur ne créera tout simplement pas de telles étiquettes lors de l'utilisation du "minuscule" modèle de mémoire.