Programmstück für Ringtausch schreiben



  • Hallo,

    ich bitte um Überprüfung meiner Lösung der folgenden Aufgabe.

    Schreiben Sie ein Programmstück, welches einen Ringtausch von drei Speicherinhalten (jeweils 32 bit) vornimmt. Die drei Speicherzellen befinden sich nichtüberlappend an beliebigen Positio- nen. Ihre Adressen stehen ebenfalls im Speicher, und zwar aufeinanderfolgend in Form einer Tabelle (drei Einträge von je 32 bit). Die Anfangsadresse dieser Tabelle steht im Register ESI.

    Mein Vorschlag wäre:

    MOV EAX,[ESI]
    MOV EBX,[ESI+4]
    MOV ECX,[ESI+8]
    MOV [ESI],ECX
    MOV [ESI+4],EAX
    MOV [ESI+8],EBX

    Ich habe keine Ahnung, ob das so funktionieren könnte.



  • Patrick1990 schrieb:

    Hallo,

    ich bitte um Überprüfung meiner Lösung der folgenden Aufgabe.

    Schreiben Sie ein Programmstück, welches einen Ringtausch von drei Speicherinhalten (jeweils 32 bit) vornimmt. Die drei Speicherzellen befinden sich nichtüberlappend an beliebigen Positio- nen. Ihre Adressen stehen ebenfalls im Speicher, und zwar aufeinanderfolgend in Form einer Tabelle (drei Einträge von je 32 bit). Die Anfangsadresse dieser Tabelle steht im Register ESI.

    Mein Vorschlag wäre:

    MOV EAX,[ESI]
    MOV EBX,[ESI+4]
    MOV ECX,[ESI+8]
    MOV [ESI],ECX
    MOV [ESI+4],EAX
    MOV [ESI+8],EBX

    Ich habe keine Ahnung, ob das so funktionieren könnte.

    Das sieht doch gar nicht so schlecht aus.

    Und was hälst du von dieser Variante?:
    MOV EAX,[ESI]
    MOV EBX,[ESI+4]
    MOV ECX,[ESI+8]
    MOV [EAX],ECX
    MOV [EBX],EAX
    MOV [ECX],EBX

    Dirk



  • Danke,
    ist natürlich eleganter.

    Und das wars schon?



  • Patrick1990 schrieb:

    Danke,
    ist natürlich eleganter.

    Und das wars schon?

    Ja das wars schon, weil die Aufgabe war nicht so schwer, wenn man es weiss wie man adressieren kann. Andernfalls kann man schon am grübeln sein.

    Dirk



  • Danke,

    ich glaube ich denke da oft zu schwer und bin mir zu unsicher in dem, was ich schreibe.



  • Patrick1990 schrieb:

    Danke,

    ich glaube ich denke da oft zu schwer und bin mir zu unsicher in dem, was ich schreibe.

    Ups, jetzt ist mir doch eine gravierender Fehler unterlaufen. Es ist wohl doch schon zu spät.
    Wir haben aus versehen die Adressen von der Adresstabelle vertauscht, aber nicht die Werte die bei den Adressen stehen.
    Der Code muss also noch etwas ergänzt werden.
    Das darfst du aber machen und ich schaue mir das dann morgen an.
    Gute Nacht.

    PS: Da war ich wohl etwas zu voreilig.

    Dirk



  • Ich weiß nicht so richtig, was nun noch fehlt 😞 stehe auf dem Schlauch oder das Verständnis fehlt.

    Haben wir nicht die Speicherinhalte schon getauscht? Also in den eckigen Klammern steht der Speicherinhalt(Adresse) des Speichers oder? Vermutlich hause ich jetzt wieder alles durcheinander.

    Was ist jetzt mit den Werten, die bei den Adressen stehen gemeint?



  • Und was hälst du von dieser Variante?:
    MOV EAX,[ESI]
    MOV EBX,[ESI+4]
    MOV ECX,[ESI+8]
    MOV [EAX],ECX
    MOV [EBX],EAX
    MOV [ECX],EBX

    Nochmal eine Frage hierzu.

    MOV [EAX],ECX
    MOV [EBX],EAX
    MOV [ECX],EBX

    Ist es nicht so, dass das was in ECX steht in EAX geschrieben wird?
    Dann würde bei dem zweiten Schritt ja das was nun in EAX steht in EBX geschrieben.
    (Für mich klingt dies so, als würde der Inhalt aus ECX nun in EBX stehen?)

    Verstehe ich das falsch?



  • Patrick1990 schrieb:

    Und was hälst du von dieser Variante?:
    MOV EAX,[ESI]
    MOV EBX,[ESI+4]
    MOV ECX,[ESI+8]
    MOV [EAX],ECX
    MOV [EBX],EAX
    MOV [ECX],EBX

    Nochmal eine Frage hierzu.

    MOV [EAX],ECX
    MOV [EBX],EAX
    MOV [ECX],EBX

    Ist es nicht so, dass das was in ECX steht in EAX geschrieben wird?

    MOV [EAX],ECX
    Damit wird der Inhalt von ECX zu der Adresse geschrieben die sich in EAX befindet. Der Inhalt von EAX wird als Adresse interpretiert wegen den eckigen Klammer[] rundherum. Bei Befehlen mit eckigen Klammern wird immer auf eine Speicheradresse zugegriffen (lesend oder schreibend). Der Inhalt von EAX wird durch die Operation nicht verändert. Verändert wird nur die Speicheradresse deren Nummer sich zur Zeit in EAX befindet.

    Dann würde bei dem zweiten Schritt ja das was nun in EAX steht in EBX geschrieben.
    (Für mich klingt dies so, als würde der Inhalt aus ECX nun in EBX stehen?)

    Verstehe ich das falsch?

    ja ich hatte mich unklar ausgedrückt, aber ich hoffe es nun verständlich gemacht zu haben.

    Den Ringtausch verläuft so ähnlich wie bei der anderen Aufgabe.

    Adresstabelle: AdresseA, AdresseB, AdresseC

    AdresseA

    AdresseB

    AdresseC

    Mit einem Adressregister holen wir eine Adresse aus der Tabelle in ein weiteres Register, welches wir im nächsten Schritt nun als Adressregister verwenden, um damit die Speicherstelle zu addressieren auf deren Wert wir zugreifen wollen.

    MOV EAX,[ESI] ; Adresse holen
    MOV EBX,[ESI+4] ; Adresse holen
    MOV ECX,[ESI+8] ; Adresse holen

    Nun sollten wir die Werte holen die wir vertauschen wollen.

    MOV EBP,[EAX] ; ersten Wert holen
    MOV EDI,[EBX] ; zweiten Wert holen
    MOV EDX,[ECX] ; dritten Wert holen

    MOV [EAX],EDX ; Werte vertauscht zurückschreiben
    MOV [EBX],EBP
    MOV [ECX],EDI

    Dirk



  • Ok danke Dirk, habe es nun verstanden.


Anmelden zum Antworten