Comme exercice, j'ai créé une solution simple pour ce défi, en langage d'assemblage x86. J'exécute cela avec FASM sur Windows. Voici mon code source:
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'
Lorsque je compile ceci, j'obtiens un exécutable plus grand que prévu. Voici un hexdump:
Je remarque qu'il y a beaucoup d'espace vide entre la section de code et les sections d'importation de données et de bibliothèque, ainsi qu'un message disant "Ce programme ne peut pas être exécuté en mode DOS" incorporé dans le code. Comment assembler mon code source dans un petit fichier adapté à Code Golf?
En guise de remarque, les suggestions de meilleures façons d'imprimer stdout
sans importer msvcrt
ni appeler printf
sont les bienvenues.
Réponses:
Astuce assez générale, mais
Utilisez le format de fichier COM au lieu de PE EXE.
PE EXE a quelques défauts rendant le format pratiquement inutile dans le code-golf. Le premier est l'alignement de l'image (Windows n'exécutera pas le fichier EXE s'il n'est pas correctement aligné), et le second est la taille de l'en-tête. Il y a quelques facteurs qui ne sont pas si importants (diviser l'exécutable en sections).
Les avantages de l'utilisation du format de fichier COM (qui est à peu près équivalent au binaire plat) sont les suivants:
J'ai révisé votre code pour qu'il fonctionne en binaire plat. C'est très simple:
Le binaire de sortie ne fait que 32 octets. Je pense qu'il est possible de réduire encore la taille, mais ce n'est qu'un point de départ.
Assemblez avec
nasm -fbin file.asm -o file.com
. Remarque, cet exemple a été fait pour NASM, mais vous pouvez le traduire librement en FASM, et cela fonctionnera parfaitement.la source