Hallo LowLevel-Community,
gleich vorweg: Ich bin ziemlich neu in Assembler!
Meine Frage: (Wie) ist es möglich aus (N)ASM eine Funktion aufzurufen, die ich in C (Compiler: GCC 4.6.2) geschrieben habe?
Bzw: Wie man eine Funktion aufruft weiss ich bereits, aber wie kann ich ihr Parameter übergeben?
Testweise habe ich mir ein kleines C-Programm geschrieben, welches eine eigene Funktion (fn) aufruft, die einfach die beiden integer-Parameter addiert und zurückgibt.
Dieses dann mit
gcc -c source.c kompiliert und mit
objdump -d -M intel source.o dann die Ausgabe des GCC-Compilers in einer Datei gespeichert.
Danach habe ich im C-Source den Funktionsaufruf auskommentiert und die beiden letzten Schritte wiederholt (Ausgabe dieses mal in einer anderen Datei gespeichert).
Wenn ich diese beiden Ausgabe-Dateien jetzt vergleiche, versteh ich nur Bahnhhof:
00000000 <_fn>:
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 8b 45 0c mov eax,DWORD PTR [ebp+0xc]
6: 8b 55 08 mov edx,DWORD PTR [ebp+0x8]
9: 01 d0 add eax,edx
b: 5d pop ebp
c: c3 ret
0000000d <_main>:
d: 55 push ebp
e: 89 e5 mov ebp,esp
10: 83 e4 f0 and esp,0xfffffff0
+ 13: 83 ec 10 sub esp,0x10
! 16: e8 00 00 00 00 call 1b <_main+0xe>
+ 1b: c7 44 24 04 05 00 00 mov DWORD PTR [esp+0x4],0x5
+ 22: 00
+ 23: c7 04 24 03 00 00 00 mov DWORD PTR [esp],0x3
+ 2a: e8 d1 ff ff ff call 0 <_fn>
2f: b8 00 00 00 00 mov eax,0x0
34: c9 leave
35: c3 ret
36: 90 nop
+ 37: 90 nop
(Zeilen mit einem + am Anfang sind neu; Zeile mit ! wurde verändert)
Die veränderte Zeile war vorher
18: e8 00 00 00 00 call 18 <_main+0xb>Speziell bei diesem Beispiel wären meine Fragen jetzt:
- Was macht das and esp, 0xfffffff0?
- Warum sub esp, 0x10?
- Was bringen die 2 Parameter bei den calls? Kenne das nur mit einem Label/Funktion (z.B. call print_string)
Ich vermute mal 1b und 23 verschieben meine Parameter (3 und 5) auf den Stack, aber warum jetzt an
esp+4 und einmal an
esp? (Frage geht einerher mit meiner 2. Frage)
Ich weiss, das sind eine Menge fragen und ich verlange gar nicht, dass die alle beantwortet werden! Es würde mir schon wahnsinnig helfen mir passende Links zu geben (das was ich bei Google gefunden habe, war das, was ich bereits gemacht und oben beschrieben habe) oder mir zumindest einen Schubs in die richtige Richtung zu geben!
Grüße
Meuchelfix77