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

Posted

技术标签:

【中文标题】GCC 内联汇编错误:变量 \'%al\' 的 asm 说明符与 asm clobber 列表冲突【英文标题】:GCC inline assembly error: asm-specifier for variable '%al' conflicts with asm clobber listGCC 内联汇编错误:变量 '%al' 的 asm 说明符与 asm clobber 列表冲突 【发布时间】:2011-06-02 06:22:37 【问题描述】:

很抱歉有这么多问题,但我在尝试编译以下在 MSVC 中工作的内联程序集(使用 -fasm-blocks)时遇到了另一个神秘错误,但显然不在 GCC 中并且无法处理:

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 列表 是什么?它有什么问题?

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

【问题讨论】:

【参考方案1】:

这一定是 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
    // ...
;

【讨论】:

【参考方案2】:

clobber-list 在这里解释:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html,但不是在你的 __asm 语法的上下文中,我不熟悉。试图编译你的 sn-p 我得到了

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

【讨论】:

这是 Apple 独有的选项吗? Linux 上的 gcc 无法识别它 是的,它是苹果独有的,而且有些漏洞。此外,它会为隐式破坏寄存器保存带来严重的性能损失。

以上是关于GCC 内联汇编错误:变量 '%al' 的 asm 说明符与 asm clobber 列表冲突的主要内容,如果未能解决你的问题,请参考以下文章

GCC 扩展内联汇编简介

GCC内联汇编常见陷阱

ARM嵌入式开发中的GCC内联汇编__asm__

扩展内联汇编 gcc - 计算二次公式根

VC内联汇编和GCC内联汇编的语法区别

GCC 内联汇编中的标签