2016-11-18 3 views
1

Ich versuche diesen Code, aber ich konnte nicht perfekt diagonal in alphabetischer Reihenfolge drucken .. können Sie mir zu diesem Code helfen? program output screenshotWie kann ich alphabetische Buchstaben diagonal mit MASM drucken?

.model small 
.stack 
.code 

start: 


mov cx,26 
mov bh,00 
mov ah,02h 
mov dl,41h 
mov dh,02h 
again: 
int 10h 
int 21h 
inc dl 
inc dh 
loop again 

mov ah,4ch 
int 21h 
end start 
+0

Klicken Sie auf den Bildschirm mit dem Programmausgang, um die Ausgabe des Codes zu sehen. – Rhye

+0

'int 10h/ah = 02h' verwendet' dl' als horizontale Cursorposition. – Michael

+0

Welche Änderungen sollte ich machen? – Rhye

Antwort

1

alle Probleme mit diesem Code stammen aus der Tatsache, dass sowohl die BIOS-Funktion 02h (SetCursor) und der DOS-Funktion 02h (WriteCharacter) die DL Register als Parameter verwenden. Unglücklicherweise für Sie ist die Bedeutung in diesen Fällen anders. Mehrere Lösungen existieren. Die Verwendung des freien Registers BL, um einen separaten Zeichencode beizubehalten, wurde von Ped7g vorgeschlagen.

Eine einfache Lösung, die ich vorstelle, benutzt die DOS-Ausgabefunktion überhaupt nicht und schreibt auf das Display mit der BIOS-Funktion 0Eh (TeletypeCharacter). Diese Funktion ist nicht auf DL als Parameter angewiesen. Es verwendet eher das AL Register.

.model small 
.stack 
.code 

start: 

mov al, "A" <<<First character 
mov bh, 0  <<<Display page 0 
mov cx, 25  <<<Iteration count 
mov dl, 0  <<<Start at column 0 
mov dh, 0  <<<Start at row 0 
again: 
mov ah, 02h <<<BIOS function SetCursor 
int 10h 
mov ah, 0Eh <<<BIOS function TeleType 
int 10h 
inc dl   <<<Next column 
inc dh   <<<Next row 
inc al   <<<Next character 
loop again 

mov ah, 4Ch 
int 21h 
end start 

Bei der Arbeit am Standardtextscreen gibt es 80 Spalten und 25 Zeilen. Sie sollten den Cursor nicht außerhalb des Bildschirms positionieren! Die meisten Iterationen, die Ihr Programm ausführen sollte, sind daher 25.

Verwandte Themen