Register, welches wann und wo?



  • Hi,
    woltl mal fragen was es mit den 4 registern AX,BX,CX und DX auf sich hat, was muss in welches rein? wenn ich z.b. text ausgeben will kopiere ich es in DX mache ich es in CX komtm irgend nen müll als ausgabe bei DX kommt das, was ich ihm auch gesagt hab, woher weis ich also was worein muss?
    Und wie sieht es mit der ababeitung aus?? wird erst a dann b dann c udn dann d ?? oder wie?? Danke



  • mal ne Frage: Probierst du alles nur aus, oder hast du ein Buch o.ä.? Deine Frage klingt ja fast nach ersterem, alle Achtung.



  • jup, hab nen tut, aber da wird das nicht erklärt und dann wird halt rumprobiert....aber hab mir heute nen Buch bestellt, aber ich wäre trotzdem Dankbar für eine Antwort



  • Das ist einfach nur Konventionssache, wenn du z.B. ne DOS-Fukntion nutzt um eine Zeichenkette auszunetzen, dann haben die Erfinder von DOS sich gesagt, wir packen das jetzt da rein etc. Dazu kommt halt noch dass manche Befehle bestimmte register nutzen müssen (das ist dann meistens ax, ax:dx oder eax:edx, z.B. bie division/multiplikation). Alles nur Konventionssache 🙂 Wenn du selber mal ne Ausgabefunktion scvhreiben würdest, könntest du z.B. genauso bestimmen, dass der Zeiger auf den String in bx übergeben wird etc.



  • also... 😉

    da hätten wir als erstes mal die 'multifunktions' register (general registers).
    AX -> akkumulator
    BX -> basis daten register (base data register)
    CX -> zähler register (count register)
    DX -> daten register (data register)

    sie sind, wie alle 8086 register, jeweils 16 bit groß und innerhalb nochmal in jeweils ein hohes und ein niedriges byte aufgeteilt (z.b. AH/AL, BH/BL...). das sind die register, in denen Werte addiert werden können, die parameter für funktionen aufnehmen und für viele andere aufgaben benötigt werden.

    viele anweisungen erwarten parameter in ax, und oft stehen auch die ergebnisse von operationen in ax.

    dann haben wir die segment register (segment registers)
    CS -> zeigt auf den beginn des code-segments
    DS -> zeigt auf den beginn des data-segments
    ES -> ein extra segment zeiger
    SS -> zeigt auf den anfang des stack-segments

    im "real-mode" (normaler betriebsmodus eines prozessors unter DOS) wird der speicher in segmente unterteilt in den segment registern steht, in welchem segment sich die daten (DS), der code (CS) und der stack (SS) des programmes befinden. das register ES ist das "extra segment", es kann beliebig eingesetzt werden und wird oft bei speicherzugriffen benötigt.

    hier dann noch die zeiger register (pointer registers)
    IP -> befehlszeiger (instruction pointer)
    SP -> stack zeiger (stack pointer)
    BP -> basis zeiger (base pointer)

    IP ist wohl so ziemlich das wichtigste aller register. sein wert gibt an, an welcher stelle im programmablauf sich der prozessor momentan befindet (genauer: die offset adresse der nächsten anweisung, die ausgeführt werden soll).

    SP und BP werden zur stack-verwaltung verwendet.

    und zu guter letzt die daten transfer register (data transfer registers)
    SI -> quell index (source index)
    DI -> ziel index (destination index)

    SI und DI sind hauptsächlich für speicherzugriffe verwendet.

    alle unklarheiten beseitigt? 😉

    bernd

    btw: welche daten in welches register gehören guckst du am besten mal in einem guten interrupt-table nach 😉 einfach mal ein bisschen googlen 😉

    [ Dieser Beitrag wurde am 11.09.2002 um 19:58 Uhr von root2 editiert. ]



  • danke, jetzt is fast alles geklärt,
    da ich eigentlich nen c progger bin, arbeite ich irgendwie noch mti dem hintergedanken das alles nach der reihe ausgeführt wird, nur wie sieht das mit den ganzen registern aus?also werden die alle gleichzeitig verarbeitet?? Mal ein Beispiel: Also ich will ejtzt mal nen string ausgeben dazu kopiere ich die offset adresse von dem string in dx:

    mov dx,offset text

    und dann führe ich ja den dos interrupt 21h aus, also sieht das so aus.also einfach nur int21h

    so aber auf was greift jetzt int21h zurück? auf dx ??

    und vorher muss ich ja noch die funktion 9 ausführen bzw. in das register ax kopieren.

    als osieht dasd dann so aus

    mov ax,0900h
    mov dx,offset text
    int 21h

    so verarbeitet er ja gleichzeitig das was in dx und in ax steht, das is irgendwie unklar für mich, oder gibts da doch ne reihenfolge??



  • hmm... also am besten ists vielleicht das ganze zu sehen wie einen funktionsaufruf:

    der interrupt 021h ist die funktion und die benötigt eben zwei parameter (AH=09h -> String ausgeben, DX=OFFSET des strings) um korrekt ausgeführt zu werden.

    praktisch wie ein c aufruf der art:

    output int21h(OutputArt, OutputAdresse)
    

    btw: du kannst auch anstatt

    MOV DX, OFFSET blablabla

    einfach schreiben:

    LEA DX, blablabla

    LEA = LoadEffectiveAddress, ist praktisch genau das selbe wie MOV DX, OFFSET.
    ist in der verarbeitungsgeschwindigkeit bei prozessoren ab pentium schneller und spart auch noch tipparbeit 😉

    [ Dieser Beitrag wurde am 11.09.2002 um 20:40 Uhr von root2 editiert. ]



  • aso.... nu hab ich es fast verstanden, woher weis denn jetzt die funktion 21h wo ihre art also 9h in welchem register steh, oderm uss die auch in ax sein?? bzw. ah oder al ??



  • Das ist einfach vorgegeben, dass der Wert dadrin steht. Die Funktion geht einfach davon aus, dass z.B. in dx der Zeiger auf den String ist, wenn das nicht ist, versucht die Funktion trotzdem dx zu nutzen 🙂



  • Wenn du int21h aufrufst, dann wird eine bestimmte Routine aufgerufen, und die guckt wohl als erstes nach was in ah steht, und entscheidet aufgrund dieses Wertes was eigentlich zu tun ist (z.B. ah = 9 --> den mit '$' terminierten String an ds:dx auf dem Bildschirm ausgeben).

    Du solltest vielleicht mal in den FAQs mal nach nem besseren Tut schauen, auch die Sache mit den Registern ist schon einmal ausführlich beschrieben worden (vorallem mit 32/16/8 bit Registern)

    mfg
    -bg-

    [edit]Die Interrupt-Funktionen werden meistens mit ah ausgewaehlt.[/edit]

    [ Dieser Beitrag wurde am 12.09.2002 um 15:49 Uhr von Nobuo T editiert. ]


Log in to reply