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次写入操作(更快!)并具有幻数(哇!),并且在进行syscall之前将整个结果向后推入堆栈。我还退出了退出例程,因为谁需要适当的退出代码?
这是我的第一和第二个链接尝试,它们使用的是原始的nasm语法。
我欢迎任何对如何改进它有其他建议的人。如果有人好奇,我也可以更详细地解释逻辑。
(此外,它不会打印多余的空格以使所有列对齐,但是如果需要的话,我可以花更多的字节来放入逻辑)。
编辑:现在打印出额外的空间,并且向下打高尔夫球!它正在用寄存器做一些非常疯狂的事情,并且如果要扩展此程序,可能会不稳定。
for
循环外,有人真的要做什么吗?挑战(有趣)部分在哪里?