Zahl in Doppelwort schreiben?
-
Hi Leute!
Ich will ein Programm schreiben, dass mir 5 Zahlen entgegennimmt und danach in einem Doppelwort abspeichert. Für das entgegennemen benutze ich ein Makro. Dieses Makro schreibt mir den ASCII-Code der Zahl in AL. In der Variable "Zahl" die als Doppelwort deklariert ist, sollen dann die 5 entgegengenommenen Zahlen abgespeichert sein. Mein Problem ist nun, dass ich nicht weiß wie ich den Inhalt von AL in die als Doppelwort deklararierte Variable "Zahl" hineinschreibe. Könnt ihr mir helfen?
Mein Code:
%noctls ; Listing-Steueranweisungen werden nicht im Listing augegeben %noincl ; Incude-Dateien werden nicht im Listing ausgegeben INCLUDE MACROS.ASM ; Datei Macros.asm einbinden ASSUME CS:CODE, DS:DATA ; Segmentnamen bekannt geben ; „CODE“ wird Codesegment, „DATA“ wird Datensegment ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DATA SEGMENT ; Beginn des Segmentes „DATA“ Zahl DD 0h DATA ENDS ; Ende des Segmentes „DATA“ ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;------------------------------------------------------------------------------------------------------------------------------- CODE SEGMENT ; Beginn des Segmentes „CODE“ Anfang: MOV AX, DATA ; Datensegmentadresse ins ;Register AX MOV DS, AX ; Inhalt von Register AX ins Register DS MOV AX,0h ; AX auf 0 setzen MOV BX,0h ; BX auf 0 setzen MOV CX,5h ; Abbruchbedingung von LOOP in CX schreiben MOV DX,0h ; DX auf 0 setzen Marke1: Read_KBD_and_Echo ; Makro zum Einlesen einer Zahl aufrufen MOV BL,AL ; Momentanen Inhalt von AL in BL speichern LOOP Marke1 Terminate_Program ; Makro Terminate_Program aufrufen CODE ENDS ; Ende des Segmentes „CODE“ ;------------------------------------------------------------------------------------------------------------------------------- END Anfang ; Ende des Programms ; Programm wird bei Anfang gestartet
-
Ich hab's jetzt schon mal zusammengebracht, mit dem Befehl MOV BYTE PTR[Zahl],BL den Inhalt von BL in Zahl zu kopieren. Das Problem ist aber jetzt, dass er mir in der Variable "Zahl" den vorher reinkopierten wert überschreibt. Was mach ich falsch?
Aussehen tut das jetzt so:
%noctls ; Listing-Steueranweisungen werden nicht im Listing augegeben %noincl ; Incude-Dateien werden nicht im Listing ausgegeben INCLUDE MACROS.ASM ; Datei Macros.asm einbinden ASSUME CS:CODE, DS:DATA ; Segmentnamen bekannt geben ; „CODE“ wird Codesegment, „DATA“ wird Datensegment ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DATA SEGMENT ; Beginn des Segmentes „DATA“ Zahl DD 0h DATA ENDS ; Ende des Segmentes „DATA“ ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;------------------------------------------------------------------------------------------------------------------------------- CODE SEGMENT ; Beginn des Segmentes „CODE“ Anfang: MOV AX, DATA ; Datensegmentadresse ins ;Register AX MOV DS, AX ; Inhalt von Register AX ins Register DS MOV AX,0h ; AX auf 0 setzen MOV BX,0h ; BX auf 0 setzen MOV CX,5h ; Abbruchbedingung von LOOP in CX schreiben MOV DX,0h ; DX auf 0 setzen Marke1: Read_KBD_and_Echo ; Makro zum Einlesen einer Zahl aufrufen MOV BL,AL ; Momentanen Inhalt von AL in BL speichern MOV BYTE PTR [Zahl + 2] LOOP Marke1 Terminate_Program ; Makro Terminate_Program aufrufen CODE ENDS ; Ende des Segmentes „CODE“ ;------------------------------------------------------------------------------------------------------------------------------- END Anfang ; Ende des Programms ; Programm wird bei Anfang gestartet
-
Siehe hier:
http://faydoc.tripod.com/cpu/stosb.htmUnd versuche es mal so.
INCLUDE MACROS.ASM ; Datei Macros.asm einbinden ASSUME CS:CODE, DS:DATA ; Segmentnamen bekannt geben ; „CODE“ wird Codesegment, „DATA“ wird Datensegment ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DATA SEGMENT ; Beginn des Segmentes „DATA“ Zahl DD 0h DATA ENDS ; Ende des Segmentes „DATA“ ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;------------------------------------------------------------------------------------------------------------------------------- CODE SEGMENT ; Beginn des Segmentes „CODE“ Anfang: MOV AX, DATA ; Datensegmentadresse ins ;Register AX MOV DS, AX ; Inhalt von Register AX ins Register DS MOV CX,5h ; Abbruchbedingung von LOOP in CX schreiben PUSH DS ; ES soll auf DS zeigen POP ES MOV DI,OFFSET Zahl ; DI auf Adresse von Zahl setzen Marke1: Read_KBD_and_Echo ; Makro zum Einlesen einer Zahl aufrufen STOSB LOOP Marke1 Terminate_Program ; Makro Terminate_Program aufrufen CODE ENDS ; Ende des Segmentes „CODE“ ;------------------------------------------------------------------------------------------------------------------------------- END Anfang ; Ende des Programms ; Programm wird bei Anfang gestartet
-
Ein CLD vor Marke1 wäre noch zu empfehlen. Und ganz sicher, daß in ein DD 5 Bytes reinpassen?