『第4回デスマコロシアム』私の nasm (72)
はじめに
『第4回デスマコロシアム』で、途中で提出した nasm (72) のコードです。途中集計の最終回の直前まで、このコードが単独で全言語最小でした。しかし、 Perl に抜かれる可能性があったため、自ら Perl (57) を提出し、この nasm のコードはお蔵入りとなりました。結局、 nasm (72) に naoki_kp さんが並びましたが、 Perl (57) を提出せずとも、この nasm (72) でも最小賞が取れていたようです。
コード
db`BCTYv MU_OW]^j$ば~,z\u340X)蔔P<tqあ`
機械語のバイトコードを直接文字コードで表現したものです。 v と M の間は TAB 文字です。
ソース
このコードのソースは、次の通りです。左の列がアセンブラのソース、中央がバイトコード(16進)、右が文字表現です。
inc edx ; 42 ; B
inc ebx ; 43 ; C
push esp ; 54 ; T
pop ecx ; 59 ; Y
L1:
jbe L2 ; 76 09 ; v[TAB]
dec ebp ; 4d ; M
push ebp ; 55 ; U
pop edi ; 5f ; _
dec edi ; 4f ; O
push edi ; 57 ; W
pop ebp ; 5d ; ]
pop esi ; 5e ; ^
push 36 ; 6a 24 ; j$
L2:
jnecx L2-126 ; e3 81 ; ば
mov al,7eh ; b0 7e ; ~
sub al,7ah ; 2c 7a ; ,z
int 80h ; cd 80 ; \u340
pop eax ; 58 ; X
sub eax,ebp ; 29 e8 ; )蔔
xchg eax,esp ; 94 ;
xchg eax,esp ; 94 ;
push eax ; 50 ; P
cmp al,116 ; 3c 74 ; <t
jno L1 ; 71 e3 ; qあ
db 81h,82h ; 81 82 ;
解説
Perl (57) のコードと違って、この nasm (72) のコードは、さほどトリッキーなことはしていません。気を付けた点としては、
といった程度です。しかし、文法上どうしても `
を2回使ってしまうため、文字数に対する乗率が2になってしまうことが避けられません。 Perl (57) よりこちらのほうが文字数は少ないのですが、大きさでは上回ってしまいます。
tailsさんのnasm(72) 終了条件がわからなくてしばらく悩んでたけど、Oフラグで終了判定ができるのに気づいて芸術を感じた。1判定3分岐ヤバイ。 #デスマコロシアム
— 冷凍あざらし@C++チョットデキナイ (@naoki_kp) 2014, 7月 5
参考にしたもの
1.インテル:日本語技術資料のダウンロード:IA-32 アーキテクチャー
http://www.intel.co.jp/content/www/jp/ja/developer/download.html#ia32
特に「中巻 A」「中巻 B」は必須でした。
2.命令コード表
http://dl.dropboxusercontent.com/u/2476414/TechResources/x86_opcodemap_1_a4.pdf
『ハンド (逆) アセンブルのための x86 ニーモニックの覚え方』
http://d.hatena.ne.jp/a4lg/20120225/1330180431
に掲載されているものを使わせていただきました。ありがとうございます。これをプリントして、6日間ひたすら眺めていたら、妻に怪訝な顔をされましたw