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

Write to EBX register eventually leads to program segmentation fault

我有一个 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的使用也不正确。

有关使用内联汇编以及如何为输入、输出和破坏指定寄存器的信息,请参阅 https://whosebug.com/tags/inline-assembly/info. (Information on clobbers is at http://ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.3 处的链接。)

具体参见https://gcc.gnu.org/wiki/DontUseInlineAsm。您编写的代码最好作为 .s 文件中的常规外联汇编函数编写,而不是作为内联汇编。当然,那你就得学习调用约定了。