Kod maszynowy x86_64 (Linux), 175 99 76 bajtów
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
To zrzut pliku binarnego, a wszystko to 175 bajtów. Zasadniczo wykonuje te same dwie pętle, co wszystkie odpowiedzi, ale drukowanie na konsoli jest nieco trudniejsze i w zasadzie wymaga wypychania znaków do drukowania na stosie w odwrotnej kolejności, a następnie wykonania wywołania systemowego (specyficznego dla systemu Linux), aby faktycznie umieścić te znaki na standardowe wyjście.
Zoptymalizowałem to teraz, aby wykonać tylko 1 operację zapisu (szybciej!) I mieć magiczne liczby (wow!) I pchając cały wynik do stosu do tyłu przed wykonaniem połączenia systemowego. Wyjąłem również procedurę wyjścia, bo kto potrzebuje odpowiedniego kodu wyjścia?
Oto link do mojego pierwszego i drugiego próby w oryginalnej składni nasm.
Z zadowoleniem przyjmuję każdego, kto ma inne sugestie dotyczące tego, jak można to poprawić. Mogę również wyjaśnić logikę bardziej szczegółowo, jeśli ktoś jest ciekawy.
(Ponadto nie drukuje dodatkowych spacji, aby wyrównać wszystkie kolumny, ale jeśli jest to wymagane, mogę umieścić logikę kosztem kilku dodatkowych bajtów).
EDYCJA: Teraz drukuje dodatkowe miejsca i jest jeszcze bardziej golfa! Robi całkiem szalone rzeczy z rejestrami i jest prawdopodobnie niestabilny, gdyby ten program został rozszerzony.
forpętlami? Gdzie jest trudna (interesująca) część?