При попытке скомпилировать мой проект, который использует некоторые сторонние заголовки с mingw 4.4, я встретился со следующей ошибкой:
Ассемблерные сообщения:
Ошибка: спам в конце строки, сначала нераспознанный символ '"'
Ошибка: неизвестный pseudo-op: .previous'
Я нашел этот код в конце одного из включенных заголовков:
__asm__(".section \".plc\"");
__asm__(".previous");
Так как у меня нет опыта вообще со встроенными ассемблерными инструкциями, я погуглил для объяснения к нему, но не мог найти ответ на свои два основных вопроса. Что делает __asm__(".previous");
на самом деле и почему кто-либо поместил бы это в конце заголовочного файла.
Это единственное __asm__
инструкции в целом проекте. Я могу безопасно удалить их? Или есть ли способ определить .previous для создания его известным pseudo-op?
Просветите меня!
.previous
- это директива, позволяющая переходить от одной секции elf к другой. Это сокращение, которое позволяет создавать более плотные ассемблерные файлы и позволяет, например, объявлять инициализированные данные в потоке кода или наоборот.
Например, у вас есть ассемблерный файл с секциями данных и кода.
Если вы хотите - в середине функции - объявить константу в сегменте данных, вы можете использовать оператор .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