Assembler-Code nachvollziehen?

... komplette Frage anzeigen

1 Antwort

In Zeile 7 wird ECX auf 0 gesetzt, indem dieses register mit sich selbst ge-xor-ed wird. (Jeder Wert mit sich selbst XOR verknüpft ergibt genau Null!)

In vielen Programmiersprachen wird das als "a ^ b" geschrieben. (Nicht verwechseln mit "a hoch b"!)

CX (2 Byte groß) besteht aus zwei Hälften, CH und CL (jeweils 1 Byte groß), und ECX (4 Byte) besteht ebenfalls aus zwei Hälften, wovon die unteren 2 Byte über CX ansprechbar sind. Wird nun also ECX auf Null gestzt, und CL der Wert von AL zugewiesen (also 4), und danach noch 2 subtrahiert, enthält CL den Wert 2.

Da CL das niederwertigste Byte von ECX ist, und die anderen Bytes alle 0 sind, hat damit also ECX den Wert 2.

In Hex (mit Lücke zwischen CL und dem Rest): 0x000000 02

Zeile 8 kopiert den Wert von AL nach CL und Zeile 9 subtrahiert 2 von CL, wobei das Ergebnis wieder in CL zurück geschrieben wird.

Noch mal zur Verdeutlichung, wie ECX aufgebaut ist:

0000 1122

Alles zusammen ist ECX, 11 und 22 zusammen sind CX, 11 ist CH und 22 ist CL. Vielleicht etwas schwierig nachzuvollziehen.

Als C-Union (keine Struktur!):

union register {
struct {
uint8_t cl;
uint8_t ch;
};
uint16_t cx;
uint32_t ecx;
};

Allerdings hinkt das Beispiel, da diese Angabe einer anonymen Struktur nur neuere C-Versionen unterstützen, und die Reihenfolge der Elemente genau anders herum ist, als im echten CPU-Register.

Naja, hoffe dass ich dich nicht allzu sehr verwirrt habe. Assembler ist aber für alle am Anfang hart! Nicht aufgeben!

Viel Erfolg beim Durchhalten! :)

PS: Nochmal als ASCII-Diagramm ...

|  ECX  | <= 32 Bit (0123 4567)
0123 4567
|CX| <= 16 Bit (4567)
AH <= 8 Bit (45)
AL <= 8 Bit (67)
Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von TeeTier
13.02.2016, 20:15

PS: Ich war geistig beim Akkumulator ... in den letzten Beiden Zeilen soll natürlich nicht "AH" und "AL" stehen, sondern "CH" und "CL". Sorry, Flüchtigkeitsfehler! :)

0

Was möchtest Du wissen?