読者です 読者をやめる 読者になる 読者になる

『第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) のコードは、さほどトリッキーなことはしていません。気を付けた点としては、

  • int 80h で \ を使うので、他では使わないようにした。
  • 同じレジスタを2つデクリメントする代わりに、別々のレジスタで1回ずつ dec するようにした。

といった程度です。しかし、文法上どうしても ` を2回使ってしまうため、文字数に対する乗率が2になってしまうことが避けられません。 Perl (57) よりこちらのほうが文字数は少ないのですが、大きさでは上回ってしまいます。

参考にしたもの

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