いゃ〜、昨日は早寝の予定だったのですが、とある一つの問題で、明け方3時過ぎまで作業をしてしまいました(汗)。

64コンパイラ試作版でMessageBox関数を呼び出すテストをしていたのですが、それが成功するときもあれば、失敗してしまうこともあるんです。どう失敗するのか、具体的に申しますと、MessageBox関数の内部処理のmovdqa命令の部分で停止しているんです。

movdqa oword ptr[rsp+0x160]

どうしてもここで停止してしまうんです。rsp+0x160が指し示すアドレス空間は、もちろん、違反になるような領域ではなく、任意で確保された新しいスタックフレームの領域なんです。

おいらはこの原因を、rspの値がおかしくなっていて、アクセス違反が起きたものだと早合点してしまい、数時間を無駄に過ごしてしまったというわけなのですが、ことの真相はそうではありませんでした。

owordってご存知ですか?皆さん。そう、それは128ビットを示す単語なんです。

  • word … 16ビット(単なるWord)
  • dword … 32ビット(Double Word)
  • qword … 64ビット(Quad Word)
  • oword … 128ビット(Octet Word)

明らかにrsp+0x160が指し示すアドレスが違反になるようなものでなかっため、天下のMS様が作られたVCに同じコードを吐かせたんです。

なーんだ、ABと同じコード吐いてるジャン。なんでエラーになんないのよ。

っと何度も問題となるコードを実行させていたら、とあることに気づいたんです。

それは、”movdqa oword ptr[rsp+0x160]” が実行されるとき、rspは必ず0x10で割り切れる数値になっておるんですね。oword ptrというくらいなのだから、128ビット境界(16バイト境界)にしなくちゃぁならんのでは・・・・・!?

案の定、おいらの勘は当たっていたようで、スタックフレームの確保部分で、rspを0x10で割り切れるように設定したら、この問題はすんなりと解決できたというわけです。

この問題のせいで、今日のおいらは寝不足でちょっと元気がなかったんす。

まぁ、こういう問題を色々とクリアしながら、おおよそのコードをコンパイルできるようになってきました。あとは、デバッガやライブラリを対応することですな。

64コンパイラの製作で培った技術は32コンパイラのそれを大幅に超えるため、様々なテクニックを用いて32コンパイラの改良ができそうです。

明日は(株)びぎねっとさんと今後の開発について打ち合わせ。ホットウーロンでも入れて、最終作業をがんばりやす!