Напишите кратчайшую из возможных статей на ассемблере .
Используйте любой ISA, который вы хотите, если у него нет print-quine
инструкции или эквивалента. Примеры включают в себя x86, MIPS, SPARC, MMIX, IBM BAL, MIX, VAX, JVM, ARM и т. Д.
Вы можете ссылаться на _printf
функцию стандартной библиотеки C (или эквивалент Java для байт-кода JVM) для ввода / вывода.
Длина будет определяться как по количеству команд, так и по размеру сегмента данных. Решения должны содержать как минимум две инструкции.
Квин должен печатать код сборки , а не собранный машинный код.
Ответы:
x86 Linux, AT & T синтаксис: 244
(Я скомпилировал с этим:
gcc -nostartfiles -lc quine.S -o quine
)источник
Сборка байт-кода JVM (через Jasmin ) - 952
960990К сожалению, Жасмин не допускает столько приятных трюков, сколько
ilasm
позволяет Microsoft . Но у JVM есть шесть различныхdup
инструкций, которые делают все самое интересное. Переупорядочение элементов в стеке - это то, что .NET, похоже, не поддерживает.В любом случае, я полагаю, что ни одна из моих двух записей не является серьезным претендентом на самый короткий код, но я думаю, что сделать их намного короче сложно. Поэтому просто для полноты :-)
Комментируемая версия с информацией о том, что находится в стеке:
История:
ldc
корочеbipush
илиiconst_*
.источник
газ для Linux x86 (89 байт, семь инструкций)
Технически это обман.
Сохраните файл с именем
a
и соберите его с помощью следующих команд, чтобы создать исполняемый файл с именемa.out
.Директива
.incbin
содержит файл дословно в текущем местоположении. Если вы используете это для включения самого исходного кода, вы получите хороший quine.источник
Формат Windows .COM: 307 символов
Собирает, используя A86, до 51 байта. Не требует никаких внешних библиотек, кроме функции DOS Int21 AH = 9 (записать строку в стандартный вывод).
источник
NASM, 223 байта
Бить принятый ответ!
источник
.NET CIL - 623
669691723727Одна строка, без конца строки.
Первая версия отформатирована и прокомментирована (хотя это уже не квин) - вряд ли я сильно отклонюсь от общей концепции:
История :
dup
короче, чем писатьldloc.1
каждый раз.ldloc.1
можно написать,ldloc 1
чтобы сделать последний токен литералом. Результирующий байт-код, вероятно, больше, но он касается кода ассемблера, поэтому мне наплевать :-)object[]
локальная переменная; Я могу сделать все это в стеке напрямую. Ницца.источник
газ для Linux x86,
184176 байтСборка с
gcc -m32 -o a.out quine.S
. (-m32
Необязательно, если ваша ОС уже 32-битная.)Отредактировано, чтобы добавить: Если мы изменим правила, чтобы позволить
puts
быть вызванным вместоprintf
тогда, это может быть сделано в182174 байтах:(Обратите внимание, что этот, в отличие от предыдущего, имеет завершающий перевод строки.)
источник
printf
засорять свои аргументы в стеке. Технически небезопасно простоcall
повторять и ожидать те же аргументы, но на практике это работает, потому что gcc / clang никогда не использует слоты args в качестве пустого места, AFAIK.printf
из_start
(например, в статическом двоичном файле), так что это хороший аргумент для написанияmain
вместо a_start
. Этот ответ объясняет различные способы связывания libc из статических или динамических двоичных файлов. (В динамическом двоичном файле Linux динамический компоновщик будет запускать функции инициализатора glibc, так что вы можете использовать егоprintf
с_start
точки входа, но это не относится к cygwin IIRC.)Загрузочный ASM, 660 байт
Первоначально от jdiez17 , ваш гольф действительно.
источник
x86-64, System V AMD64 ABI, GASM: 432
источник
xor eax,eax
если вас не волнует состояние выхода вашей программы. Он все еще печатает сам, даже если он выходит с ненулевым статусом. Вы также можете использоватьpush
вместоpushq
. На самом деле, почему вы вообще делаете стековый фрейм? Броситьpush rbp
/mov rsp, rbp
иleave
. Вы также можете использовать более короткие названия меток..Cs
3 символа, когда 1 будет хорошо..att_syntax noprefix
вероятно, больше не окупается..intel_syntax noprefix
позволил бы вам отбросить эти шесть$
префиксов тоже. но, вероятно, все еще не стоит. (Вы могли бы использоватьlea ecx,.Cs
вместо синтаксиса Intelmov ecx,offset .Cs
)TAL
Чтобы выполнить это, вызовите
::tcl::unsuppoted::assemble
с кодом в качестве аргумента.Только Tcl 8,6
источник
80x86 TASM, 561 байт
источник