我有一个奇怪的案例,当我对它执行任何写操作时,ebx寄存器会导致段错误。我不知道为什么。我不能使用ebx寄存器有一些限制吗?我已经尝试过将其他寄存器与该算法一起使用,并且功能正常。只有当我使用ebx寄存器时,我才会遇到分段错误。 我使用的是x86-32架构,Intel语法和GCC风格的内联汇编代码。
//code (c)opyright Daniel (Robin) Smith
#include <iostream>
int main ()
{
int s, i;
[redacted]
asm (
"\n"
[redacted]
" call series\n"
" jmp finished\n"
"series:\n"
" push ebp\n"
" mov ebp,esp\n"
" mov ebx,0x1\n"
[redacted]
"series_exit:\n"
" leave\n"
" ret\n"
"finished:"
:"=a"(s)
:"a"(i)
);
[redacted]
}
答案 0 :(得分:3)
在不告知编译器的情况下,不得在gcc内联汇编中使用任何寄存器。使用ebx会出现问题的原因是ebx是编译器首选的寄存器,用于放置需要保留一段时间的值。但是,您对ecx和edx的使用也不正确。
有关使用内联汇编以及如何为输入,输出和修饰符指定寄存器的信息,请参见https://stackoverflow.com/tags/inline-assembly/info上的链接。 (有关Clobber的信息,请访问http://ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.3。)
尤其是,请参见https://gcc.gnu.org/wiki/DontUseInlineAsm。您编写的代码最好作为.s文件中的常规外联汇编函数编写,而不是内联汇编编写。当然,那您将必须了解有关调用约定的信息。