2017-03-19 14 views
-1

Ich schrieb ein 8086 Programm, und soweit ich sagen kann, läuft es gut, aber wenn es zu dem Teil kommt, wo ich die Variablen deklariere, gibt der Emulator mir einen Fehler. Beim Versuch, die Linie temp db 0x0F zu laufen, sagt der Emulator:Fehler: "unbekannter Opcode übersprungen: 32"

unknown opcode skipped: 32

not 8086 instruction - not supported yet.

mein volles Programm hier:

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 

Ist das Folge, wie die Programmfunktionen, und wie kann ich es beheben?

EDIT: sigjuice löste das Problem, wie Sie in den Kommentaren sehen können. Hier ist die endgültige Version des Programms, das richtig läuft:

.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

Was sind alle Befehle zum Zusammenbauen und Verknüpfen Ihres Programms und welchen Emulator verwenden Sie? – sigjuice

+0

@sigjuice Ich mache das in [emu8086] (http://www.emu8086.com/). Ihr Kommentar hat mich dazu gebracht, Assembler-Anweisungen zu finden, die ich vorher nicht kannte und nicht verwendete. Das Hinzufügen der Assembler-Direktiven '.CODE' und' .DATA' scheint das Problem behoben zu haben. Vielen Dank. – tagurit

+0

Gern geschehen! Kann ich vorschlagen, dass es für andere nützlich wäre, wenn Sie die endgültige Version Ihres Programms, die erfolgreich ausgeführt wird, enthalten? – sigjuice

Antwort

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

In diesem Teil des Programms gibt es nichts, was die CPU-Stationen von der Ausführung der Daten am Temp Etikett, als ob es eine Anweisung war.

Obwohl das Hinzufügen der .CODE und .DATA Assembler-Direktiven (möglicherweise von @sigjuice vorgeschlagen) scheinbar das Problem löst, ist dies normalerweise nicht das, was Sie beim Schreiben einer ausführbaren .COM-Datei verwenden. Es ist eine ausführbare .COM-Datei, weil Sie die org 100h-Direktive verwendet haben.

Was Ihr Programm wirklich benötigt, ist eine Möglichkeit, zum Betriebssystem zurückzukehren. Da dies EMU8086 ist, wird die DOS.TerminateWithReturncode-Funktion bevorzugt.

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 

Ich kann nicht wirklich Rat an das Betriebssystem zurückzukehren, um eine bloße ret Anweisung verwendet wird, da diese Methode erfordert, dass die SS:SP Register eingestellt sind, wie sie waren, als das Programm gestartet. Dies wird nicht immer der Fall sein. Verwenden Sie besser diese DOS-Funktion, die nicht auf bestimmte Registereinstellungen angewiesen ist.


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 

nichts mit Ihrem ursprünglichen Problem, sondern als Bonus zu tun:

Da Temp und geändert sind beide Byte-Größe Variablen, die Wort großen Ergänzungen Fügen Sie nicht nur die Variablen hinzu, sondern auch das Byte, das ihnen im Speicher folgt! Manchmal ist dies beabsichtigt (ich bezweifle, dass dies hier der Fall ist!), Aber Sie müssen sicherstellen, dass Sie das verstehen.