Frage von Tami1806, 25

Assembler-Code nachvollziehen?

Hallo zusammen, ich habe ein Verständnisproblem mit folgendem Assembler-Code, kann mir bitte jemand den Code erklären?

  1. MOV EAX, 4
  2. MOV EDX, -1
  3. PUSH EDX
  4. POP EBX
  5. AND EAX, EBX
  6. ADD EBX, 0x11
  7. XOR ECX, ECX
  8. MOV CL, AL
  9. SUB CL, 2
  10. SHL EAX, CL
  11. LEA EDI, [ECX+ECX*4+6]

Am Ende müssten die Register folgende Werte haben: EAX=16 EBX=16 ECX=2 EDX=-1 EDI=16

Ich verstehe nicht, warum am Ende ECX den Wert 2 hat. Auch was in den Zeilen 8 und 9 passiert, kann ich nicht nachvollziehen, hat jemand eine Idee?

Vielen lieben Dank :) Tami

Antwort
von TeeTier, 10

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)
Kommentar von TeeTier ,

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! :)

Keine passende Antwort gefunden?

Fragen Sie die Community