Schreiben Sie die kürzest mögliche Assemblersprachen- quine .
Verwenden Sie einen von Ihnen gewünschten ISA, es sei denn, er verfügt über eine print-quine
Anweisung oder eine Entsprechung. Beispiele sind x86, MIPS, SPARC, MMIX, IBM BAL, MIX, VAX, JVM, ARM usw.
Sie können eine Verknüpfung mit der _printf
Funktion der C-Standardbibliothek (oder der Java-Entsprechung für JVM-Bytecode) für E / A herstellen.
Die Länge wird sowohl nach der Befehlsanzahl als auch nach der Größe des Datensegments beurteilt. Die Lösungen müssen mindestens zwei Anweisungen enthalten.
Das Quine sollte den Assembler- Code und nicht den Assembler-Maschinencode drucken .
Antworten:
x86 Linux, AT & T-Syntax: 244
(Ich es mit diesem zusammengestellt:
gcc -nostartfiles -lc quine.S -o quine
)quelle
JVM-Bytecode-Assembly (über Jasmin ) - 952
960990Leider erlaubt Jasmin nicht so viele nette Tricks, wie es Microsoft
ilasm
erlaubt. Aber die JVM hat insgesamt sechs verschiedenedup
Anweisungen, die alle Arten von lustigen Dingen ausführen. Das Umordnen von Elementen auf dem Stapel wird von .NET anscheinend nicht unterstützt.Auf jeden Fall denke ich, dass keiner meiner beiden Einträge ernsthafte Kandidaten für den kürzesten Code sind, aber ich denke, es ist schwierig, sie viel kürzer zu machen. Deshalb nur der Vollständigkeit halber :-)
Kommentierte Version mit Informationen darüber, was sich auf dem Stapel befindet:
Geschichte:
ldc
ist kürzer alsbipush
odericonst_*
.quelle
Gas für x86 Linux (89 Bytes, sieben Anweisungen)
Technisch gesehen ist das Betrug.
Speichern Sie in einer Datei mit dem Namen
a
und fügen Sie sie mit den folgenden Befehlen zusammen, um die ausführbare Datei mit dem Namen zu erstellena.out
.Die Direktive
.incbin
enthält eine Datei wörtlich am aktuellen Speicherort. Wenn Sie dies verwenden, um den Quellcode selbst einzuschließen, erhalten Sie eine nette Quine.quelle
Windows .COM Format: 307 Zeichen
Assembliert mit A86 auf 51 Byte. Benötigt keine anderen externen Bibliotheken als die Funktion DOS Int21 AH = 9 (String in stdout schreiben).
quelle
NASM, 223 Bytes
Die akzeptierte Antwort schlagen!
quelle
.NET CIL - 623
669691723727Eine einzelne Zeile, kein Zeilenumbruch am Ende.
Erste Version formatiert und kommentiert (auch wenn es keine Quine mehr ist) - es ist unwahrscheinlich, dass ich stark vom allgemeinen Konzept abweiche:
Geschichte :
dup
istldloc.1
jedes Mal kürzer als das Schreiben .ldloc.1
können geschrieben werdenldloc 1
, um das letzte Token zu einem Literal zu machen. Der resultierende Bytecode ist wahrscheinlich größer, aber es geht um den Assembler-Code, also ist mir das egal :-)object[]
als lokale Variable nicht. Ich kann das alles direkt auf dem Stapel machen. Nett.quelle
Gas für x86 Linux,
184176 BytesBauen mit
gcc -m32 -o a.out quine.S
. (Das-m32
ist optional, wenn Ihr Betriebssystem bereits 32-Bit ist.)Bearbeitet, um hinzuzufügen: Wenn wir die Regeln so ändern, dass
puts
sie aufgerufen werdenprintf
können, kann dies in182 bis174 Bytes erfolgen:(Beachten Sie, dass dieses im Gegensatz zum vorherigen eine abschließende Newline hat.)
quelle
printf
, seine Args auf dem Stapel zu blockieren. Es ist technisch nicht sicher,call
es noch einmal zu tun und dieselben Argumente zu erwarten, aber es funktioniert in der Praxis, weil gcc / clang niemals Argumente als Scratch-Space verwenden, AFAIK.printf
von_start
(z. B. in einer statischen Binärdatei) aufzurufen , sodass dies ein gutes Argument für das Schreiben von amain
anstelle von a ist_start
. In dieser Antwort werden die verschiedenen Möglichkeiten zum Verknüpfen von libc aus statischen oder dynamischen Binärdateien erläutert. (In einer dynamischen Linux-Binärdatei führt der dynamische Linker die Initialisierungsfunktionen von glibc aus, sodass Sie dieseprintf
vom_start
Einstiegspunkt aus verwenden können. Dies ist jedoch bei cygwin IIRC nicht der Fall.)Bootfähiges ASM, 660 Byte
Ursprünglich von jdiez17 , aufrichtig von Ihnen gespielt.
quelle
x86-64, System V AMD64 ABI, GASM: 432
quelle
xor eax,eax
wenn Sie sich nicht um den Exit-Status Ihres Programms kümmern. Es druckt sich selbst dann noch aus, wenn es mit einem Status ungleich Null beendet wird. Sie können auchpush
anstelle von verwendenpushq
. Warum machst du überhaupt einen Stapelrahmen? Lassen Sie daspush rbp
/mov rsp, rbp
und fallenleave
. Sie können auch kürzere Bezeichnungen verwenden..Cs
ist 3 Zeichen, wenn 1 in Ordnung wäre..att_syntax noprefix
zahlt sich das wohl nicht mehr aus..intel_syntax noprefix
Damit können Sie auch diese sechs$
Präfixe löschen. aber wahrscheinlich immer noch nicht wert. (Sie könntenlea ecx,.Cs
anstelle der Intel-Syntax verwendenmov ecx,offset .Cs
)TAL
Rufen Sie
::tcl::unsuppoted::assemble
mit dem Code als Argument auf, um es auszuführen .Nur Tcl 8.6.
quelle
80 x 86 TASM, 561 Byte
quelle