Como ejercicio, he creado una solución simple para este desafío, en x86 Assembly Language. Estoy ejecutando esto con FASM en Windows. Aquí está mi código fuente:
format PE console
entry start
include 'WIN32A.inc'
section '.text' code executable
start:
push char ; Start at 'A'
call [printf] ; Print the current letter 4 times
call [printf]
call [printf]
call [printf]
inc [char] ; Increment the letter
cmp [char], 'Z' ; Compare to 'Z'
jle start ; char <= 'Z' --> goto start
section 'r.data' data readable writeable
char db 'A', 10, 0 ; Stores the current letter
section '.idata' data readable import
library msvcrt, 'msvcrt.dll'
import msvcrt, printf, 'printf'
Cuando compilo esto, obtengo un ejecutable más grande de lo que esperaba. Aquí hay un hexdump:
Noté que hay mucho espacio vacío entre la sección de código y las secciones de importación de datos y biblioteca, así como un mensaje que dice "Este programa no se puede ejecutar en modo DOS" incrustado en el código. ¿Cómo puedo ensamblar mi código fuente en un archivo pequeño, adecuado para Code Golf?
Como nota al margen, las sugerencias sobre mejores formas de imprimir stdout
sin importar msvcrt
y llamar printf
son bienvenidas
Respuestas:
Un consejo bastante general, pero
Utilice el formato de archivo COM en lugar de PE EXE.
PE EXE tiene algunos defectos que hacen que el formato sea bastante inútil en code-golf. El primero es la alineación de la imagen (Windows no ejecutará el archivo EXE si no está alineado correctamente), y el segundo es el tamaño del encabezado. Hay algunos factores que no son tan importantes (dividir el ejecutable en secciones).
Las ventajas de usar el formato de archivo COM (que es más o menos equivalente al binario plano) son:
Revisé su código para que funcione como binario plano. Es muy simple:
El binario de salida tiene solo 32 bytes. Creo que es posible reducir aún más el tamaño, pero este es solo un punto de partida.
Montar con
nasm -fbin file.asm -o file.com
. Tenga en cuenta que este ejemplo se ha creado para NASM, pero puede traducirlo libremente a FASM y funcionará perfectamente.fuente