встроенная сборка в функции C ++ с оператором return - PullRequest
3 голосов
/ 15 января 2020

Рассмотрим этот код:

#include <cstdio>

int get_value() { asm("movl $254, %eax"); }

int main() { printf("%d\n", get_value()); }

Теперь, если кто-то компилирует этот код с g++ main.cpp, он получает предупреждение компилятора (но код все еще компилируется):

main.cpp: In function ‘int get_value()’:
main.cpp:3:43: warning: no return statement in function returning non-void [-Wreturn-type]
    3 | int get_value() { asm("movl $254, %eax"); }
      |                                    

Поскольку этот ответ говорит, что если компилятор генерирует двоичный файл с указанным выше кодом, все ставки отключены. (нет оператора возврата из функции с возвращаемым типом int)

Действительно, когда кто-то компилирует этот код с включенной оптимизацией g++ -O3 main.cpp, эта программа немедленно вызывает ошибки.

Итак, мой вопрос: как можно вернуться из встроенной сборки в функции c ++, которая совместима с C ++, и не получить это предупреждение, и код работает нормально.

1 Ответ

3 голосов
/ 15 января 2020

Я считаю, что вам нужно объявить фиктивную переменную и использовать расширенный синтаксис g cc для вывода этой переменной, а затем вы можете вернуть эту переменную. Оптимизатор должен исключить обоих присвоителей.

Это как-то объяснено в https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s5 и может выглядеть следующим образом:

#include <cstdio>

int get_value() {
  int b;
  asm("movl $254, %0;"
      : "=r"(b)
      );
  return b;
}

int main() {
  printf("%d\n", get_value());
}
...