2017-09-23 4 views
3

Ich bin neu in der Assemblersprache und ich habe Probleme mit meinem Code. Zuerst versuchte ich 1 Eingang und dann 1 Ausgang und es funktioniert gut. Aber wenn ich 2 Eingänge versuche. Dann taucht das Problem auf. Wenn es "Geschlecht" fragt, scheint Eingang 1 und Ausgang 1 ihn zu überlappen.Turbo Assembler Mehrere Eingänge überlappen

Ich habe gründlich gesucht und es geschafft, einen zu finden, der dasselbe verlangt, aber sein/ihr war anders und ich kann nicht zu verstehen scheinen. Ich hoffe, dass jemand helfen kann. Das ist für die Schule.

Voll Code:

.model small 
.stack 200 
.data 
    message db "Name: ","$" 
    message2 db "Your name is: ","$" 
    message3 db "Gender: ","$" 
    message4 db "Your name is: ","$" 
    BUF DB 100 
    DB 100 DUP("$") 

.code 
MOV ax,@data 
mov ds,ax 

LEA dx,message 
mov ah,09h 
int 21h 
mov ah,0ah ; 
mov dx, offset buf 
int 21h 

LEA dx,message2 
mov ah,09h 
int 21h 
LEA DX,BUF 
ADD DX,02 
MOV AH,09H 
INT 21H 

LEA dx,message3 
mov ah,09h 
int 21h 
mov ah,0ah 
mov dx, offset buf 
int 21h 


LEA dx,message4 
mov ah,09h 
int 21h 
LEA DX,BUF 
ADD DX,02 
MOV AH,09H 
INT 21H 

MOV AX,4C00H 
INT 21H 
END 
+0

Drucken Sie die neue Zeile, um zum nächsten zu gelangen. –

+0

Können Sie bitte genauer sein? – eLjA

Antwort

2

All das Drucken auf der gleichen Linie getan. Um zur nächsten Zeile zu gelangen, müssen Sie \ n \ r \ n \ r drucken, aber natürlich nicht so, da diese von den Hochsprachen interpretiert werden. Sie müssen ihre ASCII-Codes verwenden: 13,10. So verlängern Sie Ihren Code (.data Abschnitt) mit diesem:

newline db 13,10,"$" 

und wo immer Sie an die neue Linie gehen, wollen einfach nur drucken, dass:

lea dx, newline 
mov ah, 09h 
int 21h 

enter image description here

Auch sollte message4 sein " Ihr Geschlecht ist: "," $

+0

Ich habe die "newline db 13,10," $ "" unter .data hinzugefügt Aber ich scheine einen Fehler zu bekommen, wenn ich das "newline mov, ah, 09h" hinzufügen. – eLjA

+0

Das wurde nicht richtig formatiert –

+0

Vielen Dank! Ich habe es zur Arbeit gebracht! :) – eLjA

3

Sie sollten das abschließende Zeichen '$' explizit nach jedem Aufruf AH = 0Ah schreiben (oder separate Puffer verwenden). Andernfalls, wenn Sie zuerst die Zeichenfolge '123456' und dann 'abc' eingeben, wird der Puffer beim nächsten Mal zuerst und abc\n56\n$$$$$ halten.

Der Interrupt AH = 0Ah wird die Anzahl der gelesenen Zeichen an der Position DX + 1 setzen. Aus irgendeinem Grund verwendet der Eingangsinterrupt '\ n' als Abschlusszeichen, während AH = 09h/Druckzeichenfolge '$' verwendet.

;; given dx == offset buf, replace the Carriage Return 
;; with the terminating character '$' 
fix_end_of_string: 
mov bx, dx 
mov al, [bx + 1] 
mov ah, 0 
add bx, ax 
mov al, '$' 
mov [bx + 2], al 
ret 

Some random reference to AH=0Ah/AH=09h services

Das andere Problem, wie es in anderer Antwort angegeben ist, ist, wie DOS Terminal als simulierte Schreibmaschine mit getrenntem Wagenrücklauf und Zeilenvorschub steuert. Die CR (0x0d) setzt den "Schreibkopf" nur an den Zeilenanfang, geht aber nicht zur nächsten Zeile. In DOS geschieht dies durch Schreiben von Zeilenvorschub (ASCII 0x0a) und es ist völlig unabhängig von der CR. Man kann in jeder horizontalen Position zur nächsten Zeile gehen und weiter tippen. Wenn man einen Namen eingibt, gibt der Eingabeservice AH = 0Ah intern sowohl CR als auch LF ein, wodurch die nächste Nachricht in einer separaten Zeile gedruckt werden kann, aber der Eingabepuffer nur die CR hat.

+0

Danke für die Antwort. Ich werde das auch versuchen. – eLjA