gpt4 book ai didi

assembly - 错误: impossible register constraint in 'asm'

转载 作者:行者123 更新时间:2023-12-02 10:47:14 27 4
gpt4 key购买 nike

我在编译软件包时遇到问题,我不是
确实是一个很好的编码器,但我尝试自己修复它,但仍然无法编译。
这是原始代码。

#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上,
为了使事情保持整洁...(对不起,如果这是错误的,我以后可以更改)

这是具有导致错误的行的标题。:
http://pastebin.com/k3D4cg0d

这是它所引用的C文件。
http://pastebin.com/Ymg1X5dg

这给出了这样的错误:
/var/tmp/cc3zA0lH.s: Assembler messages: /var/tmp/cc3zA0lH.s:69: Error: bad instruction `sw $3,0(r3)',

对于其余的这些行,依此类推。

最佳答案

内联程序集有问题:

  • 它使用有效连接的多行字符串。没有\n,所有内容都显示在一行上。汇编程序是否接受用分号分隔的语句,使所有这些都有所不同……有些可能不会。
  • 它指定与输入/输出约束相同的变量,而不是通常针对这种情况使用"+r"(value)

  • 在没有看到其余代码的情况下,并不清楚为什么内联汇编语句看起来像它一样。就个人而言,我建议这样写:
    asm("ror %%cl, %0" : "+r"(value) : "c"((((uintptr_t)address) & 3) << 3)));

    因为在组装时几乎不需要自己进行计算。 uintptr_t(来自 <stdint.h>)强制转换也使该32/64位不可知。

    编辑:

    如果您希望将其用于x86/x64以外的其他CPU,则显然需要与之不同...对于ARM(不是Thumb2),它将是:
    asm("ROR %0, %0, %1" : "+r"(value) : "r"((((uintptr_t)address) & 3) << 3)));

    因为那是旋转指令的行为方式。

    编辑(添加引用):

    关于此处执行的操作, this blog post提供了一个有趣的观点-即,编译器很可能为以下内容创建相同的输出:
    (a >> shift | a << (8 * sizeof(a) - shift))

    至于x86内联
    asm("ror %%cl, %0" : "+r"(a) : "c"(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
    }

    编译/反汇编:

    $ gcc -DUSE_ASM -O8 -c tf.c; objdump -d tf.o

    tf.o:elf64-x86-64文件格式

    .text部分的反汇编:

    0000000000000000:
    0:83 e6 03和$ 0x3,%esi
    3:8d 0c f5 00 00 00 00 lea 0x0(,%rsi,8),%ecx
    一个:90点
    b:d3 cf ror%cl,%edi
    d:89 f8 mov%edi,%eax
    f:c3 retq
    $ gcc -O8 -c tf.c; objdump -d tf.o

    tf.o:elf64-x86-64文件格式

    .text部分的反汇编:

    0000000000000000:
    0:83 e6 03和$ 0x3,%esi
    3:8d 0c f5 00 00 00 00 lea 0x0(,%rsi,8),%ecx
    a:d3 cf ror%cl,%edi
    c:89 f8 mov%edi,%eax
    e:c3 retq

    如此,此内联汇编是不必要的。

    关于assembly - 错误: impossible register constraint in 'asm' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8416343/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com