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バイトです。基本的にはすべての答えと同じ2つのループを行いますが、コンソールへの印刷は少し難しく、基本的に文字をスタックにプッシュして逆に印刷し、(Linux固有の)syscallを作成して実際にそれらの文字を入れます標準出力に。
これを最適化して、1回の書き込み操作のみが実行され(高速!)、マジックナンバーが表示され(wow!)、syscallを実行する前に結果全体をスタックにプッシュするようにしました。誰が適切な終了コードを必要とするので、私も出口ルーチンを出しましたか?
これが私の最初と2番目のリンクです元のnasm構文での試行次に示します。
それを改善する方法について他の提案を持っている人を歓迎します。誰かが興味を持っている場合は、ロジックをより詳細に説明することもできます。
(また、すべての列を揃えるために余分なスペースを出力しませんが、それが必要な場合は、さらに数バイトのコストでロジックを配置できます)。
編集:余分なスペースを印刷するようになりました。レジスタを使用してかなりおかしなことをしているため、このプログラムを拡張する場合はおそらく不安定です。
forループ以外に何かをするつもりですか?やりがいのある(興味深い)部分はどこですか?