Eingabe



  • Bis jetzt habe ich das noch nie richtig gebraucht, weil ich eher Systemaufgaben mit Assembler bewältigt habe, aber nun würde mich doch gern interessieren, wie das funktioniert.
    Folgende Fragen:

    1. Wie lese ich eine Zeichenfolge ein? Das bedeutet auch einzelne Zeichen einlesen können oder alle Zeichen bis zu ENTER einlesen oder alle Zeichen bis zur Leertaste einlesen können. Nun möchte ich aber auch auf die einzelnen Zeichen zugreifen können. Das heißt beispielsweise mit CMP, ein Vergleich erstellen, nur so als Beispiel könntet ihr mir geben.

    2. Zahlen sind mir auch sehr wichtig. Wie stell ich das an? Also auch wieder von einzelne Zeichen bis zum ENTER Druck. Und was sollte passieren, wenn der Benutzer ein unbekanntes Zeichen eingibt? Ein Fehler? Wie vermeide ich ihn? Gebt bitte ein Beispiel mit CMP als Vergleich und Zugriff darauf.

    3. Konventierungen brauch ich auch. Wie konventiere ich eine Zahl zum String? Oder wie konventiere ich einen String in eine Zahl? In C++ geht das ja auch (atoi() und sprintf()). Beispiel bitte geben!

    Bitte schmückt mir eure Beispiele zu den jeweiligen Punkten mit Kommentaren zu, damit ich erkenne was was bedeutet.
    Ja sicherlich ist das nicht sehr einfach, aber ich brauch es. Versucht bitte auch Details zu erklären.

    Danke schon im vorraus... Keffie



  • Hi.

    Da Du kein OS angegeben hast, nehme ich an, Du hast vor RM BIOS interrupts zu benutzen?
    Sieh dir in diesem Fall mal die Beschreibung zum int 16h in einer Interruptliste an. (zB. Ralph Browns)

    Mit diesem Interrupt lassen sich einzelne Zeichen einlesen.
    Wie Du nun daraus eine Routine zusammenbastelst, die solange Zeichen in einen String stapelt, bis <Enter> gedrueckt wird, o.ae. ueberlasse ich mal voll und ganz deinen Faehigkeiten, als Programmierer...
    (Das sollte nun wirklich niemanden, der ernsthaft programmieren will ueberfordern... 😉 sollten deine Asm-Kennstnisse nicht ausreichen, schau dich nochmal in der FAQ um, dort gibts massig Tuts)

    Sry, aber was Du mit Punkt 2 meinst konnte ich nicht ganz nachvollziehen.

    Zu 3:
    Hier gibts jetzt einfahc nur beispielcode - Sry, habe keine Lust, das jetzt lang und breit zu erleutern :p hoffe das ist auch so verstaendlich.

    Zahl2String:
    ;es:di zeigt auf einen String.
    ;Zahl in ax
    
    mov bx,000Ah
    mov cx,0000h
    @@Loop0:
    mov dx,0000h ;dx muss hier vor jeder Division geloescht werden
    div bx ;Zahl (in ax) durch 10 teilen
    inc cx ;Zifern-Zaehler eins rauf
    add dl,30h ;ASCII-Zeichen von "0" bis "9" liegen bei 30h-39h
    push dx  ;Rest der Division auf dem Stack ablegen
    test ax,ax ;ist die Ausgangszahl 0?
    jnz short @@Loop0 ;wenn nicht => nachmal.
    ;Bei diesem Algo kommen die Ziffern in falscher Reihenfolge heraus. (im stack)
    ;in der naechsten Schleife muss die Reihenfolge umgekehrt werden.
    ;in cx steht die Anzahl der Ziffern.
    
    mov bx,cx ;nach dieser Schleife steht die Anzahl d. Ziffern in bx.
    @@Loop1:
    pop ax ;Ziffer wieder vom Stack holen...
    stosb  ;in den Speicher zu es:di schreiben
    loop @@Loop1
    
    Und nun String2Zahl:
    ;ds:si zeigt auf String
    ;cx ist Anzahl Ziffern
    
    mov ax,0000h
    mov di,000Ah
    mov bh,00h
    @@Loop0:
    mul di ;ax*10
    mov bl,[si] ;Ziffer vom String holen
    inc si
    sub bl,30h
    cmp bl,09h ;wenn die Zahl nicht eine Ziffer (0-9) war, ist bl jetzt >9
    ja  short @@ZahlFehler ;was in diesem Fall getan werden soll, kannst Du dir aussuchen
    add ax,bx
    loop @@Loop0
    ;Die Zahl steht jetzt in ax.
    
    (Diese 2 Procs hab ich mir jetzt mal aus dem Aermel geschuettelt, also keine Garantie)
    

Anmelden zum Antworten