code machine x86_64 (linux), 175 99 76 octets
0000000000400080 <_start>:
400080: 66 bf 09 00 mov $0x9,%di
0000000000400084 <_table.L2>:
400084: 6a 0a pushq $0xa
400086: 89 fe mov %edi,%esi
0000000000400088 <_table.L3>:
400088: 89 f0 mov %esi,%eax
40008a: f7 e7 mul %edi
000000000040008c <_printInteger>:
40008c: 6a 20 pushq $0x20
40008e: 3c 0a cmp $0xa,%al
400090: 7d 02 jge 400094 <_printInteger.L1>
400092: 6a 20 pushq $0x20
0000000000400094 <_printInteger.L1>:
400094: 66 31 d2 xor %dx,%dx
400097: b3 0a mov $0xa,%bl
400099: 66 f7 f3 div %bx
40009c: 83 c2 30 add $0x30,%edx
40009f: 52 push %rdx
4000a0: 66 85 c0 test %ax,%ax
4000a3: 75 ef jne 400094 <_printInteger.L1>
4000a5: 6a 3d pushq $0x3d
4000a7: 66 57 push %di
4000a9: 80 04 24 30 addb $0x30,(%rsp)
4000ad: 6a 78 pushq $0x78
4000af: 66 56 push %si
4000b1: 80 04 24 30 addb $0x30,(%rsp)
4000b5: ff ce dec %esi
4000b7: 75 cf jne 400088 <_table.L3>
4000b9: ff cf dec %edi
4000bb: 75 c7 jne 400084 <_table.L2>
00000000004000bd <_printChars>:
4000bd: 66 ba 00 08 mov $0x800,%dx
4000c1: b0 01 mov $0x1,%al
4000c3: 66 bf 01 00 mov $0x1,%di
4000c7: 48 89 e6 mov %rsp,%rsi
4000ca: 0f 05 syscall
Il s'agit d'un vidage du fichier binaire, et tout cela fait 175 octets. Il fait essentiellement les deux mêmes boucles que toutes les réponses, mais l'impression sur la console est un peu plus difficile et nécessite essentiellement de pousser les caractères pour imprimer sur la pile à l'envers, puis de faire un appel système (spécifique à Linux) pour réellement mettre ces caractères en stdout.
J'ai maintenant optimisé cela afin qu'une seule opération d'écriture soit effectuée (plus vite!) Et ait des nombres magiques (wow!) Et en poussant le résultat entier sur la pile en arrière avant de faire l'appel système. J'ai également supprimé la routine de sortie, car qui a besoin d'un code de sortie approprié?
Voici un lien vers mes première et deuxième tentatives, dans leur syntaxe nasm d'origine.
Je souhaite la bienvenue à tous ceux qui ont d'autres suggestions sur la façon de l'améliorer. Je peux également expliquer la logique plus en détail si quelqu'un est curieux.
(En outre, il n'imprime pas les espaces supplémentaires pour aligner toutes les colonnes, mais si cela est nécessaire, je peux mettre la logique au prix de quelques octets supplémentaires).
EDIT: Imprime maintenant des espaces supplémentaires et est encore plus golfé! Il fait des trucs assez fous avec les registres, et est probablement instable si ce programme devait être étendu.
for
boucles? Où est la partie difficile (intéressante)?