Autor Thema: Kleines Assembler probelm  (Gelesen 6057 mal)

Nic

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« am: 12. April 2004, 18:44 »
Hi,
Ich habe vor kurzem mit dem OS/Assembler coding begonnen
und hab jetzt mal ein paar fragen:

1.) In einem Assembler tutorial habe ich folgendes programm geschrieben:
;---------------------------------------------------------------------------------
;-                             Testprogramm by nic                               -
;-Das programm soll solange eine schleife ausführen bis der benutzer A eingibt ;-doch leider funktioniert das nicht (bei mir)
;---------------------------------------------------------------------------------

org 100h

Schleife:
 mov ah,09         ;String ausgeben
 mov dx,msgEingabe ;
 int 21h           ;

 mov ah,01         ;Zeichen einlesen
 int 21h           ;

 cmp dl,"a"        ;War das eingegebene Zeichen A
 je ZeichenWarA    ;Springe zum "ZeichenWarA" Label

 mov ah,09         ;Wenn nicht dann ...
 mov dx,msgNichtA  ;gib diesen String aus
 int 21h           ;
 jmp Schleife      ;und wiederhole die Schleife

ZeichenWarA:       ;Wenn doch dann...
 mov ah,09         ;gib diesen String aus
 mov dx,msgWarA    ;
 int 21h           ;

mov ah,4Ch         ;Beende das Programm
int 21h            ;

;---------------------------------------------------------------------------------
;-                           Funktionen und Variablen                            -
;---------------------------------------------------------------------------------

msgEingabe db "Bitte geben sie A ein: ",13,10,"$"
msgWarA db "Sie haben A eingegeben",13,10,"$"
msgNichtA db "Sie haben nicht A eingegeben",13,10,"$"
2.)In der ersten Ausgabe von Lowlevel hat man ja einen kleinen Kernel programmiert...langsam verstehe ich auch den code doch folgender bleibt mir unschlüssig ...Könnte mir jemand stück-für-stück erklären was genau da passiert
Hier der Code:
;Funktion zum Ausgeben eines strings
schreiben:
lodsb
or al,al
jz short schreiben_d
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp schreiben

schreiben_d:
retn
thx, Nic! ;)

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #1 am: 12. April 2004, 18:51 »
Also bei lodsb wird ein byte des strings eingelesen. Bei or al,al wird geprüft ob al 0 ist(könnte man auch cmp al,0 formuliern oder sonstwie) wenn ja wird nach schreiben_d gesprungen und dann per retn zu dem punkt gesprungen an dem die funktion gerufen wurde. Wenn nicht werden in ah und bx attribute geschrieben die dann im int 10h ausgewertet werden bx = 07 gibt vorder und hintergrund farbe an (welche das genau sind musst du selbst irgendwo nachschaun, da ich dass nicht so im kopf hab) dann gehts wieder nach oben und der nächste byte wird eingelesen und alles wieder von vorn;)
Ich hoffe das war halbwegs verständlich^^

Autor db "Roshl",0
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Nic

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 12. April 2004, 18:58 »
ok, danke
Ich glaube jetzt hab ichs geschnallt ;)

Welche interrupts werden da verwendet ?
BIOS-interrupts ?

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #3 am: 12. April 2004, 19:07 »
Bios Int 10h jap;) da is auch alles fürs Bildschirmmode umschlten drin und für Pixel maln (wenn mans langsam machen will schneller is direkt in speicher schreibn^^)
Am Anfang hast du eigentlich nur die Bios ints und die Hardware ints
(Zumindest kenn ich nur die, und selbst wenn ich werkl eh im Protected Mode rum und da muss man sich eh alles selbst machen,was schneller is und irgndwie einfach besser kommt)
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Nic

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 13. April 2004, 11:34 »
hmmm, hat keiner eine Antwort zu mein 1. Problem?

[zitat]
Das programm soll solange eine schleife ausführen bis der benutzer A eingibt doch leider funktioniert das nicht (bei mir)
;---------------------------------------------------------------------------------
;-                             Testprogramm by nic                                               -
;---------------------------------------------------------------------------------

org 100h

Schleife:
mov ah,09         ;String ausgeben
mov dx,msgEingabe ;
int 21h           ;

mov ah,01         ;Zeichen einlesen
int 21h           ;

cmp dl,"a"        ;War das eingegebene Zeichen A
je ZeichenWarA    ;Springe zum "ZeichenWarA" Label

mov ah,09         ;Wenn nicht dann ...
mov dx,msgNichtA  ;gib diesen String aus
int 21h           ;
jmp Schleife      ;und wiederhole die Schleife

ZeichenWarA:       ;Wenn doch dann...
mov ah,09         ;gib diesen String aus
mov dx,msgWarA    ;
int 21h           ;

mov ah,4Ch         ;Beende das Programm
int 21h            ;

;---------------------------------------------------------------------------------
;-                           Funktionen und Variablen                            -
;---------------------------------------------------------------------------------

msgEingabe db "Bitte geben sie A ein: ",13,10,"$"
msgWarA db "Sie haben A eingegeben",13,10,"$"
msgNichtA db "Sie haben nicht A eingegeben",13,10,"$"
[/zitat]

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #5 am: 13. April 2004, 12:08 »
Also ich weiss jetzt nicht ob das eingelesene Zeichen nach dem Int 21h in dl steht (falls nich dann is da der fehler) falls doch dann liegts vielleicht daran das der Benutzer A(Gross) eingeben soll, du aber nach a(klein) im Programm abfragst wenns das nicht is weiss ich au net, ich nutze keine DOS-Int's
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Nic

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 13. April 2004, 12:17 »
ahhhhh ,danke!!!!

hab nochmal nachgeguckt ...es wurde nicht in DL sondern AL gespeichert, jetzt funzt es ;)

Saberforce

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 13. April 2004, 12:18 »
hi

ich glaube fast das der ASCII Code in AL steht oder ?
versuch einfach mal AL:

also cmp al, "a"

und bin sicher ob das einfach mit "a" klappt bin ich mir
auch nicht naja einfach mal testen ;)

greetz Saber

Nic

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 13. April 2004, 12:34 »
Auch dir danke.
Warst nur ein bisschen zu spät :)

 

Einloggen