2016-04-27 7 views
0

Ich möchte Summe von zwei Zahlen in Assembly drucken. Wenn ich den Code ausführe, zeigt der Compiler die folgende Meldung an:Korrekten Interrupt-Code in Assembly

INT 21h, AH = 020h - noch nicht unterstützt. beziehen Sie sich auf die Liste der unterstützten Interrupts.

Bitte erläutern, warum mein Code Fehler zeigt? Erwähnen Sie mir, welchen Interruptcode ich verwenden soll.

.MODEL SMALL 
.STACK 100H 
.DATA 
A DW 5H 
B DW 2H 
SUM DW ? 
.CODE 
MAIN PROC 
MOV AX,@DATA 
MOV AX,A 
ADD AX,B 
MOV SUM,AX 
INT 21H 

MAIN ENDP 
END MAIN 
+2

Es gibt viele Dinge, die EMU8086 noch nicht macht, vielleicht zukünftige Versionen. –

+3

Ihr Problem besteht darin, dass Sie INT 21h verwenden, ohne die Nummer des MS-DOS-Dienstes zu laden, den Sie in dem AH-Register verwenden möchten. Anstatt also den Dienst aufzurufen, den Sie verwenden möchten, ruft er auf, welcher Dienst auch immer dem Wert entspricht, der in AH vorkommt. –

+1

Dies liegt daran, dass Sie einen Emulator verwenden, der die Funktion, die Sie verwenden möchten, nicht unterstützt. –

Antwort

4

Sie müssen AH mit dem MSDOS-Funktionscode laden, den Sie verwenden möchten, bevor Sie den MSDOS-Interrupt aufrufen.

Zum Beispiel eines ASCII-Zeichen zu drucken,

; assuming AL already contains ASCII character to print 
MOV AH, 07H 
INT 21H 

Sie sind nicht einen gültigen Funktionscode in AH geladen. Wo Ihr Compiler 20H hat, ist ein Puzzle, aber da Sie @DATA in AX laden, ohne etwas damit zu tun (zB DS setzen), frage ich mich, ob Sie beim Start nicht auf das richtige Datensegment zeigen.

Beachten Sie außerdem, dass MSDOS niemals eine Konvertierung von einem numerischen Wert in eine Zeichenfolge bereitgestellt hat. Sie müssen den Wert daher selbst konvertieren, wenn Sie ihn anzeigen möchten. Ich glaube, dass der Funktionscode, um eine Zeichenkette zu drucken, AH = 09H ist, wobei DS: SI auf eine '$' - begrenzte Zeichenkette zeigt (nicht nullterminiert!). Ich schlage vor, das zuerst zu überprüfen.

Wenn Sie nur in Base-16 drucken möchten, können Sie jeden 4-Bit-Abschnitt in das entsprechende druckbare ASCII-Zeichen für diese Hexadezimalzahl konvertieren und dann die Funktion 07H verwenden, um den Charakter zu drucken bei den höchstwertigen 4 Bits, und Sie müssen den Wert aus der Summe für jeden 4-Bit-Teil neu laden, da Sie den Rest des Wertes abwerfen werden, wenn Sie für den Interrupt-Aufruf einrichten.

+0

Gute Vermutung auf die Segment Sache. Ich vermisste, dass er nie eine 'mov ds, axt' gemacht hat. Ich dachte, dass er einen Code gepostet haben muss, der nicht mit dem übereinstimmte, was die Fehlermeldung erzeugt hat, da 5 + 2 'AH = 0 'zurücklassen würde. –