关于gcc内嵌汇编

时间:2022-06-07 11:56:01
gcc内嵌汇编代码编译通不过, 请好心人帮忙看下 谢谢:)

代码:
int main()
{
    int ldt[2];
    asm("movb $1, %0\n\t"
    "movb $2, %1\n\t"
    "movb $3, %2\n\t"
    "movb $4, %3\n\t"
    "movb $5, %4\n\t"
    "movb $6, %5\n\t"
    "movb $7, %6\n\t"
    :
    :"m" (*(char *)ldt),
     "m" (*(((char *)ldt)+1)),
     "m" (*(((char *)ldt)+2)),
     "m" (*(((char *)ldt)+3)),
     "m" (*(((char *)ldt)+4)),
     "m" (*(((char *)ldt)+5)),
     "m" (*(((char *)ldt)+6))
    );
    return 0;
}
编译报错:
重新加载 'asm' 时在类 'GENERAL_REGS" 中找不到寄存器

若将上述代码, 减一条汇编语句movb $7, %6 和对应的"m" (*(((char *)ldt)+6)) 则可以通过编译, 并且查看对应的.s文件, 可以看到6条汇编语句, 将eax, ebx, ecx, edx, esi, edi寄存器全用上了; 如果再多加一条, 就会报错: 重新加载 'asm' 时在类 'GENERAL_REGS" 中找不到寄存器

这样是不是表示在内嵌汇编输入部分, 最多只能写6条用到寄存器的语句, 如果需要用到更多寄存器,该怎么做?

3 个解决方案

#1


可用的通用寄存器就6个,不够的时候不应该都往寄存器里存,存入内存就可以

#2


引用 1 楼 nevil 的回复:
可用的通用寄存器就6个,不够的时候不应该都往寄存器里存,存入内存就可以


代码应该怎么改呢?

#3


引用 2 楼 max_godlike 的回复:
Quote: 引用 1 楼 nevil 的回复:

可用的通用寄存器就6个,不够的时候不应该都往寄存器里存,存入内存就可以


代码应该怎么改呢?


可以用栈啊,传一个内存地址,类似一个数组,然后汇编中再根据地址偏移取出来。

#1


可用的通用寄存器就6个,不够的时候不应该都往寄存器里存,存入内存就可以

#2


引用 1 楼 nevil 的回复:
可用的通用寄存器就6个,不够的时候不应该都往寄存器里存,存入内存就可以


代码应该怎么改呢?

#3


引用 2 楼 max_godlike 的回复:
Quote: 引用 1 楼 nevil 的回复:

可用的通用寄存器就6个,不够的时候不应该都往寄存器里存,存入内存就可以


代码应该怎么改呢?


可以用栈啊,传一个内存地址,类似一个数组,然后汇编中再根据地址偏移取出来。