代码:
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
代码应该怎么改呢?
#3
可以用栈啊,传一个内存地址,类似一个数组,然后汇编中再根据地址偏移取出来。
#1
可用的通用寄存器就6个,不够的时候不应该都往寄存器里存,存入内存就可以
#2
可用的通用寄存器就6个,不够的时候不应该都往寄存器里存,存入内存就可以
代码应该怎么改呢?
#3
可用的通用寄存器就6个,不够的时候不应该都往寄存器里存,存入内存就可以
代码应该怎么改呢?
可以用栈啊,传一个内存地址,类似一个数组,然后汇编中再根据地址偏移取出来。