BCD Codierung mit datum



  • Hi ASM Gurus
    Ich mochte ein Progamm realisiren dass daß Datum ausliest und Ausgibt.
    Ich weiß das 1Ah irgend wie BCD codiert ist aber wie umwandeln??
    DAS ist mein source code .
    Ach das mit dem lea behfel weiß ich das dass Falsch ist !!

    ...................................................
    DOS EQU 21h
    .model small
    .Stack 100h
    .data
    Jahrhundert db ?
    Jahr db ?
    Monat db ?
    Tag db ?
    .code
    Start: mov ax,@data
    mov ds,ax
    mov ah,4
    int 1Ah
    jc Ende
    mov Jahrhundert,CH
    mov Jahr,CL
    mov Monat,DH
    mov Tag,DL
    lea dx,Jahrhundert,Jahr,Monat,Tag
    mov ah,09h
    int DOS
    Ende:
    mov ah,4ch
    int DOS
    End Start
    ............................................



  • Hi.

    Bei BCDs wird praktisch in 4Bit jeweils eine Dezimalziffer gespeichert.
    Dh. in cx haettest du zB. nach dem Aufruf der Datumsfunktion 2005h stehen.

    Das kannst du in einen lesbaren String umwandeln, indem du nacheinander jeweils die 4Bit fuer eine Ziffer isolierst und 30h (ASCII "0") dazuaddierst.
    Praktisch kannst du das umsetzen, indem du cx zunaechst um 4Bit nach links rotierst (rol-Anweisung), dann mittels and-verknuepfung alles bis auf die ersten 4Bit loeschst, dazu dann noch 30h addierst (zB. mittels or-verknuepfung) und das Ergebnis im String platzierst.
    Mit etwas Geschick laesst sich dieser Vorgang auch in eine Schleife packen, so dass du alle 4*4Bit in cx hintereinander abarbeiten kannst.

    BTW:
    DOSFunktion 09h erwartet in dx das Offset zu einem "$"-terminierten String.



  • Hi @Nobuo T
    Ich Danke Dir .
    Für deine infos und habe noch zwei Fragen steht in Dx der rest ?
    Und ist das falsch mit der Funktion 09h wie tu ich das in einen String ausgeben
    mit welchen register?
    BTW:
    Ist das hier falsch oder was meinst du da mit ?
    DOSFunktion 09h erwartet in dx das Offset zu einem "$"-terminierten String



  • NCODE schrieb:

    [...]steht in Dx der rest ?

    Die Funktion 04h vom int 1Ah (die Datumsfunktion) legt Monat und Tag in dx ab, falls du das meinst...

    NCODE schrieb:

    Und ist das falsch mit der Funktion 09h wie tu ich das in einen String ausgeben
    mit welchen register?

    Sry, aber ich verstehe deine Frage als Ganzes nicht.

    Folgendermassen konnte ich einigen Satzsegmenten einen Sinn zuordnen:

    NCODE schrieb:

    Und ist das falsch mit der Funktion 09h[?]

    So wie es in deinem Quellcode steht: ja.
    1. Geht das mit dem lea-Befehl so nicht (hast du ja selbst schon festgestellt)
    2. Steht beim Label "Jahrhundert" kein lesbarer String.
    3. Ist der String nicht terminiert, dh. abgeschlossen (mit "$").

    NCODE schrieb:

    wie tu ich das in einen String ausgeben[=umwandeln?]

    Das habe ich schon in meinem letzten Beitrag versucht, dir zu erklaeren.
    Hast du aber offensichtlich nicht verstanden...?

    NCODE schrieb:

    mit welchen register?

    Spielt keine Rolle... 😕

    NCODE schrieb:

    Ist das hier falsch[...]

    Wenn du mit "das hier" deinen Quelltext meinst: Ja, der laesst sich so weder assemblieren, noch wuerde er, wuerdest du das mit dem lea korrigieren, wirklich etwas sinnvolles tun (ausser einen unleserlichen Zeichenwust auf den Bildschirm schmeissen ;)).

    NCODE schrieb:

    [...]oder was meinst du da mit ? [/:] DOSFunktion 09h erwartet in dx das Offset zu einem "$"-terminierten String

    Hm, ok - versuche ich halt mal, diesen Satz etwas verstaendlicher zu formulieren:
    Die DOS-Funktion 09h (dh. ein Aufruf von int 21h, wenn ah=9 ist) gibt einen String auf dem Bildschirm aus. Diese Funktion geht davon aus, dass du als Programmierer die Speicheradresse des Strings (dh. da wo das erste Zeichen steht, das ausgegeben werden soll) vor dem Aufruf in ds:dx (Segment:Offset) geschrieben hast. Nun geht diese Funktion nacheinander alle Zeichen an dieser Adresse durch und gibt sie auf dem Bildschirm aus, bis sie auf ein ""stoesst.AnderStelle,wodas"" stoesst. An der Stelle, wo das "" im String steht, wird die weitere Verarbeitung des Strings abgebrochen (der String wird terminiert) - dh. "$" und alles was dahinter kommt, wird nicht mehr auf dem Bildschrim ausgegeben und das Programm laeuft hinter dem int 21h-Aufruf weiter.

    PS:
    Sry, aber du scheinst noch erhebliche Wissensluecken auf dem Gebiet Assembler zu haben. Ich wuerde dir empfehlen, erstmal einige der Tutorials, auf die in den FAQ verlinkt wird, durchzuarbeiten.

    PPS:
    Die Verwendung der hochdeutschen Rechtschreibung und Grammatik (dazu gehoeren auch Satzzeichen) erhoeht die Lesbarkeit. 😉
    Ich fuer meinen Teil hatte zumindest meine Schwierigkeiten damit, deine Schreibe zu deuten. 🙄



  • Hallo,

    versuch doch mal folgendes.

    .data
    TimeDate DB 12 dup(0)
    .code
    Start: 
    	mov ax,@data 
    	mov ds,ax                        ;Datensegment nach DS
    	mov es,ax                        ;Datensegment nach ES
    
    	mov ah,4                         ;Datum holen
    	int 1Ah 
    
    	mov 	si,OFFSET TimeDate	      ;Adresse von TimeDate nach DI
    	mov 	al,dl                   ;Tag 
    	Call 	MaskAnStore
    	mov	al,"."
    	stosb                            ;Schreibt al nach es:di, di wird incrementiert
    	mov	al,dh                   ;Monat
    	call	MaskAndStore
    	mov	al,"."
    	stosb	
    	mov	al,ch                   ;Jahrhundert
    	call	MaskAndStore	
    	mov	al,cl                   ;Jahr
    	call	MaskAndStore
    	mov	al,"$"                  ;String Ende Kennzeichen
    	stosb
    	mov	dx,OFFSET TimeDate      ;Adresse des Strings nach dx
    	mov	ah,09h
    	int	21h
    	mov	ax,4c00h
    	int	21h
    //----------------------------------------		
    	PROC MaskAndStore
    	push 	ax
    	shr 	al,4
    	and 	al,0x0f
    	add 	al 0x30
    	stosb
    	pop	ax
    	and	al,0x0f
    	add	al,0x30
    	stosb
    	ret
    

Anmelden zum Antworten