アセンブラ短歌」タグアーカイブ

IL でアセンブラ短歌

「アセンブラ短歌」は
五・七・五・七・七の三十一バイト(みそひとバイト)から成る機械語コードで
プログラムを書いてみるという近未来の文化的趣味であり,
近年, 国内のハッカー間で密かなブームが起きています.

http://kozos.jp/asm-tanka/

みむらです。
そんなわけで、詠んでみました。

.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 でフロー表示するとこんな感じ

image

まだまだ荒削り感がものすごいのですが、

短歌の字数になっていて、かつ 5文字部分は値代入になっています。

きっちり文字を出した後は ret して終了していて、プログラム的にはきれいかも。

でも、バイトコードとしてみたときに美しいかというと、うーん。

 

 

ちなみに、実行結果はこの通り。

image

 

・・・まぁ、香川ですし。

もう少し美しい短歌を詠みたいですね。