Assembler mit C++

Schnelle objektorientierte, kompilierende Programmiersprache.
Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Assembler mit C++

Beitrag von Kmitska » Do Jun 07, 2012 10:15 pm

Hallo Leute,

ich würde gerne mit Assembler zusammen arbeiten bzw. ein bisschen Assembler lernen.
Weiß aber nicht, wie Assembler mit C++ zusammen arbeitet...

Habe im Internet mal bisschen gesucht kam auf solche Sachen, die man in C++-Code schreiben kann:

Code: Alles auswählen

asm("code");
asm { }
Doch keines davon funktioniert für mich.
Gibt es da auch einen "Compiler" für Assembler? Das es ein Compiler ist glaube ich kaum :D aber wo schreibt man das dann?

Informationen über mein IDE:
OS: MS Windows 7
IDE: Code::Blocks
Compiler: mingw (g++)
Sprache: C++

Danke im Voraus und über allgemeine Informationen würde ich mich auch freuen. :)

Grüße,
Kmitska

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Assembler mit C++

Beitrag von Xin » Do Jun 07, 2012 11:08 pm

Kmitska hat geschrieben:Weiß aber nicht, wie Assembler mit C++ zusammen arbeitet...
Man kompiliert einen C/C++-Quelltext mit dem Compiler und erhält ein Object-File.
Man assembliert einen Assembler Quelltext mit einem Assembler (z.B. NASM) und erhält ebenfalls ein Object-File.

Möchte man eine Funktion aus einem anderen Object-File rufen, muss man dies "exportieren". Dafür benutzt man in C/C++ den Befehl Export.
In NASM setzt man eine Sprungmarke "global". Mit der Behauptung in C, dass diese Sprungmarke eine Funktion ist, kann man dorthin springen und landet dann in der Assemblerfunktion.

Um die beiden Objektfiles zusammen zu führen, benutzt man den Linker (oder ruft diesen mit dem gcc-Komando).

Kannst Du mehrere Objectfiles, aus C zusammenführen?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Assembler mit C++

Beitrag von canlot » Fr Jun 08, 2012 3:45 pm

Du kannst aber auch inline assembling benutzen gcc unterstützt das.
Du musst nur aufpassen das du die AMD Syntax nimmst da Intel von gcc nicht unterstützt wird.
Unwissenheit ist ein Segen

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Assembler mit C++

Beitrag von Kmitska » Sa Jun 09, 2012 1:12 pm

Kannst Du mehrere Objectfiles, aus C zusammenführen?
Kenne mich mit somit nicht wirklich aus, deswegen verstehe ich glaube ich auch das Linken nicht...
Du kannst aber auch inline assembling benutzen gcc unterstützt das.
Du musst nur aufpassen das du die AMD Syntax nimmst da Intel von gcc nicht unterstützt wird.
Das habe ich bereits erwähnt, bekomme leider nur Fehler.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Assembler mit C++

Beitrag von fat-lobyte » Sa Jun 09, 2012 1:48 pm

Kmitska hat geschrieben:Kenne mich mit somit nicht wirklich aus, deswegen verstehe ich glaube ich auch das Linken nicht...
Dann solltest du dich mal damit auseinadersetzen. Auf den Compiler und deine Build-Tools vertrauen kannst du nur ganz am Anfang, bei größeren Projekten solltest du wissen was passiert.
kmitska hat geschrieben:Das habe ich bereits erwähnt, bekomme leider nur Fehler.
Du nervst langsam echt. Keine Infos, keine Hilfe. Wie willst du intelligente Antworten kriegen wenn du weder den Code zeigst der die Fehler verursacht, noch die Fehlermeldungen selbst?
Xin hat geschrieben:Kannst Du mehrere Objectfiles, aus C zusammenführen?
Das ist nur eine Möglichkeit, normalerweise sollte inline-Assembler vom Compiler auch unterstützt werden.
canlot hat geschrieben:Du kannst aber auch inline assembling benutzen gcc unterstützt das.
Du musst nur aufpassen das du die AMD Syntax nimmst da Intel von gcc nicht unterstützt wird.
Was zum Teufel ist denn "AMD"-Syntax?? Ich kenn nur AT&T-Syntax, und ich denke das ist auch diejenige, die von GCC unterstützt wird.
Haters gonna hate, potatoes gonna potate.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Assembler mit C++

Beitrag von canlot » Sa Jun 09, 2012 2:43 pm

fat-lobyte hat geschrieben:
canlot hat geschrieben:Du kannst aber auch inline assembling benutzen gcc unterstützt das.
Du musst nur aufpassen das du die AMD Syntax nimmst da Intel von gcc nicht unterstützt wird.
Was zum Teufel ist denn "AMD"-Syntax?? Ich kenn nur AT&T-Syntax, und ich denke das ist auch diejenige, die von GCC unterstützt wird.
Haha das meinte ich auch :P kein Grund sich so aufzuregen :D
Unwissenheit ist ein Segen

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Assembler mit C++

Beitrag von Xin » Sa Jun 09, 2012 8:33 pm

Kmitska hat geschrieben:
Kannst Du mehrere Objectfiles, aus C zusammenführen?
Kenne mich mit somit nicht wirklich aus, deswegen verstehe ich glaube ich auch das Linken nicht...
Dann sollten wir daran zuerst arbeiten.
fat-lobyte hat geschrieben:
Xin hat geschrieben:Kannst Du mehrere Objectfiles, aus C zusammenführen?
Das ist nur eine Möglichkeit, normalerweise sollte inline-Assembler vom Compiler auch unterstützt werden.
Wer Assembler programmieren will, sollte - imho - halbwegs verstehen, wie ein Programm funktioniert.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Assembler mit C++

Beitrag von fat-lobyte » So Jun 10, 2012 9:38 am

canlot hat geschrieben:Haha das meinte ich auch :P kein Grund sich so aufzuregen :D
Sorry, war nur verwirrt :-)
Haters gonna hate, potatoes gonna potate.

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Assembler mit C++

Beitrag von Kmitska » So Jun 10, 2012 11:26 am

Das habe ich bereits erwähnt, bekomme leider nur Fehler.
Du nervst langsam echt. Keine Infos, keine Hilfe. Wie willst du intelligente Antworten kriegen wenn du weder den Code zeigst der die Fehler verursacht, noch die Fehlermeldungen selbst?
Irgendwann werde ich es auch lernen. :)

Also zurück zum Inline-Assembler, habe dies hier getippt:

Code: Alles auswählen

#include <iostream>

int main()
{
    asm(
        printf("hello");
        )
}
Fehlermeldung (ganz Vorbildlich oder? :) )
||=== Assembler, Release ===|
D:\C++\C++ Projekte\Assembler\main.cpp||In function 'int main()':|
D:\C++\C++ Projekte\Assembler\main.cpp|6|error: expected string-literal before 'printf'|
D:\C++\C++ Projekte\Assembler\main.cpp|7|error: expected primary-expression before ')' token|
D:\C++\C++ Projekte\Assembler\main.cpp|7|error: expected ';' before ')' token|
||=== Build finished: 3 errors, 0 warnings ===|
Kannst Du mehrere Objectfiles, aus C zusammenführen?
Kenne mich mit somit nicht wirklich aus, deswegen verstehe ich glaube ich auch das Linken nicht...
Dann sollten wir daran zuerst arbeiten.
Also ich weiß nur, wo diese *.o Dateien sich befinden, doch weiß nicht wie man sie verwendet.
Vielleicht verstehe ich ja danach auch das Linken von Bibliotheken etc. :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Assembler mit C++

Beitrag von Xin » So Jun 10, 2012 11:47 am

Kmitska hat geschrieben:
Das habe ich bereits erwähnt, bekomme leider nur Fehler.
Du nervst langsam echt. Keine Infos, keine Hilfe. Wie willst du intelligente Antworten kriegen wenn du weder den Code zeigst der die Fehler verursacht, noch die Fehlermeldungen selbst?
Irgendwann werde ich es auch lernen. :)

Also zurück zum Inline-Assembler, habe dies hier getippt:

Code: Alles auswählen

#include <iostream>

int main()
{
    asm(
        printf("hello");
        )
}
Fehlermeldung (ganz Vorbildlich oder? :) )
Ja... Daumen hoch... in dem Fall spielen die aber auch keine Rolle.

Irgendwann wird dieser Thread in Deine proggen.org-Geschichte eingehen, aber mach Dir nichts draus, das haben wir alle hinter uns... nur ich nicht... (ich bin zu alt, damals gab's noch keine Threads) ;-)

Wenn Du Assembler lernen möchtest, rate ich dazu, Assembler zu lernen und nicht C. :->

Ich habe da mal was gegooglelt und geklaut (und nicht nachgeprüft).

Assembler sieht etwa so aus:

Code: Alles auswählen

int main(int argc, char* argv[]) 
 { 
     char test[] = "hello world\n"; 

     argc = argc; 
     argv = argv; 

     __asm__ ( 
             "movl $4, %%eax\n\t" 
             "movl $1, %%ebx\n\t" 
             "leal %0, %%ecx\n\t" 
             "movl $12, %%edx\n\t" 
             "int $0x80" 
             :: "m"(*test)); 

     return 0; 
 }	

Kompiliern:

Code: Alles auswählen

gcc tmp.c -o tmp
Tipp: Schau dir die Assembler-Ausgabe des Compilers an! (Xin: halte ich auch nicht für verkehrt...)

Aus C Assembler-Code erzeugen:

Code: Alles auswählen

gcc -S tmp.c	
Kmitska hat geschrieben:Also ich weiß nur, wo diese *.o Dateien sich befinden, doch weiß nicht wie man sie verwendet.
Vielleicht verstehe ich ja danach auch das Linken von Bibliotheken etc. :)
Das hängt sehr eng zusammen. Kümmere Dich bitte erst darum zu verstehen, wie ein Programm entsteht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten