машинный код x86_64 (linux), 175 99 76 байт
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
Это дамп двоичного файла, и все это составляет 175 байтов. По сути, он выполняет те же два цикла, что и все ответы, но печать на консоль немного сложнее и, в основном, требует нажатия символов для печати в стек в обратном порядке, а затем создания (специфичного для Linux) системного вызова для фактического размещения этих символов. в стандартный вывод.
Я теперь оптимизировал это так, чтобы только 1 операция записи выполнялась (быстрее!) И имела магические числа (вау!) И помещала весь результат в стек назад перед выполнением системного вызова. Я также вынул процедуру выхода, потому что кому нужен правильный код выхода?
Вот ссылка на мой первый и второй попытки в их оригинальном синтаксисе.
Я приветствую всех, кто имеет какие-либо другие предложения о том, как это можно улучшить. Я также могу объяснить логику более подробно, если кому-то интересно.
(Кроме того, он не печатает лишние пробелы, чтобы выровнять все столбцы, но если это необходимо, я могу добавить логику за счет еще нескольких байтов).
РЕДАКТИРОВАТЬ: Теперь печатает дополнительные пробелы и еще больше! Он делает довольно сумасшедшие вещи с регистрами и, вероятно, нестабилен, если эту программу расширить.
for
петель? Где сложная (интересная) часть?