2010-12-19 6 views
2

Dies ist der ursprüngliche Code:Ich brauche Hilfe Intel Inline-asm zu AT & T so Konvertieren ich es mit gcc kompilieren

#define CPU_PREFETCH(cache_line)   \ 
{ int* address = (int*) (cache_line);  \ 
    _asm mov edx, address     \ 
    _asm prefetcht0[edx]     \ 
} 

#define CPU_GET_CYCLES(low)     \ 
{           \ 
    _asm rdtsc       \ 
    _asm mov dword ptr [low], eax  \ 
} 

#define CPU_SYNC       \ 
{           \ 
    _asm mov eax, 0      \ 
    _asm cpuid       \ 
} 

#define CPU_CACHE_FLUSH(cache_line)   \ 
{ int* address = (int*) (cache_line);  \ 
    _asm mov edx, address     \ 
    _asm clflush[edx]      \ 
    _asm mfence        \ 
} 

Dank Hofnarr, ich das jetzt haben:

#define CPU_PREFETCH(cache_line) \ 
{ \ 
    __asm__ __volatile__ ("prefetcht0 %0" : : "m" (*(int*)cache_line)); \ 
} 

#define CPU_GET_CYCLES(low) \ 
{ \ 
    __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "%edx"); \ 
} 

#define CPU_SYNC \ 
{ \ 
    __asm__ __volatile__ ("cpuid" : : : "%eax", "%ebx", "%ecx", "%edx"); \ 
} 

#define CPU_CACHE_FLUSH(cache_line) \ 
{ \ 
    __asm__ ("clflush %0; mfence" : : "m" (*(int*)cache_line)); \ 
} 

Offensichtlich gcc mag nicht flüchtige mit Clflush. Danke an alle.

Ich versuche Slicing-By-8 mit gcc als DLL kompilieren, damit ich es in meiner VB6-App verwenden kann.

Antwort

4

Wäre nett, richtige Inline-Funktionen zu verwenden. Wie auch immer, hier ist Ihre Makro-Version:

#define CPU_PREFETCH(cache_line) \ 
{ \ 
    __asm__ __volatile__ ("prefetcht0 %0" : : "m" (*(int*)cache_line)); \ 
} 

#define CPU_GET_CYCLES(low) \ 
{ \ 
    __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "%edx"); \ 
} 

#define CPU_SYNC \ 
{ \ 
    __asm__ __volatile__ ("cpuid" : : : "%eax", "%ebx", "%ecx", "%edx"); \ 
} 

#define CPU_CACHE_FLUSH(cache_line) \ 
{ \ 
    __asm__ __volatile__ ("clflush %0; mfence" : : "m" (*(int*)cache_line)); \ 
} 
+0

Mann, das sieht gut aus und sieht aus, als wüsstest du genau, was du machst :) Wie auch immer, bekomme ich diesen Fehler jetzt: Fehler: Operandengröße stimmt nicht überein für 'clflush ' – selyb

+0

Ich versuchte zu klicken, dass dieser Beitrag nützlich war aber ich nicht Ich habe keinen guten Ruf – selyb

3

Anstatt Ihre Intel-Syntax in AT & T zu konvertieren, warum erzählen Sie GCC nicht, dass Sie nur die Intel-Syntax kompilieren möchten?

Sie können es wie folgt tun:

diese Zeile vor allen anderen Montagelinien hinzufügen:

asm(".intel_syntax noprefix\n"); 

Dann GCC wie folgt ausführen:

gcc -o my_output_file -masm=intel my_src_file.c

Dank stingduk bei BiW Reversing.

+0

Dies gibt mir einen anderen Fehler, wie im ersten Beitrag gezeigt. – selyb

+0

Er vergaß den Backslash hinzuzufügen. –

+0

Aktualisiert ersten Beitrag wieder – selyb