2017-03-19 2 views
-1

J'ai écrit un programme 8086, et autant que je sache, il fonctionne bien, mais quand il arrive à la partie où je déclare les variables, l'émulateur me donne une erreur. Lorsque vous essayez de lancer la ligne temp db 0x0F, l'émulateur dit:Erreur: "inconnu opcode ignoré: 32"

unknown opcode skipped: 32

not 8086 instruction - not supported yet.

Voici mon programme complet:

org 100h 
mov ah, temp ;put variables into registers 
mov al, changed 
mov dx, result 
lea bx, temp ;get address of temp and put into bx 
add dx, [bx] ;add value at the address in bx to result 
lea bx, changed ;get address of changed and put into bx 
add dx, [bx] ;add value at the address in bx to result 
temp db 0x0F ;declare and initialize variables 
changed db 32h 
result dw 0 

Est-ce en conséquence le fonctionnement du programme, et comment puis-je résoudre ce problème?

EDIT: sigjuice a résolu le problème, comme vous pouvez le voir dans les commentaires. Voici la version finale du programme qui fonctionne correctement:

.CODE 
org 100h 
mov ah, temp ;put variables into registers 
mov al, changed 
mov dx, result 
lea bx, temp ;get address of temp and put into bx 
add dx, [bx] ;add value at the address in bx to result 
lea bx, changed ;get address of changed and put into bx 
add dx, [bx] ;add value at the address in bx to result 
.DATA 
temp db 0x0F ;declare and initialize variables 
changed db 32h 
result dw 0 
+0

Quelles sont toutes les commandes pour assembler et lier votre programme et quel émulateur utilisez-vous? – sigjuice

+0

@sigjuice Je le fais dans [emu8086] (http://www.emu8086.com/). Votre commentaire m'a amené à découvrir des directives d'assembleur, que je ne connaissais pas auparavant et que je n'utilisais pas. L'ajout des directives de l'assembleur '.CODE' et' .DATA' semble avoir corrigé le problème. Merci beaucoup. – tagurit

+0

Vous êtes les bienvenus! Puis-je suggérer que cela serait utile aux autres si vous incluez la version finale de votre programme qui fonctionne avec succès? – sigjuice

Répondre

1
add dx, [bx] ;add value at the address in bx to result 
temp db 0x0F ;declare and initialize variables 

Dans cette partie de votre programme, il n'y a rien qui empêche la CPU d'exécuter les données sur l'étiquette temp comme si elle était une instruction. Bien que l'ajout des directives assembleur .CODE et .DATA (peut-être suggéré par @sigjuice) résout apparemment le problème, ce n'est généralement pas ce que vous utilisez lors de l'écriture d'un exécutable .COM. C'est un exécutable .COM car vous avez utilisé la directive org 100h.

Ce dont votre programme a réellement besoin, c'est d'un moyen de revenir au système d'exploitation. Puisque c'est EMU8086 le moyen préféré est d'utiliser la fonction DOS.TerminateWithReturncode.

add dx, [bx] ;add value at the address in bx to result 
       ; Exit to the operating system 
mov ax, 4C00h ;AH=4Ch function number, AL=0 exitcode (0 most often means OK) 
int 21h  ;DOS system call 
       ; Now beyond this point nothing gets executed inadvertently 
temp db 0Fh  ;declare and initialize variables 

Je ne peux pas vraiment des conseils pour revenir au système d'exploitation en utilisant une simple instruction ret, parce que cette méthode exige que les registres SS:SP sont définis comme ils étaient lorsque le programme a commencé. Ce ne sera pas toujours le cas. Mieux vaut utiliser cette fonction DOS qui ne dépend d'aucun paramètre de registre spécifique.


lea bx, temp ;get address of temp and put into bx 
add dx, [bx] ;add value at the address in bx to result 
lea bx, changed ;get address of changed and put into bx 
add dx, [bx] ;add value at the address in bx to result 

Rien à voir avec votre problème d'origine, mais comme un bonus:

Parce que température et changé sont les deux variables d'octets de taille, le mot tailleajouts ne pas simplement ajouter les variables seules mais aussi l'octet qui leur arrive de les suivre en mémoire! Parfois c'est intentionnel (je doute sincèrement que c'est le cas ici!), Mais vous devez vous assurer que vous comprenez cela.