codice macchina x86_64 (linux), 175 99 76 byte
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
Questo è un dump del file binario e tutto questo è di 175 byte. Praticamente fa gli stessi due loop che fanno tutte le risposte, ma stampare sulla console è un po 'più difficile e in pratica richiede di spingere i personaggi per stampare in pila al contrario, e quindi fare un syscall (specifico per Linux) per mettere effettivamente quei caratteri in stdout.
Ora l'ho ottimizzato in modo che venga eseguita solo 1 operazione di scrittura (più veloce!) E abbia numeri magici (wow!) E spingendo l'intero risultato sullo stack all'indietro prima di creare il syscall. Ho anche eliminato la routine di uscita perché chi ha bisogno di un codice di uscita adeguato?
Ecco un link al mio primo e secondo tentativo, nella loro sintassi nasm originale.
Accolgo con favore chiunque abbia altri suggerimenti su come migliorarlo. Posso anche spiegare la logica in modo più dettagliato se qualcuno è curioso.
(Inoltre, non stampa gli spazi extra per allineare tutte le colonne, ma se è necessario posso inserire la logica al costo di qualche byte in più).
EDIT: ora stampa spazi extra ed è ancora più basso! Sta facendo cose piuttosto folli con i registri ed è probabilmente instabile se questo programma dovesse essere ampliato.
forloop? Dov'è la parte stimolante (interessante)?