GCC Вызов метки как функции - PullRequest
2 голосов
/ 03 марта 2011

Все в названии.По некоторым причинам я должен сделать это следующим образом.

Но когда я компилирую свой код, GCC (или, возможно, GAS ...) отображает следующую ошибку:

... / Temp /cc1C1fjs.s: 19: Ошибка: немедленный операнд недопустим с абсолютным переходом

Код:

int main ( int argc, char **argv )
{
    /* Some code */

    ( (void(*)()) &&label)();

    /* Some code */

    return 0;

    label:
    asm ("push %ebp");
    asm ("mov %esp,%ebp");

    /* Some code */
    printf("Hello world");

    asm ("leave");
    asm("ret");
}

Я уверен, что это должно работать, потому что я пытался создать поток, используя функцию CreateThread (Я под windows), указав в качестве точки входа адрес метки, и это работает на отлично.Итак, как я могу гарантировать, что компилятор принимает этот синтаксис?Или есть другие способы сделать это?

Ответы [ 2 ]

0 голосов
/ 03 марта 2011

Я исправил часть проблемы:

  1. @ Экс, вы имеете право, GCC удалить все из основной функции после return 0; я это исправил заменив его на

    asm("leave");
    asm("xor %eax,%eax");
    asm("ret");
    

    Теперь генерируется код после моей метки.

  2. Запуск gcc -S file.c, затем gcc file.s -o file.exe, конечно, он отображает ошибку и при строка ошибки там call *$L2 (L2 - метка в моем файле c). Оно работает заменив его на call L2.

    Теперь код после моей метки и после моего звонка в main выполняется и программа правильно завершается с состоянием 0.

Но я не хочу делать это каждый раз, когда буду компилировать. Это нормально, что GCC пишет call *$L2, а не call L2?

0 голосов
/ 03 марта 2011

У меня нет решения для вас, но у меня есть пара предложений:

  1. Запустите gcc -S file.c и посмотрите на строку № 19, чтобы увидеть, можете ли вы определить, что на самом делепроблема в том.
  2. Просмотрите остальную часть (короткого) файла .s, чтобы увидеть, если что-то явно не так.Например, моя версия gcc, похоже, решает, что все после return 0 является мертвым кодом, поэтому ни ваш код asm, ни printf на самом деле не доходит до ассемблера.
  3. Может 'этот код будет перемещен в функцию?Таким образом, вы получите пролог / эпилог бесплатно;взятие адреса также будет менее затруднительным.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...