fundo
Existem .ZIP
arquivos de extração automática . Normalmente eles têm a extensão .EXE
(e, executando o arquivo, eles serão extraídos), mas ao renomeá-los .ZIP
, você pode abrir o arquivo com algum software de extração ZIP.
(Isso é possível porque os .EXE
arquivos exigem um determinado cabeçalho, mas os .ZIP
arquivos exigem um determinado trailer, portanto, é possível criar um arquivo que tenha um .EXE
cabeçalho e um .ZIP
trailer.)
Sua tarefa:
Crie um programa que crie arquivos de imagem "auto-exibidos":
- O programa terá uma imagem de 64x64 (pelo menos 4 cores serão suportadas) como entrada e algum arquivo "combinado" como saída
- O arquivo de saída do programa deve ser reconhecido como arquivo de imagem pelos visualizadores de imagens comuns
- Ao abrir o arquivo de saída com o visualizador de imagens, a imagem de entrada será exibida
O arquivo de saída também deve ser reconhecido como arquivo executável para qualquer sistema operacional ou tipo de computador
(Se um arquivo para um sistema operacional ou computador incomum for produzido, seria bom que exista um emulador de PC de código aberto. No entanto, isso não é necessário.)
- Ao executar o arquivo de saída, a imagem de entrada também deve ser exibida
- É provável que seja necessário renomear o arquivo (por exemplo, de
.PNG
para.COM
) - Não é necessário que o programa e seu arquivo de saída sejam executados no mesmo sistema operacional; o programa pode, por exemplo, ser um programa do Windows e arquivos de saída que podem ser executados em um Commodore C64.
Critério de vitória
- O programa que produz o menor arquivo de saída ganha
- Se o tamanho do arquivo de saída diferir dependendo da imagem de entrada (por exemplo, porque o programa compacta a imagem), o maior arquivo de saída possível criado pelo programa representando uma imagem de 64x64 com até 4 cores contadas
A propósito
Tive a ideia do seguinte quebra-cabeça de programação ao ler esta pergunta no StackOverflow.
fonte
.exe
parte do desafio e, ao vê-lo como um,.png
existem pixels modificados com base nesse.exe
código. Isso é permitido desde que ainda.png
possamos ver? A imagem de saída também precisa ter pelo menos 4 cores?Respostas:
8086 arquivo .COM do MS-DOS / BMP, tamanho do arquivo de saída = 2192 bytes
Codificador
O codificador está escrito em C. São necessários dois argumentos: arquivo de entrada e arquivo de saída. O arquivo de entrada é uma imagem RGB RAW de 64x64 (o que significa que são simplesmente 4096 trigêmeos RGB). O número de cores é limitado a 4, para que a paleta possa ser a menor possível. É muito direto em suas ações; apenas constrói uma paleta, empacota pares de pixels em bytes e cola-a junto com cabeçalhos pré-fabricados e o programa decodificador.
Arquivo de saída
O arquivo de saída é um arquivo BMP que pode ser renomeado como .COM e executado em um ambiente DOS. Após a execução, ele muda para o modo de vídeo 13h e exibe a imagem.
Um arquivo BMP possui um primeiro cabeçalho BITMAPFILEHEADER, que contém, entre outras coisas, o campo ImageOffset, que indica onde o arquivo começa os dados da imagem. Depois disso, vem o BITMAPINFOHEADER com várias informações de decodificação / codificação, seguidas por uma paleta, se houver. O ImageOffset pode ter um valor que aponte além do final de qualquer cabeçalho, permitindo abrir um espaço para o decodificador residir. Aproximadamente:
Outro problema é inserir o decodificador. O BITMAPFILEHEADER e o BITMAPINFOHEADER podem ser modificados para garantir que sejam códigos de máquina legais (que não produzem um estado não recuperável), mas a paleta é mais complicada. É claro que poderíamos ter aumentado artificialmente a paleta e colocado o código da máquina, mas optei por usar os campos biXPelsPerMeter e biYPelsPerMeter, o primeiro para alinhar o código corretamente e o segundo para pular no decodificador. É claro que esses campos terão lixo, mas qualquer visualizador de imagens que eu testei exibe a imagem com precisão. A impressão pode produzir resultados peculiares, no entanto.
É, até onde eu sei, compatível com os padrões.
Pode-se criar um arquivo mais curto se a
JMP
instrução for colocada em um dos campos reservados em BITMAPFILEHEADER. Isso nos permitiria armazenar a altura da imagem como -64 em vez de 64, o que no país das maravilhas mágico dos arquivos BMP significa que os dados da imagem são armazenados da maneira correta, o que, por sua vez, permitiria um decodificador simplificado.Decodificador
Não há truques específicos no decodificador. A paleta é preenchida pelo codificador e mostrada aqui com valores dummy. Poderia ser um pouco mais curto se não retornasse ao DOS com o pressionamento de uma tecla, mas não foi divertido testar sem isso. Se achar necessário, você pode substituir as três últimas instruções por
jmp $
para salvar alguns bytes. (Não esqueça de atualizar os cabeçalhos de arquivo, se você o fizer!)O BMP armazena paletas como trigêmeos BGR ( não RGB), preenchidos com zeros. Isso torna a configuração da paleta VGA mais irritante do que o normal. O fato de as BMPs serem armazenadas de cabeça para baixo apenas aumenta o sabor (e o tamanho).
Listados aqui no estilo NASM:
fonte
int 0x20
maisret
.