2011-04-17 3 views
1

J'écris du code pour DOS en utilisant Bochs. Je compile le programme en utilisant MSNA
Lets Supposons que j'ai le code suivant:NASM sur DOS (Intel 8086): adresse effective invalide

[BITS 16] 

    SEGMENT code 

..start: 
mov ax, data 
mov ds, ax 
mov bx, msg 
mov al, byte [bx] 
int 21h 

    SEGMENT data 

msg DB "teststring", 00h 

Pourquoi est-ce que nasm se plaint de la ligne:

mov al, byte [bx] 

de adresse effective invalide?

Si au lieu d'utiliser bx i utilise le si registre, le programme compile un fonctionne comme supposé, le chargement de la valeur ascii t dans al.

Pourquoi est-ce?

EDIT: Trouvé que je ne peux pas utiliser BX pour l'indexation.
Si je voulais charger ce qui a dans une partie déterminée du segment de données, vous pouvez effectuer les opérations suivantes:

mov ax, data 
mov ds, ax 
mov si, msg 
mov al, byte [si] ; Loading first char 
inc si 
mov al, byte [si] ; Loading second char 

Si je voulais garder si pointant vers le début de la chaîne, je pourrais alors utiliser BX être l'offset:

mov al, byte [si + bx] 

ou même

mov al, byte [si + n] ; where n is an integer value 

Mais à ma connaissance, bx pourrait également être utilisé, donc le problème réside toujours.

+1

Essayez mov al, [bx] ou mov al, ds: [bx] - Je suis sûr que c'est un mode d'adressage valide ... Vous pointez dx à votre message et ensuite utilisez bx, est-ce une faute de frappe? –

Répondre

1

Vous êtes sûr que l'erreur ne se trouve pas sur cette ligne?

mov ds, data 

Peut-être que vous vouliez dire:

mov ds, ax 
+0

oh, mon mauvais, oui, je voulais dire mov ds, ax (copié incorrectement le code: P) –

1

Je pense que vous avez fait plus d'une faute de frappe dans votre question :-) D'abord, en mode 16 bits [pb] [bx] [si] [di ] sont tous les modes d'adressage valides. Même le vieux 8086 peut utiliser [bx] comme adresse efficace. Lorsque [dx] ne peut pas être utilisé en mode 16 bits, il doit être en mode 32 bits. Avec votre ligne

mov dx, msg 

précédent

mov al, byte [bx] 

Je suppose que vous avez écrit en fait 'mov al, [dx]' et nasm se plaint correctement à propos de [dx] comme une adresse non valide. Donc si vous vouliez dire, vous avez découvert que vous ne pouvez pas utiliser [bx], vous avez eu tort - vous avez découvert que vous devez faire plus attention à ne pas mal orthographier "b" pour "d".

+0

Cela devrait m'apprendre à vérifier mes exemples mieux la prochaine fois: D. J'ai écrit bx dans le code, et il se plaint de l'adresse effective invalide.Je –

+0

utilisé nasm pour assembler le fichier que vous avez donné - la ligne en question « mov al, byte [bx] » assemble très bien. – hirschhornsalz