Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: IcedCoffee 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
-
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
-
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
-
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
-
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
-
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.
-
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
-
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
-
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
-
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.
-
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
-
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
-
ASCI Code != Scan Code
ASCI Code Tabelle != Scan Code Tabelle
Du hast ne Scan Code Tabelle, liest aber ASCI Codes aus.
-
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
-
:oops: :oops: ^^
-
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)
-
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
-
Um den Offtopic Stream hier mal weiterzuführen: für einen Physiker ist das sowieso alles in der Ordnung von 10 hoch 1 *g*