Запись в регистр EBX в конечном итоге приводит к ошибке сегментации программы - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть любопытный случай, когда регистр ebx вызывает segfault, когда я выполняю какую-либо операцию записи на нем.Я не могу понять, почему.Есть ли ограничение в регистре 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 голосов
/ 16 февраля 2019

Вы не должны использовать никакие регистры во встроенной сборке gcc без уведомления компилятора.Причина, по которой вы видите проблему с использованием ebx, заключается в том, что ebx - это первый выбор компилятора для регистра, чтобы поместить значение, которое ему нужно некоторое время хранить.Однако использование ecx и edx также неверно.

Информацию об использовании встроенной сборки и о том, как назначать регистры для входов, выходов и клобберов, см. В ссылках по адресу https://stackoverflow.com/tags/inline-assembly/info.(Информация о клобберах находится в http://ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.3.)

В частности, см. https://gcc.gnu.org/wiki/DontUseInlineAsm. Код, который вы написали, лучше было бы написать как обычную функцию сборки вне строки в файле .s, скореечем встроенная сборка. Конечно, тогда вам придется узнать о соглашениях о вызовах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...