Мне нужна помощь в преобразовании встроенного asm Intel в AT & T, чтобы я мог скомпилировать его с помощью gcc - PullRequest
2 голосов
/ 19 декабря 2010

Это оригинальный код:

#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                             \
}

Благодаря Шуту, у меня теперь есть это:

#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)); \
}

Очевидно, gcc не нравится volatile с clflush. Спасибо всем.

Я пытаюсь скомпилировать Slicing-By-8 с gcc как dll, чтобы я мог использовать его в своем приложении VB6.

Ответы [ 2 ]

4 голосов
/ 19 декабря 2010

Было бы неплохо использовать правильные встроенные функции.В любом случае, вот ваша версия макроса:

#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)); \
}
3 голосов
/ 19 декабря 2010

Вместо преобразования вашего синтаксиса Intel в AT & T, почему бы вам не сказать GCC, что вы просто хотите скомпилировать синтаксис Intel?

Вы можете сделать это так:

добавить эту строку перед любыми другими сборочными линиями:

asm(".intel_syntax noprefix\n");

Затем запустите GCC следующим образом:

gcc -o my_output_file <strong><em>-masm=intel</em></strong> my_src_file.c

Благодаря stingduk при BiW Reversing .

...