Was will er von al?



  • servus
    hab mir gerade nen kleinen quelltext vom tutorial angesehen und da stand folgendes:

    anfang:          mov ah,7                ;Eingabe
                     int 21h                 
    
                     mov dl, al
    
                     mov ah, 2               ;Eingabe anzeigen
                     int 21h
    

    ich verstehe nicht warum er "mov dl,al" macht?

    also ich denke mal das die eingabe in dl gespeichert wird aber warum nimmt er "al" als quelle? da ist doch noch gar nichts drinne?

    and by the way:
    nimmt man für interupts immer "ah"?
    wann und wie entscheide ich ob ich low oder high nehme?
    könnte man auch "mov dh, al" schreiben?



  • ah = eingabe parameter von int
    al = ausgabe parameter von int

    d.h. also die eingabe von

    mov ah,7                ;Eingabe
                     int 21h
    

    wird in al gespeichert und anschließend ins dl (mov dl, al) geladen.

    Richtig so?

    Aber woher weiß der anschließend interupt (mov ah, 2) denn, dass er ausgerechnet "dl" ausgeben soll. Was wäre wenn da noch mehrere register im spiel wären (z.b. dh oder so)



  • iklos nochma schrieb:

    Aber woher weiß der anschließend interupt (mov ah, 2) denn, dass er ausgerechnet "dl" ausgeben soll.

    Das haben die Leute von Microsoft mal vor langer langer Zeit festgelgt.



  • Siehe zB.
    hier
    und dann
    hier



  • Ok danke.

    und dann
    hier

    Also der gibt immer dl aus.
    aber was ist wenn ich z.b. eine kleine addition machen möchte?
    erste eingabe + zweite eingabe

    ich hätte nun einfach

    label1:
    mov ah,7
    int 21h
    mov dl, al
    
    mov ah,2
    int 21h
    
    jmp label2
    
    label2:
    mov ah,7
    int 21h
    mov dh, al ;diesmal halt nen anderes register weil er sonst ja die erste zahl überschreibt
    
    mov ah,2
    int 21h
    
    jmp label3
    
    label3:
    add dl, dh
    mov ah, 2
    int21h
    

    aber das scheint so nicht zu funktionieren 😞



  • Vielleicht solltest du dir zuerst die genaue Funktion der beiden int-Aufrufe in deinem Programm nochmal richtig klar machen.

    Allgemein:
    Ein Interrupt-Aufruf (OpCode "int") ist vergleichbar mit einem Funktionsaufruf. Dh. dieser Befehl kapselt intern irgendein kleines Programm, das mal ein Mensch geschrieben und sich etwas ganz bestimmtes dabei gedacht hat.
    Deshalb ist auch durch diesen Programm-Code in der int-Funktion festgelegt, welche Werte in welchen Registern zu stehen haben.

    int 21h ruft in DOS die DOS API auf. Dabei gilt immer, dass in ah die gewuenschte Funktionsnummer stehen muss.
    Welche Funktionen sich hinter welcher Nummer verbergen und welche Parameter die wo sonst noch erwarten kannst du aus Interrupt-Listen wie der oben verlinkten heraussuchen.

    int 21h, Funktion 02h (-> ah=02h) gibt was in dl steht als ein Zeichen (also praktisch ein char, falls dir das was sagt) an der aktuellen Cursor-Position auf dem Bildschirm aus.

    int 21h, Funktion 07h liest ein einzelnes Zeichen (wieder ein char) ein und gibt es in al zurueck.

    Mit den Infos kannst du dann nochmal genau analysieren, was dein Code eigentlich macht.

    Generell sollte dir zB. in Zeile 14-17 auffallen, dass die Ausgabe hier die 1. Eingabe wiederholen sollte und dass die Addition zweier chars ausgegeben als char zB. keine mehrstelligen dezimalen Zahlen ergeben kann. 😉
    Ich kann nur vermuten, dass du vor hattest, einzelne Dezimalzahlen einzulesen und zu addieren... Damit das allerdings zuverlaessig klappt, musst du die eingelesenen Zeichen in entsprechende integer-Werte und das Ergebnis anschliessend wieder in einen String, der die entsprechende Zahl repraesentiert, konvertieren -> etwas fortgeschrittenere Themen. Siehe dazu zB. diesen Thread hier.

    BTW:
    Ein jmp in die naechste Code-Zeile ist in den seltensten Faellen sinnvoll.



  • hmmm hab trotzdem nicht ganz verstanden, wie man die eingabe (mov ah,7) als dezimalzahl und nicht als ASCI code in "dl" speichert.
    ist doch bestimmt nur einekleine syntax oder



  • In dl stehen einfach nur 8Bit hintereinander. Ob du das nun als ASCII-Code, als Dezimalzahl oder Pfannkuchen interpretierst, ist allein dir ueberlassen. Haengt eben davon ab, was du damit machst.

    Was auch immer du mit "einekleine syntax" meinst:
    Hast du den verlinkten Thread und vor allem den darin verlinkten gelesen?
    Was hast du an dem dort beschriebenen Algorithmus zur Umwandlung von binaerer Ganzzahl (als die man die 8bit in dl ganz allgemein nach arithmetischen Rechnungen interpretieren kann) in einen String nicht verstanden?
    Mit einem einzigen Befehl ist es leider nicht ganz getan, falls du das meintest.
    Schau dir das halt nochmal an, Wikipedia weiss auch was dazu.


Anmelden zum Antworten