PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Aus- und Eingabe


Sue84
15.12.2004, 20:03
Hallo!

Ich habe gerade mit der Assemblerprogrammierung (MASM) angefangen und hatte folgende Aufgabe zu realisieren:

Es ist ein Assemblerprogramm zu schreiben,das folgenden
Bildschirminhalt ausgibt:

Mein zweites Assemblerprogramm
Bitte ändern: drit
Mein drittes Assemblerprogramm
Geänderte Buchstaben: 4

Nach Ausgabe der Zeile "Mein zweites Assemblerprogramm"
ist der Benutzer aufzufordern, seine Änderungen einzugeben.
Dazu geben Sie bitte die Zeichenfolge "drit" ein, die vom
Programm an die Stelle "zwei" zu schreiben ist. Danach ist
der neue Text und die Anzahl der geänderten Zeichen auszu-
geben. Die Eingabe ist mittels einer Schleife zu realisieren.

Mein Programm:

.MODEL SMALL
.STACK 100h
.DATA
Text DB ?

.CODE
Ausgabe1 DB "Mein zweites Assemblerprogramm", 10, 13, "$"
Ausgabe2 DB "Bitte ändern: $"

Start: mov ax, @data
mov ds, ax

mov ah, 09
mov dx, OFFSET Ausgabe1
int 21h
mov ah, 09
mov dx, OFFSET Ausgabe2
int 21h

mov ah, 01
mov bx, OFFSET Text
mov cx, 4

schleife_eingabe:
int 21h
mov [bx], al
inc bx
dec cx
jnz schleife

Ausgabe3 DB "Mein", Text, "tes Assemblerprogramm", 10, 13, "$"
Ausgabe4 DB "Geänderte Buchstaben: $"

mov ah, 09
mov dx, OFFSET Ausgabe3
int 21h
mov ah, 09
mov dx, OFFSET Ausgabe4


Es ist nicht vollständig und mir sind sicher auch Fehler unterlaufen. Wer kann mir weiterhelfen?

Über jede Antwort wäre ich sehr dankbar!


MfG Sue


Jan Krüger
16.12.2004, 16:08
Hallo Sue,

* du reservierst für "Text" nur 1 Byte -- das ist definitiv zu wenig.
* Du kannst nicht einfach in "Ausgabe3" einen Zeiger auf "Text" angeben, das wird DOS nicht so verstehen wie du. Stattdessen musst du erst die erste Hälfte von "Ausgabe3" ausgeben, dann "Text" (an dessen Ende du ein "$" schreiben musst, damit die Ausgabefunktion richtig damit umgeht) und dann die zweite Hälfte von "Ausgabe3".
* Du hast vergessen, hinter Ausgabe4 die geänderten Buchstaben auch ausgeben zu lassen.
* Es gibt eine praktischere Eingaberoutine für ganze Strings, nämlich die Funktion 0Ah von Interrupt 21h.

Sue84
18.12.2004, 18:57
Hallo Jan,

ich habe mein Programm wie folgt geändert:


.MODEL SMALL
.STACK 100h
.DATA
String1 DB "Mein zweites Assemblerprogramm", 10, 13, "$"
String2 DB "Bitte ändern: $"
String3 DB "Mein $"
String4 DB " tes Assemblerprogramm", 10, 13, "$"
String5 DB "Geänderte Buchstaben: $"
Text DW ?

.CODE
Start: mov ax, @data
mov ds, ax

mov dx, OFFSET String1 ; Ausgabe 1. und 2. Zeile
mov ah, 9
int 21h
mov dx, OFFSET String2
mov ah, 9
int 21h

mov ah, 1
mov bx, OFFSET Text ; lädt Adresse von Text nach BX
mov cx, 4

schleife_eingabe: ; Benutzereingabe mit Schleife
int 21h
mov [bx], al
inc bx
dec cx
jnz schleife_eingabe

mov dx, OFFSET String3 ; Ausgabe 3. Zeile
mov ah, 9
int 21h
mov dx, OFFSET Text
mov ah, 9
int 21h
mov dx, OFFSET String4
mov ah, 9
int 21h
mov dx, OFFSET String5 ; Ausgabe 4. Zeile
mov ah, 9
int 21h

mov dx, bx ; Anzahl der Buchstaben in bx zur Anzeige bringen
mov ah, 9
int 21h

mov ah, 4Ch
int 21h
END Start




Allerdings funktioniert es nur bis zur Eingabe (drit) in der zweiten Zeile. Die dritte Zeile (Mein drittes Assemblerprogramm) folgt gleich hinter der Eingabe, statt auf einer neuen Zeile und enthält, genauso wie die 4. Zeile (nach Geänderte Buchstaben:) lauter ASCII-Zeichen(?).

Kannst du mir bitte noch einmal helfen? Ich komme nicht weiter.
Wäre sehr nett!
Das Ganze soll ja mit einer Schleife und Indirekter Adressierung realisiert werden.

Vielen Dank!


MfG Sue

Felix Kaiser
19.12.2004, 11:01
Du lässt den Anwender 4 Zeichen eingeben. Ok. Aber du schließt den Eingabepuffer nicht mit einem $ ab. Und wenn du dort einen Zeilenumbruch reinbringen willst, musst du den auch definieren.
Text db 4 dup (?) ; 4 Bytes reservieren
db 13, 10, '$' ; Carriage Return, Line Feed und abschließendes Dollarzeichen