Autor Thema: Wiedereinmal ein paar Fragen...  (Gelesen 5652 mal)

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« am: 20. February 2005, 17:37 »
Hallo,
ich hab ein paar Fragen:
1. Wenn ich ein Zeichen mit dem Int. 16h und der Fun, 00h eingelesen habe, wie schreibe ich den in einen String?
2. Wie hänge ich dann an den String ein Null-Byte an?
3. Wie wechsel ich in die nächste Zeile? Gibt es da einen Int. dafür?

Danke schon mal...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 20. February 2005, 21:37 »
1. is es wichtig zu wissen, dass ein string nur eine anstammlung von bytes im speicher ist. du musst also einfach nur es:di auf den speicherbereich scharf machen, und dann stosb'n.
3. man wechselt, indem man die bytes 13 und 10 hintereinander ausgibt.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 21. February 2005, 14:34 »
Danke.
Nur noch ne Frage:
Wie kann ich 2 Strings vergleichen?

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #3 am: 21. February 2005, 14:45 »
du lädst immer ein byte und vergleichst sie, und das solange, bis eins von beiden zeichen 0 is, und wenn das andere auch 0 is, dann sin sie gleich, sonst net.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 21. February 2005, 14:55 »
Eine Frage dazu (ich weiß, dass es viele Fragen sind, und hoff das ich euch net nerv...)
Das Byte lad ich ja mit loadsb nach al lade, wohin soll ich dann daas nächste laden?

fasmat

  • Gast
Gespeichert
« Antwort #5 am: 21. February 2005, 15:44 »
Einfach mit

mov bl, al


Nach bl verschieben und dann das nächste byte laden :-)

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #6 am: 21. February 2005, 16:10 »
oder ah, dann brauchste net noch ein register.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 21. February 2005, 17:31 »

vergleichen:
mov si, command ; SI soll auf den Offset von 'command' zeigen
lodsb ; Ein Byte von 'command' nach AL laden
mov ah, al ; Nach ah kopieren
mov si, msg_reboot    ;SI soll auf den Offset von 'msg_reboot' zeigen
lodsb            ;Ein Byte von 'msg_reboot' nach AL laden
cmp ah, al
 je richtig
falsch:
;xxx
richtig:
;xxx

so, nun muss ich ja wieder zu 'vergleichen' sprigen, aber dann zeigt si ja wieder auf das erste byte von 'command'....
Wie stell ich das an, das es auf das 2. zeigt?

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 21. February 2005, 18:41 »
lodsb sollte eigentlich zum nächsten Byte springen...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #9 am: 21. February 2005, 19:14 »
1. ja, lodsb verändert das, aber wenn du neu initialisierst, dann gehts nicht, weil es dann wieder aufs erste zeigt, nimm also noch di als 2. pointer
2. außerdem brauchst du eine loop, bis eins der beiden 0 is...
3. so sollte es gehen:



mov si,string1
mov di,string2
call compare
cmp ah,0x00
je richtig
cmp ah,0x01
je falsch


compare:
push ax
mov ax,0x1234
vergleichen:
cmp al,0x00
je gleich
lodsb
mov ah,al
xchg si,di
lodsb
cmp al,ah
je vergleichen
ungleich:
pop ax
mov ah,0x01
ret
gleich:
pop ax
mov ah,0x00
ret


müsste gehen, habs aber nicht getestet. damit hast du eine funktion, und musst nicht überall, wo du den code brauchst den code einfügen, sondern nur die parameter (di,si) ändern und dann callen. als ergebniss kommt ah raus, bei gleichheit = 0, bei ungleich = 1.

mfg

J!N
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 22. February 2005, 16:40 »
Hallo,
danke, aber der  Code geht irgendwie net....
findet jemand den fehler? Hier nochmal der Code

compare:
push ax ; ax pushen
mov ax,0x1234 ; 0x1234 nach ax schreiben

vergleichen2:
cmp al,0x00 ; al mit 0x00 vergleichen
je gleich ; wenn sie gleich sind nach 'gleich' springen
lodsb ; ein byte von si (string1) nach al laden
mov ah,al ; al nach ah kopieren
xchg si,di ; si und di vertauschen (si zeigt nun auf den offset von 'string2')
lodsb ; ein byte von si (string2 !) nach al laden
cmp al,ah ; al (string2) mit ah (string1) vergleichen
je vergleichen2 ; wenn gleich nach 'vergleichen2' springen

ungleich:
pop ax ; ax aus den stack holen
mov ah,0x01 ; 0x01 nach ah kopieren
ret ; Return

gleich:
pop ax ; ax aus den stack holen
mov ah,0x00 ; 0x00 nach ah kopieren
ret ; Return

Ironfoot

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 22. February 2005, 16:52 »
Der Code selbst müsste funktionieren.
Wie rufst du die Funktion denn auf?

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 22. February 2005, 16:55 »

mov si,command ; si soll auf den Offset von 'command' zeigen
mov di,com_reboot ; di soll auf den Offset von 'com_reboot' zeigen

call compare ;'compare' aufrufen

cmp ah,0x00 ; ah mit 0x00 vergleichen
je reboot ; wenn sie gleich sind nach 'reboot' springen

Ironfoot

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 22. February 2005, 17:12 »
ist "command" Nullterminiert?

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #14 am: 22. February 2005, 18:11 »
Zitat von: Ironfoot
ist "command" Nullterminiert?


beide müssen nullterminiert sein...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 22. February 2005, 19:51 »
sofort, hier mal der ganze code



shell:

mov        ah, 0x0E        ;0x0D und 0x0A ausgeben (bewirkt Sprung in neue Zeile)
mov        al, 0x0D
int        0x10

mov si, prompt ; '>' ausgeben
call putstr ;

mov di, command
;---------------------------------------------------------
shell1:


mov ah, 0 ; Taste einlesen und den ASCII Code in AL
int 0x16 ; speichern

;Enter (und Backspace) überprüfen
cmp al, 0x0D ; Wurde 'Return' gedrückt?
 je null_byte ; Wenn ja, dann springe zu 'null_byte'

mov ah, 0x0E ;Zeichen ausgeben
int 0x10 ;

stosb ; Der Buchstaben, der in AL steht nach 'command' kopieren

jmp shell1 ; zu 'shell1' springen (Schleife)
;---------------------------------------------------------

;---------------------------------------------------------
null_byte:

mov al, 0
stosb ; Null-Byte anhängen
jmp vergleichen ; zu 'vergleichen' springen
;---------------------------------------------------------



vergleichen:


mov si,command ; si soll auf den Offset von 'command' zeigen
mov di,com_reboot ; di soll auf den Offset von 'com_reboot' zeigen

call compare ;'compare' aufrufen

cmp ah,0x00 ; ah mit 0x00 vergleichen
je reboot ; wenn sie gleich sind, nach 'reboot' springen


mov        ah, 0x0E        ;0x0D und 0x0A ausgeben (bewirkt Sprung in neue Zeile)
mov        al, 0x0D
int        0x10

mov si, wrong_command
call putstr
jmp shell

 

Einloggen