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

问题描述 投票:1回答:1

我有一个奇怪的情况是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]
}
assembly x86 g++ cpu inline-assembly
1个回答
3
投票

在不让编译器知道的情况下,不得在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文件中作为常规的外部汇编函数编写,而不是作为内联汇编编写。当然,那么你必须学习调用约定。

© www.soinside.com 2019 - 2024. All rights reserved.