カメヲラボ

主にプログラミングとお勉強全般について書いてます

機械語実験とペア・ショートコーディング

以前shinhさんがやってらした機械語埋め込みをしつつ、以前hinoeさんと激しく削りあった2008番
http://d.hatena.ne.jp/Ozy/20060406#p1
を改めて見直しながら2人であれこれと縮めていたら、当時では考えられない短さになりました。1人では絶対にたどり着かんなーという世界。

ところで、qsortに機械語を埋め込んで云々というのは当時「ほほー(゜□゜)スゴイ世界ですな!」と思っていただけなのですが、shinhさんに色々と教えてもらいつつハードディスクがガリガリゴリゴリ悲鳴を上げるコードを書くことはとっても楽しいんだ!ということに気付きました。

VCでコンパイルするとたまーに動く少し短いパターンとか見つかったのですが、qsortのコールバックとか、頻繁に呼び出されるようなコードだとダメですね。。VCコンパイラの場合は
http://d.hatena.ne.jp/shinichiro_h/20070124#1169569752
の文字列だと微妙にダメで、

     pop %ecx
     pop %eax
     pop %edx
     push %edx
     push %eax
     push %ecx
     mov (%eax),%eax
     sbb (%edx),%eax
     ret

なら動きました。しかしPKUにデータをSubmitすると、文字列にASCIIの\0を入れると何故かランタイムエラーになってしまうので、

     pop %eax
     pop %edx
     pop %ecx
     push %ecx
     push %edx
     push %eax
     mov (%edx),%eax
     sbb (%ecx),%eax
     ret

とすると\0を避けることができてGCCの場合と同じ長さで書くことができます。コールバック関数のreturnを省略する方法はGCCでなければうまく動きませんでしたが、これならCでもqsortを使った問題で大幅にコード短縮ができるのではないでしょうか。