Да, используя директивы ассемблера внутри встроенного ассемблера. Хитрость заключается в том, чтобы поместить строку в нужное место (раздел данных), что можно сделать, переключившись с помощью .section .data
, а затем снова переключившись обратно с помощью .section .text
.
Вы должны присвоить данным метку, чтобы вы могли ссылаться на нее; Я бы рекомендовал использовать здесь локальный синтаксис меток (где метка - это число, например, 1:
, и вы ссылаетесь на него как 1b
для первой метки 1:
в обратном направлении или 1f
для первой 1:
пометьте вперед - см. документацию для сборщика GNU для получения более подробной информации.
Как это:
int main(void)
{
asm(".section .data \n"
"1: .asciz \"Hello\" \n"
".section .text \n"
"pushl $1b \n"
"call _puts \n"
"add $4, %esp \n"
);
return 0;
}
У меня нет системы Windows, на которой можно было бы это протестировать, но она компилируется нормально и выглядит так, как будто она должна работать правильно, используя кросс-компилятор MinGW в Linux (я считаю, что Dev-C ++ основан на MinGW) .
Примечание: этот метод обычно применим при использовании цепочки инструментов GNU. Если вы создаете бинарные файлы ELF (например, собственный Linux), есть более удобный способ вернуться к текстовому разделу, который должен использовать .previous
, что означает «независимо от того, каким разделом был предыдущий .section
». (Приведенный выше пример работает в Linux, если вы измените _puts
на puts
, чтобы учесть различные соглашения о префиксе символов.)