Autor Thema: String von der Tastertur auslessen  (Gelesen 6527 mal)

IcedCoffee

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« am: 01. August 2006, 16:31 »
MOin

ich schon wieder

ich möchte einen string in eine Variable schreiben [unbestimmte länge]
und habe mir dazu folgenden code geschreiben
[str_get ist meine funktion um den string zu erstellen]

mov ax, 1000h ; Segmentregister updaten
mov ds, ax
mov es, ax

start:
      mov si, msg ; gben sie ihren namen ein:
      call str_print
     
      mov SI, thxname
      call str_get
     
      mov si, msg2 ; ihr name ist:
      call str_print

      mov si, thxname
      call str_print
     
      mov si, msg3 ; Press any key
      call getkey
      jmp restart

msg db "Bitte geben Sie ihren namen ein: ", 0
msg2 db 13, 10, "ihr name ist: ", 0
msg3 db "Press any key to reboot dein system", 0
thxname db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
; ^^ habe ich erst mal gemacht damit ich
; sicher sein kann das speicher platz für  11 Zeichen da ist

; Stringausgabe
str_print:
       lodsb                  ; Byte laden
       or al,al
       jz short str_print_end ; 0-Byte? -> Ende!
       mov ah,0Eh             ; Funktion 0x0E
       mov bx,0007h           ; Atrribut-Byte
       int 10h                ; schreiben
       jmp str_print             ; n?chstes Byte
       str_print_end:
       retn

; Text eingabe Enter = Beenden
str_get:
        mov ah, 00h ; Funktion 00h
        int 16h     ; Ausfüren
        mov bl, 1Ch ; Enter
        cmp al, bl
        je short str_get_end ; Wenn Enter dann beenden
           mov [DS:SI], al   ; Speichere Zeichen
           inc SI
               mov ah, 0Eh   ; Ausgabe
               mov bx, 0007h
               int 10h
        jmp str_get          ; Neustart
        str_get_end:         ; String mit 0 Beenden
        inc SI
        mov al, 00h
        mov [DS:SI], al
        retn


; Warte auf einen Tastendruck
getkey:
       mov ah, 00h ; Funktion 0
       int 16h  ; Ausf?hren
       ret

restart:
       db 0EAh
       dw 0000h
       dw 0FFFFh

aber leider macht der code icht das was er soll
weil wenn ich nach der eingabe meines namens die Enter taste drücke springt der corser einfach an den anfang der zeile und läst mich die zeile einfach üeberschreiben

ST-225

  • Beiträge: 43
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 01. August 2006, 16:55 »
Also ich habe das bei mir folgendermaßen gelöst:


mov di, string
KB_in:
mov ah, 0x10
int 0x16
cmp al, 13
je Print
stosb
jmp KB_in
Print:
mov si, string
.loop1
lodsb
or al, al
jz .end
mov ah, 0x0E
int 0x10
jmp .loop1
.end
end


string times 256 db 0

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #2 am: 01. August 2006, 16:57 »
str_get:
        xor ah,ah ; Funktion 00h
        int 16h     ; Ausfüren
        cmp al, 13h ; Enter
        je short str_get_end ; Wenn Enter dann beenden
           mov [si], al   ; Speichere Zeichen
           inc SI
               mov ah, 0Eh   ; Ausgabe
               mov bx, 0007h
               int 10h
        jmp str_get          ; Neustart
        str_get_end:         ; String mit 0 Beenden
        xor al,al
        mov [si], al
        retn


Habe den Code ein bisschen angepast. Also du brauchst nicht ds:[si] schreiben. Wenn du [si] schreibst wird automatisch ds genommen. Außerdem solltest du wenn Enter aufgerufen wird si nicht inkrmentieren, weil er ja endweder schon inkrementiert wurde oder falls nur Enter gedrückt wird nicht inkrementiert werden brauch. Außerdem ist 1Ch nicht Enter. 13h ist Enter. 1Ch ist der Scancode von Enter nicht das ASCII Zeichen. Also testest du entweder al mit 13h oder ah mit 1Ch nicht aber al mit 1Ch.

bitmaster
In the Future everyone will need OS-64!!!

IcedCoffee

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 01. August 2006, 21:16 »
mh irgentwie ist der bug immer noch da

Booting from Floppy...
Loading...
Bitte geben Sie ihren namen ein: hallo

^^ da habe ich als namen hallo ein gegeben und dan enter gedrückt
danch springt der corser an den anfang der zeile
Bitte geben Sie ihren namen ein: hallo

und wenn ich jetzt was eingebe über schreibt er die zeile einfach
blablabla... und so weitern ein: hallo

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 01. August 2006, 22:54 »
Sorry, Enter ist 13 also 0Dh und nicht 13h. Also so muss str_get aussehen:

str_get:
        xor ah,ah ; Funktion 00h
        int 16h     ; Ausfüren
        cmp al, 0Dh ; Enter
        je short str_get_end ; Wenn Enter dann beenden
           mov [si], al   ; Speichere Zeichen
           inc SI
               mov ah, 0Eh   ; Ausgabe
               mov bx, 0007h
               int 10h
        jmp str_get          ; Neustart
        str_get_end:         ; String mit 0 Beenden
        xor al,al
        mov [si], al
        retn
In the Future everyone will need OS-64!!!

Biehler Productions

  • Beiträge: 51
    • Profil anzeigen
    • http://bielos.de.tk
Gespeichert
« Antwort #5 am: 02. August 2006, 11:12 »
Hm, ich hab den Code nicht getestet, aber wenn man nur 0DH ausgibt, springt er auch nicht an den Anfang der nächsten Zeile.
Soweit ich weis, muss man 0DH und 0AH ausgeben, damit in die nächste Zeile an den Anfang gesprungen wird.

IcedCoffee

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 02. August 2006, 12:29 »
Moin

jetzt geht es [irgentwie] also mit dem code von bitmaster und damit der string auch so lang werden kann wie er will habe ich die var ganz nach hinten geschoben

weil sonnst hat sie mir immer den inhalt der anderen vars überschrieben [aber nur wenn länger als 12[-1[0]] zeichen]

mov ax, 1000h ; Segmentregister updaten
mov ds, ax
mov es, ax

start:
      mov si, msg
      call str_print
     
      mov SI, thxname
      call str_get
     
      mov si, msg2
      call str_print

      mov si, thxname
      call str_print
     
      mov si, msg3
      call str_print
      call getkey
      jmp restart

msg db "Bitte geben Sie ihren namen ein: ", 0
msg2 db 13, 10, "Ihr name ist: ", 0
msg3 db 13, 10, "Press any key to reboot dein system", 0

; Stringausgabe
str_print:
       lodsb                  ; Byte laden
       or al,al
       jz short str_print_end ; 0-Byte? -> Ende!
       mov ah,0Eh             ; Funktion 0x0E
       mov bx,0007h           ; Atrribut-Byte
       int 10h                ; schreiben
       jmp str_print             ; n?chstes Byte
       str_print_end:
       retn

; Text eingabe Enter = Beenden
str_get:
        xor ah,ah ; Funktion 00h
        int 16h     ; Ausfüren
        cmp al, 0Dh ; Enter
        je short str_get_end ; Wenn Enter dann beenden
           mov [si], al   ; Speichere Zeichen
           inc SI
               mov ah, 0Eh   ; Ausgabe
               mov bx, 0007h
               int 10h
        jmp str_get          ; Neustart
        str_get_end:         ; String mit 0 Beenden
        xor al,al
        mov [si], al
        retn


; Warte auf einen Tastendruck
getkey:
       mov ah, 00h ; Funktion 0
       int 16h  ; Ausf?hren
       ret

restart:
       db 0EAh
       dw 0000h
       dw 0FFFFh
       
thxname db 00h

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #7 am: 02. August 2006, 16:54 »
Zitat von: Biehler Productions
Hm, ich hab den Code nicht getestet, aber wenn man nur 0DH ausgibt, springt er auch nicht an den Anfang der nächsten Zeile.
Soweit ich weis, muss man 0DH und 0AH ausgeben, damit in die nächste Zeile an den Anfang gesprungen wird.
Darum geht es gar nicht. Wenn du Enter drückst sagt der "int 16h" al = 0Dh. Er hatte aber nicht auf 0Dh sondern auf 1Ch getestet. Und dann wenn er Enter gedrückt hatte, wurde 0Dh auch geschrieben. Und 0Dh sorgt dafür das an den Anfang der aktuellen zeile gesprungen wird. Wenn er aber 0Dh abfängt durch cmp al,0Dh je str_get_end, dann wird 0Dh nicht ausgegeben sondern nach str_get_end gesprungen. Und genau das will er ja haben.

bitmaster
In the Future everyone will need OS-64!!!

IcedCoffee

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 02. August 2006, 18:58 »
kann mir vll einer einen link zu einer zeichen tabelle geben

weil ich habe nur diese
http://www.tu-chemnitz.de/informatik/RA/lehre/mop/dos_stuff/
und da ist 1Ch definitiv enter und nicht 0Dh

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 02. August 2006, 19:51 »
In dieser Tabelle werden die Scancodes aufgelistet. Die stehen in ah. Du arbeitest aber mit al, und da steht der ASCII Code drin, welcher für Enter 0Dh ist.
Dieser Text wird unter jedem Beitrag angezeigt.

IcedCoffee

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 02. August 2006, 20:03 »
Zitat von: PorkChicken
In dieser Tabelle werden die Scancodes aufgelistet. Die stehen in ah. Du arbeitest aber mit al, und da steht der ASCII Code drin, welcher für Enter 0Dh ist.
ok das mit dem ah habe ich ja verstanden aber in der tabelle von mir ist die Enter taste = 1c - Eingabe - return
edit:deswegen wollte ich fragen ob mit einer einen link zu einer anderen tabele gaben kann aber das hat sich ja jetzt schon geklärt

http://de.wikipedia.org/wiki/ASCII-Tabelle
http://de.wikipedia.org/wiki/Steuerzeichen

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #11 am: 02. August 2006, 20:04 »
Zitat von: PorkChicken
In dieser Tabelle werden die Scancodes aufgelistet. Die stehen in ah. Du arbeitest aber mit al, und da steht der ASCII Code drin, welcher für Enter 0Dh ist.
Jo, und genau das habe ich auch schon gesagt.

Aber du brauchst eine ASCII-Tabelle wenn du die Werte in al berücksichtigen möchtest: http://unicode.e-workers.de/ascii.php?PHPSESSID=bb0d68f0b6e9b34a19309904c54e25b9 oder http://de.wikipedia.org/wiki/ASCII oder http://www.asphelper.de/Referenz/ASCIIANSI.asp

bitmaster
In the Future everyone will need OS-64!!!

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 02. August 2006, 20:04 »
ASCI Code != Scan Code
ASCI Code Tabelle != Scan Code Tabelle

Du hast ne Scan Code Tabelle, liest aber ASCI Codes aus.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #13 am: 02. August 2006, 20:05 »
Zitat von: nooooooooos
ASCI Code != Scan Code
ASCI Code Tabelle != Scan Code Tabelle

Du hast ne Scan Code Tabelle, liest aber ASCI Codes aus.
ASCII und nicht ASCI. ^^

bitmaster
In the Future everyone will need OS-64!!!

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 02. August 2006, 20:07 »
:oops:  :oops: ^^

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 02. August 2006, 20:15 »
nooooooooos, nicht so einfach aufgeben. ;) Du hättest sagen müssen, dass ASCI für Amerikanischer Standard-Code für Informationsaustausch steht. Dann ist die Verwendung von einem I korrekt, und die Abkürzung ist nur eine (halbe) Eindeutschung von ASCII 8)
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #16 am: 02. August 2006, 20:54 »
Zitat von: PorkChicken
nooooooooos, nicht so einfach aufgeben. ;) Du hättest sagen müssen, dass ASCI für Amerikanischer Standard-Code für Informationsaustausch steht. Dann ist die Verwendung von einem I korrekt, und die Abkürzung ist nur eine (halbe) Eindeutschung von ASCII 8)
Lehrer: 1 + 1 ?
Schüler: 3
Lehrer: falsch 2
Schüler: Na gut, 3 - 1

bitmaster
In the Future everyone will need OS-64!!!

Thoth

  • Beiträge: 62
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 03. August 2006, 00:38 »
Um den Offtopic Stream hier mal weiterzuführen: für einen Physiker ist das sowieso alles in der Ordnung von 10 hoch 1 *g*
Madness isn't a bug - it's a feature

 

Einloggen