Что значит '__asm ​​__ (". Previous");' имею в виду? - PullRequest
5 голосов
/ 10 марта 2010

При попытке скомпилировать мой проект, который использует сторонние заголовки, с mingw 4.4 я обнаружил следующую ошибку:

Сообщения ассемблера:
Ошибка: мусор в конце строки, первый нераспознанный символ - ""
Ошибка: неизвестная псевдооперация: '.previous'

Я нашел этот код в конце одного из включенных заголовков:

__asm__(".section \".plc\"");
__asm__(".previous");

Поскольку у меня нет никакого опыта работы с инструкциями встроенного ассемблера, я гуглил объяснение, но не смог найти ответ на два моих основных вопроса. Что конкретно делает __asm__(".previous"); и почему кто-то помещает это в конец заголовочного файла.

Это единственные __asm__ инструкции во всем проекте. Могу ли я безопасно удалить их? Или есть способ определить .previous, чтобы сделать его известным псевдооператором?

Просвети меня, пожалуйста!

1 Ответ

5 голосов
/ 10 марта 2010

.previous - это директива, которая позволяет вам переключаться между двумя эльфийскими секциями. Это ярлык, который позволяет создавать более плотные файлы сборки и позволяет, например, объявлять инициализированные данные в потоке кода или наоборот.

Например, скажем, у вас есть файл ассемблера с данными и разделом кода.

Если вы хотите - в середине функции - объявить константу в сегменте данных, вы можете использовать выражение .previous так:

  nop            // some code

.previous        // swaps current section (code) with previous section (data)

MyConstant:
  .word 0x0001   // some data

.previous        // swaps curent section (data) with previous section (code)

  nop            // more code

Более подробную информацию можно найти в справочном руководстве:

http://sourceware.org/binutils/docs-2.19/as/Previous.html#Previous

...