Ausführung von Assembler-code in c
Möchte ich wissen, ob es eine Möglichkeit der Berufung in einem .c-Assembler-code?
Ich möchte diesen code in meine .c-Datei
Den Assembler code möchte ich ausführen .c-Datei zurückgeben, die Adresse
1. mov eax, 0x2d
2. mov ebx, 0
3. int 0x80
Ich weiß, die Antwort ist eax setzen.
Dies ist der Teil der .c-Datei:
1. void function(void)
2. {
3. void *sp;
4. sp = eax;
5. fprintf(stderr, "system break: %p\n", sp);
6. }
Wie kann ich es tun?
- Die C-compiler verwenden Sie?
- Was ist der C-code tun soll, was Wert ist in eax, was ist sp?
- Ich bin mit der gcc und der sp ist nur eine variable, und dies tun möchten,fprintf(stderr, "system zu brechen: %p\n", sp); wenn ich die sp, und die sp hat der eax-Wert, der Wert der in eax ist so etwas wie 0x99ae000
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Fähigkeit, dies zu tun ist compiler-spezifisch. Gcc erlaubt diese mit seinen
asm
- Schlüsselwort-Erweiterung, während Visual studio implementiert eine anderen Erweiterung.Beachten Sie, dass, neben dem offensichtlichen problem mit der nicht-übertragbarkeit auf andere Architekturen, einschließlich inline-Montage können die Leistung reduzieren, da der compiler nicht in der Lage ist, zu analysieren, die Montage, um festzustellen, ob es von Seite-Effekt-freie, sichere inlining, ob es greift auf die globalen Ressourcen, und so weiter.
Einige Compiler implementieren den
__asm__
oderasm
keywords als Erweiterung der C-Sprache:Den code in Klammern wird wortwörtlich kopiert werden, um die Eingabe des Assemblers. Mehr Dokumentation darüber, wie, zum Beispiel, GCC implementiert dieses feature, können gefunden werden hier.
By the way, wenn Sie möchten, ändern Sie den Wert für den stack-pointer (warum?), Sie können es in einer Zeile:
__asm("mov %%eax, 0x222" : "+r"(sp));
Andere Methode, wenn z.B. gcc verwenden, ist die erste Kompilierung einige sehr triviale Funktion ohne Optimierungen:
mit
gcc -S foo.c
und verwenden Sie die foo.s als Vorlage. Später kann man kompilieren Sie und verknüpfen Sie diese Dateien mit
gcc main.c foo.s
(und löschen Sie die foo.c-Datei umbenennen /foo.s etwas anderes)Von dieser besonderen Funktion kann man beobachten, wo der compiler legt das Ergebnis und in die Adressen oder Register der compiler legt die erste und zweite Argumente.
Er etwas schneller Ansatz zu lernen als asm-Vorlagen mit lese -, schreib -, Klamotten-Listen.
Sie wirklich brauchen, um zu "setzen" asm source in Nasm-syntax "in" deinem C-source-Programm? Fergedit. lcc vielleicht... Wenn Sie wollen, um "execute" dein asm-Programm aus Ihrem C-Programm...
montieren
nasm -f elf getbrk.asm
, setzensp=getbrk();
in Ihre C-Datei, kompilierengcc -m32 -O3 -o myprog myprog.c getbrk.o
Oder nur
sp=sbrk(0);
in Ihrem C-Programm und überspringen Sie die asm... nicht mehr tragbar als es zu tun mit int 80h. (aber was für ein Spaß wäre das?) 🙂Dies ist meine Antwort 🙂