Frage zu Assembler Ausschnitt!
-
Hallo,
ich bräuchte mal eine kurze Erklärung zu folgenden Code Ausschnitt:
1: movl 8(%ebp),%eax 2: movl (%eax), edx 3: movl -60(%edp),%eax 4: leal (%edx,%eax),%eax
Also was ich bereits weiß bzw. hoffe ich das ich das richtig verstanden hab:
Zeile 1: Plaziert die Adresse des 1 Parameter(globale variable) in das eax register.
Zeile 2: Plaziert diese Adresse in das edx Register
Zeile 3: Plaziert die Adresse einer lokalen Variable in dea eax Register
Zeile 4: Ist mir nicht ganz klar was hier gemacht wird hoffe es kann mir jemand erklären.mfg hugo
-
hugo_ schrieb:
3: movl -60(%edp),%eax
Hast du dich vertippt? edp soll ebp sein?
Wie dem auch sei, mein Versuch, das Ganze anhand des C-Codes zu "entschlüsseln":long eax; long* p_eax; long* ebp; long* p_tmp; long edx; eax = ebp[2]; /* 1: movl 8(%ebp),%eax */ p_eax = (long*)eax; edx = p_eax[0]; /* 2: movl (%eax), edx */ p_tmp = ebp - 15; /* ebp - 60 */ eax = p_tmp[0]; /* 3: movl -60(%ebp),%eax */ eax = edx + eax; /* 4: leal (%edx,%eax),%eax */
Wie man sieht, ergibt das ganze wenig Sinn...
-
hugo_ schrieb:
Hallo,
ich bräuchte mal eine kurze Erklärung zu folgenden Code Ausschnitt:
1: movl 8(%ebp),%eax 2: movl (%eax), edx 3: movl -60(%edp),%eax 4: leal (%edx,%eax),%eax
kanns auch nur versuchen:
Zeile 1: Nicht die Adresse, sondern ein übergebener Parameter (ein Zeiger? ein Schrittweite?) geht nach eax.
Zeile 2: Plaziert Zeigerziel/Vektor[i]/Schrittweite in das edx Register.
Zeile 3: edp? gibt es beim Pentium nicht. ein 4byte breiter Ausgangswert (für die Rückkehr?(sonst -64)(oder egal)) geht nach eax.
Zeile 4: Eax zeigt jetzt auf eine bestimmte (alte oder verschobene?)Position. Zeiger wandert um edx stellen weiter.Also für mich macht das schon Sinn, aber ohne Zusammenhang gefragt und ohne Zusammenhang gesehen, sollte man eigentlich auch nichts weiteres Zusammenhängendes darauf herumspekulieren
-
hugo_ schrieb:
ich bräuchte mal eine kurze Erklärung zu folgenden Code Ausschnitt:
1: movl 8(%ebp),%eax 2: movl (%eax), edx 3: movl -60(%edp),%eax 4: leal (%edx,%eax),%eax
Also, auch wenn ich die AT&T-Syntax nicht besonders schätze, kann ich meinen Vorredner in der Deutung ungefähr recht geben.
Viel wichtiger ist aber für mich die Frage, woher der Code-Ausschnitt kommt. Sieht halt aus wie Teil einer (vermutlich) C-Funktion. Aber sieht-aus-wie ist die Schwester von könnte-sein-das.
-
und woran erkennt man jetzt dass es vermutlich eine C Funktion ist?
-
stdcall schrieb:
und woran erkennt man jetzt dass es vermutlich eine C Funktion ist?
Erkennen - gar nicht.
Vermuten würde ich z.B. so, falls es wirklich eine Funktion ist:1: movl 8(%ebp),%eax 2: movl (%eax), edx
dann hat sie vermutlich mindestens einen Parameter und ein Parameter muss ein Zeiger sein.
3: movl -60(%ebp),%eax
und sie hat mindestens eine lokale Variable
In C würde die Funktion ungefähr so aussehen:
void func(void* p_data, ...) { ...; long tmp;