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.htm

    Und 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?


Anmelden zum Antworten