Escriba la quine más breve posible en lenguaje ensamblador .
Use cualquier ISA que desee, a menos que tenga una print-quine
instrucción o equivalente. Los ejemplos incluyen x86, MIPS, SPARC, MMIX, IBM BAL, MIX, VAX, JVM, ARM, etc.
Puede vincular contra la _printf
funció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 seisdup
instrucciones 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:
ldc
es más corto quebipush
oiconst_*
.fuente
gas para x86 Linux (89 bytes, siete instrucciones)
Técnicamente, esto es trampa.
Guardar en un archivo llamado
a
y ensamblar con los siguientes comandos para crear el ejecutable llamadoa.out
.La directiva
.incbin
incluye 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 :
dup
es más corto que escribirldloc.1
cada vez.ldloc.1
se pueden escribir cosas comoldloc 1
para 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-m32
es opcional si su sistema operativo ya es de 32 bits).Editado para agregar: si modificamos las reglas para permitir
puts
que se invoque en lugar deprintf
eso, se puede hacer en182174 bytes:(Tenga en cuenta que este, a diferencia del anterior, tiene una nueva línea de finalización).
fuente
printf
golpear sus argumentos en la pila. No es técnicamente segurocall
volver 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.printf
desde_start
(por ejemplo, en un binario estático), por lo que es un buen argumento para escribir un enmain
lugar 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 usarloprintf
desde el_start
punto 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,eax
nada 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 enpush
lugar depushq
. En realidad, ¿por qué estás haciendo un marco de pila? Suelta elpush rbp
/mov rsp, rbp
yleave
. También podría usar nombres de etiqueta más cortos..Cs
son 3 caracteres cuando 1 estaría bien..att_syntax noprefix
probablemente ya no se pague solo..intel_syntax noprefix
también te permitiría eliminar esos seis$
prefijos. pero probablemente aún no valga la pena. (Podría usar enlea ecx,.Cs
lugar de la sintaxis de inteligenciamov ecx,offset .Cs
)TAL
Para ejecutarlo, llame
::tcl::unsuppoted::assemble
con el código como argumento.Tcl 8.6 solamente.
fuente
80x86 TASM, 561 bytes
fuente