GCC内联汇编错误:变量'%al'的asm-specifier与asm clobber列表冲突

时间:2011-06-02 06:22:37

标签: c++ visual-c++ gcc assembly inline-assembly

很抱歉这么多问题,但我遇到了另一个神秘的错误,试图编译以下内联汇编(使用 -fasm-blocks ),该函数在 MSVC 中有效,但显然不在海湾合作委员会,并且无法处理它:

unsigned char testData = 128;

__asm
{
    // ...
    mov al, testData
    mov ah, al // error: asm-specifier for variable '%al' conflicts with asm clobber list
    shl eax, 16
    // ...
};


这个 clobber列表是什么?它有什么问题?

我也尝试改变优化级别,但没有效果。

2 个答案:

答案 0 :(得分:0)

这里解释了clobber-list:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html,但不是在__asm语法的上下文中,我不熟悉它。我试着编译你的代码片段

jcomeau@intrepid:/tmp$ make test
cc     test.c   -o test
test.c:4: error: expected ‘(’ before ‘{’ token

答案 1 :(得分:0)

这必须是gcc中的一些错误(也许__asm块有隐含的破坏)。无论如何,有很多解决方法:

__asm
{
    // ...
    mov ah, testData
    mov al, ah
    shl eax, 16
    // ...
};

__asm
{
    // ...
    mov al, testData
    mov ah, testData
    shl eax, 16
    // ...
};

__asm
{
    // ...
    movzx eax, testData
    imul eax, 0x0101
    shl eax, 16
    // ...
};