PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Programm


Sue84
23.12.2004, 18:10
Hallo!

Ich habe ein Problem mit meinem Programm.

Folgende Aufgabe hatte ich 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 gibt aber dies aus:

Mein zweites Assemblerprogramm
Bitte ändern: dritMein drit
tes Assemblerprogramm
Geänderte Buchstaben:

Hier mein Code:

.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 DB 4 DUP (?) ; 4 Bytes reservieren
DB 10, 13, "$" ; Zeilenumbruch nach Eingabe

.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




Nach "Geänderte Buchstaben" wird noch nichts ausgegeben.
Wo liegt der Fehler?

Über jede Antwort wäre ich sehr dankbar!


MfG Sue


gargyle
20.01.2005, 18:10
Ich würde das so ändern

.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 DB 4 DUP (?) ; 4 Bytes reservieren
DB "$"
NewLine: DB 10, 13, "$" ; Zeilenumbruch nach Eingabe
Anzahl: DB 1 DUP (?) ; 1 Byte
DB "$"

.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 dl,0 ;Zähler für die Zeichen

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

inc dl

dec cx
jnz schleife_eingabe

mov dx,OFFSET NewLine
mov ah,9
int 21h

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 al,48 ;das ist ASCII 0
add al,dl
mov bx,OFFSET Anzahl
mov [BX],al ;das Zeichen merken

mov DX,OFFSET Anzahl
mov ah,9
int 21 h

mov ax,0x4C00 ;dies sagt dem DOS alles klar
int 21h ;in al könnte die Fehlernummer stehen

Ich hab die gleichen Funktionen wie du benutzt.
Es gibt da bessere.
Die änderungen hätte man auch direckt in den Text machen können.

Das würde dann so ausssehen

.MODEL SMALL
.STACK 100h
.DATA
String1 DB "Mein zweites Assemblerprogramm", 10, 13, "$"
String2 DB "Bitte ändern: $"
String5 DB "Geänderte Buchstaben: $"
Text DB 4 DUP (?) ; 4 Bytes reservieren
DB "$"
NewLine: DB 10, 13, "$" ; Zeilenumbruch nach Eingabe
Anzahl: DB 1 DUP (?) ; 1 Byte
DB "$"

.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 dl,0

mov ah, 1
mov bx, OFFSET String1+4 ; lädt Adresse von Text nach BX
mov cx, 4
schleife_eingabe: ; Benutzereingabe mit Schleife
int 21h
mov [bx], al
inc bx

inc dl

dec cx
jnz schleife_eingabe

mov dx,OFFSET NewLine
mov ah,9
int 21h

mov dx, OFFSET String1 ; Ausgabe 3. Zeile
mov ah, 9
int 21h

mov dx, OFFSET String5 ; Ausgabe 4. Zeile
mov ah, 9
int 21h

mov al,48 ;das ist ASCII 0
add al,dl
mov bx,OFFSET Anzahl
mov [BX],al ;das Zeichen merken

mov dx,OFFSET Anzahl
mov ah,9
int 21 h

mov ax,0x4C00 ;dies sagt dem DOS alles klar
int 21h ;in al könnte die Fehlernummer stehen

Ich hab das jetzt nicht durch den Assembler geschickt.
Es sollte aber stimmen.

:)


Meine MASM Version mag den Code gar nicht (Ist wohl zu alt)