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.
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? –