写入EBX寄存器最终导致程序分段错误

时间:2019-02-16 01:32:42

标签: assembly x86 g++ cpu inline-assembly

我有一个奇怪的案例,当我对它执行任何写操作时,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]
}

1 个答案:

答案 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文件中的常规外联汇编函数编写,而不是内联汇编编写。当然,那您将必须了解有关调用约定的信息。