Como exercício, criei uma solução simples para esse desafio, na linguagem Assembly x86. Estou executando isso com o FASM no Windows. Aqui está o meu código fonte:
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'
Ao compilar isso, obtenho um executável maior do que eu esperava. Aqui está um hexdump:
Percebo que há muito espaço vazio entre a seção de código e as seções de importação de dados e bibliotecas, bem como uma mensagem dizendo "Este programa não pode ser executado no modo DOS" incorporado no código. Como posso montar meu código-fonte em um arquivo pequeno, adequado para o Code Golf?
Como observação, sugestões de melhores maneiras de imprimir stdout
sem importar msvcrt
e ligar printf
são bem-vindas.
Respostas:
Dica bastante geral, mas
Use o formato de arquivo COM em vez do PE EXE.
O PE EXE possui algumas falhas, tornando o formato praticamente inútil no código-golfe. O primeiro é o alinhamento da imagem (o Windows não executa o arquivo EXE se não estiver alinhado corretamente) e o segundo é o tamanho do cabeçalho. Existem alguns fatores que não são tão importantes (dividindo o executável em seções).
As vantagens de usar o formato de arquivo COM (que é praticamente equivalente ao binário plano) são:
Revisei seu código para funcionar como binário plano. É simples:
O binário de saída tem apenas 32 bytes de tamanho. Acredito, é possível reduzir ainda mais o tamanho, mas este é apenas um ponto de partida.
Monte com
nasm -fbin file.asm -o file.com
. Observe que este exemplo foi criado para o NASM, mas você pode traduzi-lo livremente para o FASM e ele funcionará perfeitamente.fonte