Ein einfaches Beispiel
-
void Funktion(int* n) { int i; n=n*i; }
Wie würde der obige Code in Assembler aussehen? Ich brauche das um einen Einstieg zu finden. Danke
-
a) meinst du nicht eher *n = *n * i? Ich übersetze es mal so, sonst wird das ganze nämlich ziemlich unsinnvoll, den Pointer zu muliplizieren (genauer: garnicht kompilierbar).
b) Meine Interpretation:
_Funktion: ; prolog push ebp mov ebp, esp ; platz aufm Stack für lokale Variable i sub esp, 4 ; Parameter holen mov esi, [ebp+8] ; pointer auflösen mov eax, [esi] ; multiplizieren imul eax, [ebp-4] ; ergebnis speichern mov [esi], eax ; epilog leave ret
c) Interpretation des gcc (man muss ja Varianten haben ;))
_Funktion: push ebp mov ebp, esp sub esp, 4 mov edx, DWORD PTR [ebp+8] mov eax, DWORD PTR [ebp+8] mov eax, DWORD PTR [eax] imul eax, DWORD PTR [ebp-4] mov DWORD PTR [edx], eax leave ret
-
@TriPhoenix: Ich hätte da mal ne Frage zur LEAVE Instruktion. Ich dachte die benutzt man nur in Kombination mit ENTER. Woher weiß die Instruktion wie sie den Stack wieder aufzuräumen hat?
-
Original erstellt von malfunction:
@TriPhoenix: Ich hätte da mal ne Frage zur LEAVE Instruktion. Ich dachte die benutzt man nur in Kombination mit ENTER. Woher weiß die Instruktion wie sie den Stack wieder aufzuräumen hat?LEAVE ist das Äquivalent zu
mov esp, ebp
pop ebpegal, was enter da anstellt ist das immer die richtieg Methode, da zwischendurch belegter Speicher aufm Stack einfach über mov esp, ebp wieder aufgeräumt wird. Außerdem ist LEAVE schneller als die zweier-Kombi und kürzer zu schrieben. Deswegen, warum nicht
-
Vielen Dank. Dann werde ich das wahrscheinlich auch in Zukunft benutzen.
-
Außerdem ist LEAVE schneller als die zweier-Kombi und kürzer zu schrieben.
schneller in der Ausführung oder schneller zu schreiben? oder beides?
-
Original erstellt von <furz>:
schneller in der Ausführung oder schneller zu schreiben? oder beides?Beides. Der Prozessor spart sich ein Instruction Fetch und außerdem eine Dekodierung. Das demonstriert sich ganz shcön indem man betrachtet wie beides Kodiert wird:
LEAVE: C9
2er-Kombi: 89 EC 5D