Assemblercode in C++ Datei einbinden
-
Ich würde gerne in einer *.c (nicht in *.h) Datei Assembler Code einbinden.
Bei TurboPascal musste ich nur folgendes schreiben:asm
.
.
.Hier möchte ich den Code einbinden:
void CgaScreen::clear () { }
und damit gings. Hab keine Ahnung, ob es hier ebenso einfach ist.
Gibts da ein Tip für mich ?
Besten Dank im Voraus.msgbeep
-
_asm{ //... }
-
Ist es egal, ob ich unter Windows oder Linux/Unix nach der Methode etwas einbinde oder nicht ?
Weil C++ sollte ja allgemeingültig sein.msgbeep
-
solang du nichts betriebssystem spezifisches nimmst, gibt es keine probleme.
-
Inline-Assembler ist leider nicht im ISO-Standard-C++ enthalten. Daher schwankt die Implementierung von Compiler zu Compiler mitunter sehr stark.
Hier ein paar Beispiele:
GCC/MinGW/DJGPP:
asm volatile("push %%ebx ; cpuid ; mov %%ebx, %%esi ; pop %%ebx" : "=a"(p1), "=S"(p2), "=c"(p3), "=d"(p4) : "a"(p5));
Borland/Digital Mars:
asm { mov eax, p5 ; cpuid ; mov p1, eax ; mov p2, ebx ; mov p3, ecx ; mov p4, edx }
(Open)Watcom:
void CPUID (int &eax, int &ebx, int &ecx, int &edx, int val); #pragma aux CPUID = \ ".586" \ "push eax" \ "push ebx" \ "push ecx" \ "push edx" \ "mov eax, esi" \ "cpuid" \ "mov esi, [esp]" \ "mov [esi], edx" \ "mov esi, [esp+4]" \ "mov [esi], ecx" \ "mov esi, [esp+8]" \ "mov [esi], ebx" \ "mov esi, [esp+12]" \ "mov [esi], eax" \ "add esp, 16" \ parm [eax] [ebx] [ecx] [edx] [esi] \ modify [esi eax ebx ecx edx];
Welchen Compiler verwendest du?
-
otze schrieb:
_asm{ //... }
Der Standard schreibt vor, dass Assembler-Code mit asm eingeleitet wird, nicht mit _asm, __asm oder ähnliches. Wenn ein Compiler damit nicht klar kommt, kann man sich das mit einem #define meistens zurechtbiegen.
zB für den MSC:#ifdef _MSC_VER #define asm __asm #endif
@msgbeep
Über die Implementierung des Assembler-Codes selbst steht im Standard nix. Generell gibt es zwei Arten von Code, die Intel und die AT&T Syntax. Die Intel Syntax finde ich irgendwie sauberer, die AT&T ist wohl komplexer (obwohl ich mich damit noch nicht wirklich beschäftigt habe). Welche du nimmst, hängt davon ab, was dein Compiler unterstützt.
-
einmal ist der nasm als object file creator im einsatz und der djgpp solls dann mit c++ code object fiels linken.
Wenn ich das so richtig verstanden hab.Ich progge nicht mittels borland sondern mittels nasm.
Keine Ahnung ob es da Standards gibt, nach denen ich mich da richten muss.
Hab leider nicht die HOWTO oder RTFM, oder was es da gibt, gelesen.msgbeep
Hoffe es gibt zu nasm und den andern keinen grossen unterschied...