Escriba la quine más breve posible en lenguaje ensamblador .
Use cualquier ISA que desee, a menos que tenga una print-quineinstrucción o equivalente. Los ejemplos incluyen x86, MIPS, SPARC, MMIX, IBM BAL, MIX, VAX, JVM, ARM, etc.
Puede vincular contra la _printffunción de la biblioteca estándar de C (o el equivalente de Java para el código de bytes JVM) para E / S.
La longitud se juzgará tanto por el recuento de instrucciones como por el tamaño del segmento de datos. Las soluciones deben contener al menos dos instrucciones.
La quine debe imprimir el código de ensamblaje , no el código de máquina ensamblado.

Respuestas:
x86 Linux, sintaxis de AT&T: 244
(He compilado con esto:
gcc -nostartfiles -lc quine.S -o quine)fuente
JVM Asamblea Bytecode (a través de Jasmin ) - 952
960990Lamentablemente, Jasmin no permite tantos trucos agradables como los de Microsoft
ilasm. Pero la JVM tiene un total de seisdupinstrucciones diferentes que hacen todo tipo de cosas divertidas. Reordenar elementos en la pila es algo que .NET no parece admitir.En cualquier caso, creo que ninguna de mis dos entradas son contendientes serios para el código más corto, pero creo que es difícil hacerlos mucho más cortos. Por lo tanto, solo para completar :-)
Versión comentada con información sobre lo que está en la pila:
Historia:
ldces más corto quebipushoiconst_*.fuente
gas para x86 Linux (89 bytes, siete instrucciones)
Técnicamente, esto es trampa.
Guardar en un archivo llamado
ay ensamblar con los siguientes comandos para crear el ejecutable llamadoa.out.La directiva
.incbinincluye un archivo literalmente en la ubicación actual. Si usa esto para incluir el código fuente en sí, obtendrá un buen quine.fuente
Formato .COM de Windows: 307 caracteres
Ensambla, usando A86, a 51 bytes. No requiere bibliotecas externas que no sean la función Int21 AH = 9 de DOS (escribir cadena en stdout).
fuente
NASM, 223 bytes
Batir la respuesta aceptada!
fuente
.NET CIL - 623
669691723727Una sola línea, sin salto de línea al final.
Primera versión formateada y comentada (aunque ya no es una quine): es poco probable que me desvíe mucho del concepto general:
Historia :
dupes más corto que escribirldloc.1cada vez.ldloc.1se pueden escribir cosas comoldloc 1para hacer que el último token sea literal. El bytecode resultante es probablemente más grande, pero se trata del código ensamblador, por lo que no podría importarme menos :-)object[]como variable local; Puedo hacer todo eso en la pila directamente. Agradable.fuente
gas para x86 Linux,
184176 bytesConstruir con
gcc -m32 -o a.out quine.S. (El-m32es opcional si su sistema operativo ya es de 32 bits).Editado para agregar: si modificamos las reglas para permitir
putsque se invoque en lugar deprintfeso, se puede hacer en182174 bytes:(Tenga en cuenta que este, a diferencia del anterior, tiene una nueva línea de finalización).
fuente
printfgolpear sus argumentos en la pila. No es técnicamente segurocallvolver a usarlo y esperar los mismos args, pero funciona en la práctica porque gcc / clang nunca usa ranuras de args como espacio para rascar, AFAIK.printfdesde_start(por ejemplo, en un binario estático), por lo que es un buen argumento para escribir un enmainlugar de un_start. Esta respuesta explica las diversas formas de vincular libc desde binarios estáticos o dinámicos. (En un binario dinámico de Linux, el enlazador dinámico ejecutará las funciones de inicializador de glibc, por lo que puede usarloprintfdesde el_startpunto de entrada, pero ese no es el caso en cygwin IIRC.)ASM de arranque, 660 bytes
Originalmente por jdiez17 , jugado por el tuyo de verdad.
fuente
x86-64, Sistema V AMD64 ABI, GASM: 432
fuente
xor eax,eaxnada si no le importa el estado de salida de su programa. Todavía se imprime, incluso si sale con un estado distinto de cero. También puede usar enpushlugar depushq. En realidad, ¿por qué estás haciendo un marco de pila? Suelta elpush rbp/mov rsp, rbpyleave. También podría usar nombres de etiqueta más cortos..Csson 3 caracteres cuando 1 estaría bien..att_syntax noprefixprobablemente ya no se pague solo..intel_syntax noprefixtambién te permitiría eliminar esos seis$prefijos. pero probablemente aún no valga la pena. (Podría usar enlea ecx,.Cslugar de la sintaxis de inteligenciamov ecx,offset .Cs)TAL
Para ejecutarlo, llame
::tcl::unsuppoted::assemblecon el código como argumento.Tcl 8.6 solamente.
fuente
80x86 TASM, 561 bytes
fuente