Что делает '__ asm __ (“.previous”)'; средний?

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

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

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

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

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

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

Просветите меня!

5
задан starblue 10 March 2010 в 21:09
поделиться

1 ответ

.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

5
ответ дан 14 December 2019 в 19:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: