C ++ многострочные строковые литералы
Интересно, как этот вопрос указал мне на ответ:
main.cpp
#include <cassert>
#include <cinttypes>
int main() {
uint64_t io = 0;
__asm__ (
R"(
incq %0
incq %0
)"
: "+m" (io)
:
:
);
assert(io == 2);
}
Скомпилируйте и запустите:
g++ -o main -pedantic -std=c++11 -Wall -Wextra main.cpp
./main
См. Также: Многострочный строковый литерал C ++
GCC также добавляет тот же синтаксис, что и расширение C, вам просто нужно использовать -std=gnu99
вместо-std=c99
:
main.c
#include <assert.h>
#include <inttypes.h>
int main(void) {
uint64_t io = 0;
__asm__ (
R"(
incq %0
incq %0
)"
: "+m" (io)
:
:
);
assert(io == 2);
}
Скомпилировать и запустить:
gcc -o main -pedantic -std=gnu99 -Wall -Wextra main.c
./main
См. Также: Как разбить строковый литерал на несколько строкв C / Objective-C?
Недостатком этого метода является то, что я не вижу, как добавить макросы препроцессора C в сборку, поскольку они не раскрываются внутри строк, см. также: Многострочный встроенный макрос сборки со строками
Протестировано в Ubuntu 16.04, GCC 6.4.0, binutils 2.26.1.
.incbin
Эта директива GNU GAS - это еще одна вещь, которая должна быть в вашем радаре, если вы собираетесь использовать большие блоки сборки: Встраивание ресурсов в executable с помощью GCC
Сборка будет в отдельном файле, поэтому это не прямой ответ, но об этом все же стоит знать.