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.
Es gibt viele Dinge, die EMU8086 noch nicht macht, vielleicht zukünftige Versionen. –
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. –
Dies liegt daran, dass Sie einen Emulator verwenden, der die Funktion, die Sie verwenden möchten, nicht unterstützt. –