我需要帮助将Intel inline asm转换为AT& T所以我可以用gcc编译它

时间:2010-12-19 08:27:55

标签: c gcc assembly inline-assembly gas

这是原始代码:

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

感谢Jester,我现在有了这个:

#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不喜欢clflush的 volatile 。 感谢大家。

我正在尝试使用gcc编译Slicing-By-8作为dll,以便我可以在我的VB6应用程序中使用它。

2 个答案:

答案 0 :(得分:4)

使用正确的内联函数会很好。无论如何,这是你的宏版本:

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

答案 1 :(得分:3)

为什么不告诉GCC你只想编译英特尔语法,而不是将英特尔语法转换为AT& T?

你可以这样做:

在任何其他装配线之前添加此行:

asm(".intel_syntax noprefix\n");

然后像这样运行GCC:

gcc -o my_output_file -masm=intel my_src_file.c

感谢stingdukBiW Reversing