Ablauf von Assemblerbefehlen verstehen.



  • Hallo,
    ich beschäftige mich zurzeit im Rahmen meines Studiums mit Assemblerbefehlen und wir sollten eine Abfolge analysieren und den schlussendlichen Wert in den Registern angeben.

    Es war folgender Ablauf gegeben:
    MOV ECX, 3210FF04H
    MOV EBX, 10H
    MOV EAX, 0
    m4:MOV [ESI], EBX
    ADD AX, BX
    ROR EBX, 1
    ADD ESI, 4
    DEC CL
    JNZ m4
    MOV EDX[ESI-8]

    Als Ergebnis hatten wir vorgegeben:
    EAX: 0000 001E H
    EBX: 0000 0001 H
    ECX: 3210 FF00 H
    EDX: 0000 0004 H

    Wie komme ich bei ECX auf 0000 hinten, wenn ich doch den Wert einfach nur ins Register geschrieben haben? 😕

    Ich werde nachher noch einige Fragen hinzufügen und danke schon mal vielmals für eure Hilfe!

    Gruß



  • MTR_Student schrieb:

    Wie komme ich bei ECX auf 0000 hinten, wenn ich doch den Wert einfach nur ins Register geschrieben haben? 😕

    Denk mal über die Beziehung zwischen ECX und CL nach. Bzw. allgemein über das Verhältnis zwischen E*X, *X, *H und *L (für * = A, B, C, D).



  • Bashar schrieb:

    MTR_Student schrieb:

    Wie komme ich bei ECX auf 0000 hinten, wenn ich doch den Wert einfach nur ins Register geschrieben haben? 😕

    Denk mal über die Beziehung zwischen ECX und CL nach. Bzw. allgemein über das Verhältnis zwischen E*X, *X, *H und *L (für * = A, B, C, D).

    Ja diese CX ist ja die Hälfte vom ECX (32 Bit) und mittels CH/CL kann die vorderen bzw. hinteren 8 Bit des 16 Bit Registers von CX ansprechen oder?



  • Ich hatte vorhin leider in der Befehlsfolge das CL vergessen und somit ist mir das natürlich mit Dekrementierung klar.



  • irgendwie passt deine code vorgabe nicht zu den vorgegebenen ergebnissen...



  • und ein syntaxfehler ist ebenfalls enthalten

    ansonsten:

    [] nimmt den angegebenen ausdruck als adresse und greift lesend, schreibend oder ausführend darauf zu.

    kopiere den wert 2 ins akkumulatorregister EAX
    mov EAX,2

    kopiere den wert 2 an die adresse, die EAX enthält. EAX selbst wird NICHT verändert
    mov [EAX], 2

    hierbei werden dwords gehandelt.



  • codevorgabe schrieb:

    irgendwie passt deine code vorgabe nicht zu den vorgegebenen ergebnissen...

    nehme meine aussage zurück: habe nicht aufmerksam genug gelesen. passt schon....



  • MTR_Student schrieb:

    Wie kann ich mir das mit diesen Registern überhaupt allgemein vorstellen?

    Die CPU-Register kann man sich ähnlich wie sehr schnelle Speicheradressen vorstellen, wo man Werte reinschreiben und Auslesen kann. Zusätzlich werden einige CPU-Befehle defaultmäßig an bestimmte Register zugeordnet. Beispielsweise für String-Befehle wie lodsb/lodsw/lodsd wird defaultmäßig das Segment-Register DS und das Offsetregister (E)SI zugeordnet und deren Inhalt als Adresse verwendet.

    Ja mit (intel-syntax):
    mov eax, Wert ; schreiben wir ein Immidiate-Wert in das EAX-Register
    mov esi, Adresse ; schreiben wir ein Immidiate-Wert in das ESI-Register
    mov [esi], eax ; schreiben wir den Inhalt von EAX zu der Adresse in DS:ESI

    Beim letzten Befehl wird das ESI-Register als Adressregister verwendet und der Innalt von ESI als Offset-Adresse verwendet. Die Adress-Angabe im ESI-Register bleibt erhalten und wird nicht verändert. Verändert wird ggf. nur die Speicherstelle bei der Adresse, die sich aus der Kombination aus dem Inhalt des Segmentregisters DS zusammen mit dem Offset-Register ESI ergibt(Real-Adressmode), oder sich aus der Segmentadresse im Segment-Desciptor(im GDT/LDT) für DS (oder ggf. auch den Adress-Einträgen einer Pagetable) und zusammen mit dem Offset-Register ESI ergibt (Protected Mode).

    Nur bei den schon oben erwähnten Stringbefehlen wie lodsb.... wird beispielsweise durch den Befehl das Offsetregister E(SI) mit verändert und zeigt danach auf den nächsten Eintrag, der je nach Direction-Flag dann auf eine höhere Adresse, oder niedrigere Adresse zeigt und mit weiterbewegt wird.

    Was passiert denn genau, wenn ich es nicht in Klammern setze und dann es mittels MOV Befehl überschreibe, wird dann die Adresse verändert? 😕

    Entweder wird bei "mov Adresse, eax" eine Fehlermeldung erzeugt, oder der Befehl wird als "mov [Adresse], eax" interpretiert und ausgeführt (MASM 5).

    Dirk



  • codevorgabe schrieb:

    mov [EAX], 2

    hierbei werden dwords gehandelt.

    Bist du sicher das wirklich ein Dword geschrieben wird und nicht nur ein einzelnes Byte?

    Damit der Assembler es festellen kann, ob beim Schreiben eines Immediate-Wertes an eine bestimmte Adresse ein BYTE, ein WORD, oder ein DWORD geschrieben werden soll, deswegen müssen wir es bei solchen Befehlen immer mit angeben.

    mov DWORD [EAX], 2
    oder MASM
    mov DWORD PTR [EAX], 2

    Denn woher soll der Assembler es sonst wissen, ob ggf. doch nur ein einzelnes Byte geschrieben werden soll?

    Diese Angabe ist nicht erforderlich wenn wir als Operand eine Registerangabe machen, womit dann ja die Anzahl der Bytes bereits mit der Angabe des Registers auch seine Größe bekannt ist.
    (Ausnahme bei MASM und einem DWORD-Register als Operand = "mov DWORD PTR[EAX], ESI" muss DWORD angegeben werden. Aber bei "mov [EAX], SI" und mov [EAX], CL" nicht.)

    Dirk



  • da hast du recht. bin manchmal echt NULL konzentriert.


Anmelden zum Antworten