Napisz możliwie najkrótszą quine w języku asemblera .
Użyj dowolnego ISA, jeśli chcesz, chyba że ma print-quine
instrukcję lub równoważny. Przykłady obejmują x86, MIPS, SPARC, MMIX, IBM BAL, MIX, VAX, JVM, ARM itp.
Możesz połączyć się z _printf
funkcją biblioteki standardowej C (lub odpowiednikiem Java dla kodu bajtowego JVM) dla I / O.
Długość będzie oceniana zarówno na podstawie liczby instrukcji, jak i wielkości segmentu danych. Rozwiązania muszą zawierać co najmniej dwie instrukcje.
Quine powinna wydrukować kod zestawu , a nie zmontowany kod maszyny.
Odpowiedzi:
Linux x86, AT&T: 244
(Skompilowałem to z tym
gcc -nostartfiles -lc quine.S -o quine
:)źródło
Zestaw JVM Bytecode (przez Jasmin ) - 952
960990Niestety, Jasmin nie dopuszcza tylu fajnych sztuczek, na jakie
ilasm
pozwala Microsoft . Ale JVM ma w sumie sześć różnychdup
instrukcji, które wykonują różnego rodzaju zabawne rzeczy. Zmiana kolejności elementów na stosie jest czymś, czego .NET nie obsługuje.W każdym razie wydaje mi się, że żaden z moich dwóch wpisów nie stanowi poważnego pretendenta do najkrótszego kodu, ale wydaje mi się, że trudno jest je znacznie skrócić. Dlatego właśnie dla kompletności :-)
Skomentowana wersja z informacjami o tym, co jest na stosie:
Historia:
ldc
jest krótszy niżbipush
lubiconst_*
.źródło
gas dla x86 Linux (89 bajtów, siedem instrukcji)
Technicznie jest to oszustwo.
Zapisz w pliku o nazwie
a
i złóż za pomocą następujących poleceń, aby utworzyć plik wykonywalny o nazwiea.out
.Dyrektywa
.incbin
zawiera dosłownie plik w bieżącej lokalizacji. Jeśli użyjesz tego do dołączenia samego kodu źródłowego, otrzymasz niezłą quine.źródło
Format Windows .COM: 307 znaków
Składa za pomocą A86 do 51 bajtów. Nie wymaga bibliotek zewnętrznych innych niż funkcja DOS Int21 AH = 9 (zapisz ciąg znaków na standardowe wyjście).
źródło
NASM, 223 bajty
Pokonując przyjętą odpowiedź!
źródło
.NET CIL - 623
669691723727Pojedyncza linia, bez końca linii na końcu.
Sformatowana i skomentowana pierwsza wersja (mimo że nie jest to już quine) - jest mało prawdopodobne, że znacznie odbiegam od ogólnej koncepcji:
Historia :
dup
jest krótszy niż pisanie zaldloc.1
każdym razem.ldloc.1
można zapisaćldloc 1
się, aby ostatni żeton dosłownym. Wynikowy kod bajtowy jest prawdopodobnie większy, ale dotyczy kodu asemblera, więc nie obchodzi mnie to mniej :-)object[]
zmiennej lokalnej; Mogę to wszystko zrobić bezpośrednio na stosie. Ładny.źródło
gas dla x86 Linux,
184176 bajtówBuduj z
gcc -m32 -o a.out quine.S
. (Opcja-m32
jest opcjonalna, jeśli Twój system operacyjny jest już 32-bitowy.)Edytowano, aby dodać: Jeśli zmodyfikujemy reguły, aby umożliwić
puts
wywoływanie zamiastprintf
, można to zrobić w182174 bajtach:(Zauważ, że ten, w przeciwieństwie do poprzedniego, ma nową linię kończącą.)
źródło
printf
na spychanie swoich argumentów na stosie. Nie jest technicznie bezpieczne, abycall
to powtórzyć i oczekiwać tych samych argumentów, ale działa w praktyce, ponieważ gcc / clang nigdy nie używa szczelin argumentów jako miejsca na zarysowania, AFAIK.printf
z_start
(np. W statycznym pliku binarnym), więc jest to dobry argument do napisaniamain
zamiast_start
. Ta odpowiedź wyjaśnia różne sposoby łączenia libc ze statycznych lub dynamicznych plików binarnych. (W dynamicznym pliku binarnym systemu Linux dynamiczny linker uruchomi funkcje inicjalizujące glibc, więc możesz używać goprintf
od_start
punktu wejścia, ale nie jest tak w przypadku cygwin IIRC.)Rozruchowy ASM, 660 bajtów
Oryginalnie autorstwa jdiez17 , twoja gra w golfa naprawdę.
źródło
x86-64, System V AMD64 ABI, GASM: 432
źródło
xor eax,eax
jeśli nie obchodzi cię status wyjścia z programu. Nadal drukuje się, nawet jeśli zakończy działanie z niezerowym statusem. Możesz także użyćpush
zamiastpushq
. Właściwie, dlaczego w ogóle robisz ramkę stosu? Upuśćpush rbp
/mov rsp, rbp
ileave
. Możesz także użyć krótszych nazw etykiet..Cs
ma 3 znaki, gdy 1 byłoby w porządku..att_syntax noprefix
prawdopodobnie już się nie zwraca..intel_syntax noprefix
pozwoli ci również upuścić te sześć$
prefiksów. ale prawdopodobnie nadal nie warto. (Można użyćlea ecx,.Cs
zamiast składni intelmov ecx,offset .Cs
)TAL
Aby go wykonać, wywołaj
::tcl::unsuppoted::assemble
kod jako argument.Tylko Tcl 8.6.
źródło
80x86 TASM, 561 bajtów
źródło