2017-05-26 3 views
1

Grundsätzlich muss ich ein Labyrinth erstellen und es in einer Textdatei speichern, damit ich es später öffnen kann, habe ich bereits das Erstellen des Labyrinths Teil, aber ich für das Leben von mir kann es nicht erhalten zu speichern alles, was auf dem Bildschirm zu einer Textdatei (auch die Leerzeichen) ist Ich weiß, dass ich Int 21h verwenden kann, um Dinge in eine Datei zu schreiben Ich weiß einfach nicht, wie man alles in diese Textdatei schreibt (die ganzen 80 Zeilen und 25 Spalten) in der Reihenfolge werden auf dem Dosbox-Bildschirm angezeigt.Schreiben des Textmodusbildschirms in eine Textdatei. (MASM)

mov  ah,3CH ; File creation 
mov  cx,0 ; 
mov  dx, OFFSET filename 
int  21h 
mov  handle, ax 

mov ax,0b800h 
mov es,ax 
ciclo2: 
    mov ah, es:[bx] 
    mov al, es:[bx+1] 
    mov var1, ax 
    mov ah,40h 
    mov cx,2 
    mov dx,var1 
    mov bx,handle 
    int 21h 
    inc bx 
    inc bx 
    cmp bx, 4000 
    jne ciclo2 
fim: 
    mov  ah,3Eh ; Closing the file 
    mov  bx,handle 
    int  21h 

    mov  ah,4CH ; Closing the program 
    INT  21H 

Ich benutze MASM und DOSBOX.

+0

Was ist das Problem oder was ist das falsche Ergebnis, das Sie bekommen? –

+0

Es sollte schreiben, was auf dem Bildschirm zu einer TXT-Datei ist, aber es wird nichts gedruckt. –

+0

Ich habe 4 Fehler in Ihrem Code gefunden, überprüfen Sie die Antwort unten (wenn es sinnvoll ist, vergessen Sie nicht, auf das ✔ Häkchen der Antwort zu klicken). –

Antwort

0

Weiter sind 4 Fehler im Code-Schnipsel und die Updates:

mov ax,0b800h 
mov es,ax 
xor si,si  ;◄■■ INITIALIZE SI = 0. 
ciclo2: 
    mov aL, es:[si] ;◄■■ CHARACTER IN AL. 
    mov aH, es:[si+1] ;◄■■ COLOR IN AH. 
    mov var1, ax 
    mov ah,40h 
    mov cx,2 
; mov dx,var1  ;◄■■ WRONG : VARIABLE VALUE. 
    lea dx,var1  ;◄■■ RIGHT : VARIABLE ADDRESS. 
    mov bx,handle 
    int 21h 
    inc si 
    inc si 
    cmp si, 4000 
    jne ciclo2 
fim: 

Wenn Sie die Datei lesen den Inhalt anzuzeigen, erinnere mich an den Bildschirm enthält das Zeichen zuerst (mov al, es:[si]) und die Farbe später (mov ah, es:[si+1]) , zeigen Sie die Bytes in dieser Reihenfolge an, oder Sie sehen seltsame Zeichen und Farben auf dem Bildschirm.

+0

Ich habe gerade festgestellt, dass dieser Code mich in eine Endlosschleife versetzt, da bx immer auf den Wert in "handle" geändert wird, um int 21h zu verwenden, gibt es ein anderes Register anstelle von bx für dieses Teil mov al , es: [bx] mov ah, es: [bx + 1] –

+0

@ GabrielSilva, ich ersetzte "BX" durch "SI", dieses Register wird die Aufgabe erledigen. –