我有一个奇怪的情况是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]
}
在不让编译器知道的情况下,不得在gcc内联汇编中使用任何寄存器。您在使用ebx时遇到问题的原因是,ebx是编译器首选的寄存器,可以放置一段需要保留一段时间的值。但是,您对ecx和edx的使用也是不正确的。
有关使用内联汇编以及如何为输入,输出和clobbers指定寄存器的信息,请参阅https://stackoverflow.com/tags/inline-assembly/info上的链接。 (关于clobbers的信息在http://ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.3。)
特别是,请参阅https://gcc.gnu.org/wiki/DontUseInlineAsm。您编写的代码最好在.s文件中作为常规的外部汇编函数编写,而不是作为内联汇编编写。当然,那么你必须学习调用约定。