Écrivez le quine le plus court possible en langage assembleur .
Utilisez l'ISA de votre choix, sauf s'il contient une print-quine
instruction ou un équivalent. Les exemples incluent x86, MIPS, SPARC, MMIX, IBM BAL, MIX, VAX, JVM, ARM, etc.
Vous pouvez établir un lien avec la _printf
fonction de la bibliothèque standard C (ou l'équivalent Java pour le bytecode JVM) pour les E / S.
La longueur sera jugée à la fois en fonction du nombre d'instructions et de la taille du segment de données. Les solutions doivent contenir au moins deux instructions.
Le quine doit imprimer le code d' assemblage , pas le code machine assemblé.
Réponses:
x86 Linux, syntaxe AT&T: 244
(Je l' ai compilé avec ceci:
gcc -nostartfiles -lc quine.S -o quine
)la source
Assemblage de bytecode JVM (via Jasmin ) - 952
960990Malheureusement, Jasmin n'autorise pas autant de belles astuces que Microsoft le
ilasm
permet. Mais la JVM a un total de sixdup
instructions différentes qui font toutes sortes de choses amusantes. Réorganiser les éléments de la pile est quelque chose que .NET ne semble pas prendre en charge.Dans tous les cas, je suppose qu'aucune de mes deux entrées n'est sérieuse pour le code le plus court, mais je suppose qu'il est difficile de les rendre beaucoup plus courts. Par conséquent, juste pour être complet :-)
Version commentée avec des informations sur le contenu de la pile:
Histoire:
ldc
est plus court quebipush
ouiconst_*
.la source
gas pour x86 Linux (89 octets, sept instructions)
Techniquement, c'est de la triche.
Enregistrez dans un fichier nommé
a
et assemblez avec les commandes suivantes pour créer l'exécutable nomméa.out
.La directive
.incbin
inclut un fichier textuellement à l'emplacement actuel. Si vous l'utilisez pour inclure le code source lui-même, vous obtenez un joli quine.la source
Format Windows .COM: 307 caractères
Assemble, en utilisant A86, à 51 octets. Ne nécessite aucune bibliothèque externe autre que la fonction DOS Int21 AH = 9 (écrire la chaîne dans stdout).
la source
NASM, 223 octets
Battre la réponse acceptée!
la source
.NET CIL - 623
669691723727Une seule ligne, pas de saut de ligne à la fin.
Première version formatée et commentée (même si ce n'est plus une quine) - il est peu probable que je dévie beaucoup du concept général:
Histoire :
dup
est plus court que d'écrire àldloc.1
chaque fois.ldloc.1
peuvent être écritesldloc 1
pour faire du dernier jeton un littéral. Le bytecode résultant est probablement plus grand, mais il s'agit du code assembleur, donc je m'en fiche :-)object[]
comme variable locale; Je peux faire tout cela directement sur la pile. Agréable.la source
gaz pour x86 Linux,
184176 octetsConstruisez avec
gcc -m32 -o a.out quine.S
. (Le-m32
est facultatif si votre système d'exploitation est déjà 32 bits.)Modifié pour ajouter: Si nous modifions les règles pour permettre
puts
d'être appelé à la place,printf
cela peut être fait en182174 octets:(Notez que celui-ci, contrairement au précédent, a une nouvelle ligne de fin.)
la source
printf
de clobber ses arguments sur la pile. Techniquement, il n'est pas sûr decall
le refaire et d'attendre les mêmes arguments, mais cela fonctionne dans la pratique car gcc / clang n'utilise jamais les emplacements d'arg comme espace de travail, AFAIK.printf
depuis_start
(par exemple dans un binaire statique), c'est donc un bon argument pour écrire unmain
au lieu d'un_start
. Cette réponse explique les différentes manières de lier libc à partir de binaires statiques ou dynamiques. (Dans un binaire dynamique Linux, l'éditeur de liens dynamique exécutera les fonctions d'initialisation de la glibc, vous pouvez donc les utiliserprintf
depuis le_start
point d'entrée, mais ce n'est pas le cas sur cygwin IIRC.)ASM amorçable, 660 octets
À l'origine par jdiez17 , vraiment joué par le vôtre.
la source
x86-64, System V AMD64 ABI, GASM: 432
la source
xor eax,eax
du tout si vous ne vous souciez pas du statut de sortie de votre programme. Il s'imprime toujours, même s'il se termine avec un état différent de zéro. Vous pouvez également utiliserpush
au lieu depushq
. En fait, pourquoi fabriquez-vous même un cadre de pile? Déposez lepush rbp
/mov rsp, rbp
etleave
. Vous pouvez également utiliser des noms d'étiquette plus courts..Cs
est 3 caractères quand 1 serait bien..att_syntax noprefix
ne paie probablement plus pour lui-même..intel_syntax noprefix
vous permettrait également de supprimer ces six$
préfixes. mais cela n'en vaut probablement pas la peine. (Vous pouvez utiliser à lalea ecx,.Cs
place de la syntaxe Intelmov ecx,offset .Cs
)TAL
Pour l'exécuter, appelez
::tcl::unsuppoted::assemble
avec le code comme argument.Tcl 8.6 uniquement.
la source
80x86 TASM, 561 octets
la source