Ассемблерный код генерирует ошибку СЕГМЕНТАЦИИ - PullRequest
0 голосов
/ 05 марта 2019

У меня есть следующая функция:

int max(int num1, int num2)
{
    int retval;
    __asm__("maxii_start:;"
        "movl %1, %%eax;" 
        "subl $0, %%eax;" 
        "movl %2, %%edx;"
        "subl $0, %%edx;"
        "cmpl %%edx, %%eax;"
        "jle maxii0;"
        "addl $0, %%eax;"
        "jmp maxii1;"
        "maxii0:;"
        "movl %%edx, %%eax;"
        "maxii1:;"
        "movl %%eax, %0;"
        "ret;"
        :"=r"(retval)
        :"r"(num1), "r"(num2)
        );
    return retval;
}

Когда я использую его, например. как int m = max(5, 10); Я вижу Ошибка сегментации (ядро сброшено).

Я думаю, что я неправильно использую cmpl. Что не так с этой функцией?

1 Ответ

2 голосов
/ 05 марта 2019
  1. Вам необходимо сообщить компилятору, какие регистры вы изменяете в коде сборки (называемом «clobbers»).

Перед закрывающей круглой скобкой asm добавить

: “eax”, “edx”

На самом деле было бы лучше позволить компилятору выбирать регистры для использования, но для этого потребуется переписать все это.

  1. Не ставьте «ret» в операторе asm. Вам нужно дать компилятору сгенерировать эпилог функции.
...