「アセンブラ短歌」は
五・七・五・七・七の三十一バイト(みそひとバイト)から成る機械語コードで
プログラムを書いてみるという近未来の文化的趣味であり,
近年, 国内のハッカー間で密かなブームが起きています.
みむらです。
そんなわけで、詠んでみました。
.assembly extern mscorlib {} .assembly tanka {} .method static void Main() cil managed { .entrypoint .locals init(unsigned int32) ldc.i4 0x9369464A stloc.0 Write: ldloc.0 ldc.i4.m1 ldc.i4.8 shl not and ldc.i4 0x3000 add call void [mscorlib]System.Console::Write(char) ldloc.0 ldc.i4.8 shr.un stloc.0 ldloc.0 brtrue.s Write ret }
コンパイルするとこんな感じ。
20 4A 46 69 93
0A 06 15 1E 62 66 5F
20 00 30 00 00
58 28 01 00 00 0A 06
1E 64 0A 06 2D E8 2A
解説としては次のような感じになります:
20 4A 46 69 93 | ldc.i4 0x9369464A |
0A 06 15 1E 62 66 5F | stloc.0 ldloc.0 ldc.i4.m1 ldc.i4.8 shl not and |
20 00 30 00 00 | ldc.i4 0x3000 |
58 28 01 00 00 0A 06 | add call void [mscorlib]System.Console::Write(char) ldloc.0 |
1E 64 0A 06 2D E8 2A | ldc.i4.8 shr.un stloc.0 ldloc.0 brtrue.s Write ret |
0x9369464A を入れて
1バイトごと切り出して、
0x3000 を入れて、
加算して Unicode 文字として出力
ビットシフトしたのち、 NULL なら ret して終了。
というような感じです。
IDA Pro でフロー表示するとこんな感じ
まだまだ荒削り感がものすごいのですが、
短歌の字数になっていて、かつ 5文字部分は値代入になっています。
きっちり文字を出した後は ret して終了していて、プログラム的にはきれいかも。
でも、バイトコードとしてみたときに美しいかというと、うーん。
ちなみに、実行結果はこの通り。
・・・まぁ、香川ですし。
もう少し美しい短歌を詠みたいですね。