DevC++ und Inline-Assembler
-
wie ist die funktion im assembler text deklariert? bei nasm kommst du, glaube ich, nicht drumherum, den führenden unterstrich per hand einzufügen.
-
Die ASM Datei sieht wie folgt aus:
bits 32 global _test_funktion [noch anderes Zeug] section .data align 16 [noch anderes Zeug] section .text align 16 _test_funktion: push ebp mov ebp,esp pushad mov edi,[ebp+8] ; destination mov esi,[ebp+12] ; source mov ecx,[ebp+16] ; bytes mov eax,ecx shr ecx,6 mov ebx,ecx shl ebx,6 sub eax,ebx [usw.]
Müsste eigentlich stimmen, oder?
-
Ich hab mal schnell bei mir nachgeschaut, und wenn ich das richtig sehe, dass muss man die asm-Funktionen nach aussen bekannt machen, also ungefähr so
section .text align 16 global _test_funktion _test_funktion: ; etc.pp
-
Hab ich gemacht, aber der Fehler verschwindet nicht. Außerdem glaube ich nicht, dass der Fehler im Assembler-Code steckt, sondern viel eher, dass ich die Datei falsch eingefügt habe.
Also, wie gesagt, die Prototypen sind definiert, die unkompilierte Assembler-Datei habe ich auch - nur wie geht es weiter? Wie füge ich die Assembler-Datei richtig in mein Projekt ein? Vielleicht kann mir auch jemand erklären, wie es das mit Inline-Assembler aussehen müsste.
-
Du brauchst natürlich die compilierte asm Datei, also die Objekt Datei. Diese muss in dem Format vorliegen, die dein C/C++ Compiler versteht. Bei NASM kannst du das ja mit -f beeinflussen. Für den GCC sollten das afaik coff Objektdateien sein.
-
Wie müsste der Konsolenbefehl für NASM denn aussehen?
Ich habe es immer so versucht: nasmw -o mmx.o -f win32 mmx.asm
-
Ah, ich hätte zuerst die Hilfe von NASM besser durchlessen sollen.
Also, win32 einfach durch coff ersetzt und kompiliert. Was jetzt? Wie soll ich die Objektdatei meinem Projekt hinzufügen?
-
Projekt Optionen -> Parameter und dann Bibliothek/Objekt hinzufügen
-
Habe ich so gemacht, aber es kommt wieder der selbe Linker Error. Gibt es nicht noch eine andere Möglichkeit?
-
Noch 'ne andere Idee. Hast du den Prototypen entsprechend eingebettet (afaik werden nur C Funktionen intern mit dem Unterstrich gehandelt), zB so
#ifdef __cplusplus extern "C" { #endif void __cdecl test_funktion(void *d,void *s,int bytes); // alle weiteren Funktionen hier rein #ifdef __cplusplus } #endif