Assembly 错误:在';asm&x27;

Assembly 错误:在';asm&x27;,assembly,compiler-errors,Assembly,Compiler Errors,我在编译一个包时遇到了一个问题,我不是 真的是一个很好的程序员,但我试着自己修复它,但它仍然无法编译。 这是原始代码位: #ifdef __GNUC__ asm("and $3, %%ecx;" "shl $3 ,%%ecx;" "ror %%cl, %0" : "=r" (value) : "r" (value), "c" (address)); #else 错误是: GBAinline.h:139:错误:“asm”中不可能存在寄存器约束 (ifdef管路为138) 这就是我试图让它看起来的

我在编译一个包时遇到了一个问题,我不是 真的是一个很好的程序员,但我试着自己修复它,但它仍然无法编译。 这是原始代码位:

#ifdef __GNUC__
asm("and $3, %%ecx;"
"shl $3 ,%%ecx;"
"ror %%cl, %0"
: "=r" (value)
: "r" (value), "c" (address));
#else
错误是:

GBAinline.h:139:错误:“asm”中不可能存在寄存器约束 (ifdef管路为138)

这就是我试图让它看起来的样子

#ifdef __GNUC__
asm ("and $3 %%ecx,shl $3 %%ecx,ror %%cl, %0" : "=r" (value): "r" (value), "c" (address));

#else
不过,这是行不通的。这是一个gba模拟器,在有人问之前,VBA,这是 GBAinline.h的一部分。这个汇编程序已经让我发疯了

编辑:上面的问题处理得很好,我只是没有注意到哪个 我正在使用的编译器。 但是现在我从一个头文件中得到了这段代码的错误,我把它放在了pastebin上, 让这里的东西更整洁一点。。。(对不起,如果这是错误的,我可以稍后更改)

这是包含导致错误的行的标题:

这是它所指的C文件:

这是一个类似这样的错误:

/var/tmp/cc3zA0lH.s: Assembler messages: /var/tmp/cc3zA0lH.s:69: Error: bad instruction `sw $3,0(r3)',

对于这些产品线的其余部分,依此类推。

内联装配是有缺陷的:

  • 它使用多行字符串有效地连接。不带
    \n
    时,所有显示在一行上。汇编程序是否接受以分号分隔的语句,这将产生很大的不同。。。有些可能不会
  • 它将同一变量指定为输入/输出约束,而不是像通常建议的那样使用
    “+r”(值)
  • 在看不到其余代码的情况下,不太清楚内联汇编语句为何看起来如此;就我个人而言,我建议这样写:

    asm("ror %%cl, %0" : "+r"(value) : "c"((((uintptr_t)address) & 3) << 3)));
    
    因为旋转指令就是这样运行的

    编辑(添加引用):

    关于此处执行的操作,给出了一个有趣的观点,即编译器很可能为以下对象创建相同的输出:

    (a >> shift | a << (8 * sizeof(a) - shift))
    
    对此进行测试:

    #include <stdint.h>
    
    int main(int argc, char **argv)
    {
        unsigned int shift = (int)((((uintptr_t)argv) & 3) << 3);
        unsigned int a = argc;
    #ifdef USE_ASM
        /*
         * Mark the assembly version with a "nop" instruction in output
         */
        asm("nop\n\t"
            "ror        %%cl, %0" : "+r"(a) : "c"(shift));
        return a;
    #else
        return (a >> shift | a << (8 * sizeof(a) - shift));
    #endif
    }
    
    #包括
    int main(int argc,字符**argv)
    {
    
    无符号int-shift=(int)((uintpttr_t)argv)和3)>shift | a内联程序集有缺陷:

  • 它使用多行字符串,可以有效地连接。如果没有
    \n
    ,所有字符串都显示在一行上。汇编程序是否接受以分号分隔的语句会产生很大的差异…有些可能不会
  • 它将同一变量指定为输入/输出约束,而不是像通常建议的那样使用
    “+r”(值)
  • 在没有看到其余代码的情况下,我们不太清楚内联汇编语句的外观为何如此;就我个人而言,我建议这样编写:

    asm("ror %%cl, %0" : "+r"(value) : "c"((((uintptr_t)address) & 3) << 3)));
    
    因为旋转指令就是这样运行的

    编辑(添加引用):

    关于此处执行的操作,给出了一个有趣的观点,即编译器很可能为以下对象创建相同的输出:

    (a >> shift | a << (8 * sizeof(a) - shift))
    
    对此进行测试:

    #include <stdint.h>
    
    int main(int argc, char **argv)
    {
        unsigned int shift = (int)((((uintptr_t)argv) & 3) << 3);
        unsigned int a = argc;
    #ifdef USE_ASM
        /*
         * Mark the assembly version with a "nop" instruction in output
         */
        asm("nop\n\t"
            "ror        %%cl, %0" : "+r"(a) : "c"(shift));
        return a;
    #else
        return (a >> shift | a << (8 * sizeof(a) - shift));
    #endif
    }
    
    #包括
    int main(int argc,字符**argv)
    {
    
    无符号整数移位=(int)((uintpttr_t)argv)和3)>shift | a原始代码在我看来还行。您使用的是什么复印机和平台,例如,
    gcc-v
    output是什么?您需要处理x86汇编并完全理解此代码。谢谢您的回答Mackie,我的gcc是arm linux,可能这就是问题所在,此代码是为x86设计的,我没有注意到。另外,谢谢您的帮助他链接,我会好好看一看。所以,我使用了x86编译器,它很有魅力!谢谢Mackie,我没有注意到这一点。不客气。如果你真的想深入研究gcc的内联汇编,x86是一个更温和的介绍。原始代码在我看来还不错。你使用的是什么复制器和平台,例如,
    gcc-v是什么输出?你需要处理x86程序集并完全理解这段代码。谢谢你的回答Mackie,我的gcc是arm linux,也许这就是问题所在,这段代码是为x86设计的,我没有注意到。另外,谢谢你的链接,我会好好看看。所以,我使用了x86编译器,它很有魅力!谢谢Mackie,我没有注意了。不客气。如果你真的想深入研究gcc和x86的内联汇编,这是一个更温和的介绍。谢谢Frank,但我有其他应该在arm下工作的文件。尽管如此,这些错误还是给我带来了麻烦/var/tmp/cc3zA0lH.s:Assembler消息:/var/tmp/cc3zA0lH.s:69:Error:bad inst解释“sw$3,0(r3)”,我仍然认为这是一个gcc问题,而不是文件的问题,大约有25行错误,我想发布这些错误是没有用的,因为它们都是相似的。很抱歉我在这里搞得一团糟,我仍然试图理解如何发布评论,但我正在尝试。再次感谢您的帮助answers@Luis:
    sw$3,0(r3)
    看起来像MIPS指令,而不是x86或ARM。您需要正确配置您的环境…@Mackie:ack,看起来像是交叉编译设置问题;Luis,您是如何设置跨环境的?@Frank,您的意思是,在makefile上?它是CC=$(交叉编译)gcc(当然有适当的空格)很抱歉延迟回答。@Mackie,我仍然需要配置环境?谢谢你们,我在我的OP上添加了更多信息。谢谢Frank,但我得到了其他本应在arm下工作的文件。但这些错误仍然给我带来了麻烦/var/tmp/cc3zA0lH.s:Assembler messages:/var/tmp/cc3zA0lH.s:69:Error:bad说明“sw$3,0(r3)”,我仍然认为这是一个gcc问题,而不是文件的问题,大约有25行错误,我想发布这些错误是没有用的,因为它们都是相似的。很抱歉我这里搞得一团糟,我仍然试图理解发布评论是如何工作的,但我正在尝试。再次感谢您的帮助answers@Luis:
    sw$3,0(r3)
    看起来像MIPS指令,而不是x86或ARM。您需要正确配置您的环境…@Mackie:ack,看起来像交叉编译设置问题;Luis,您是如何设置交叉环境的?@Frank,y