16バイトの境界
abdev 10月 12th, 2005いゃ〜、昨日は早寝の予定だったのですが、とある一つの問題で、明け方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コンパイラの改良ができそうです。
明日は(株)びぎねっとさんと今後の開発について打ち合わせ。ホットウーロンでも入れて、最終作業をがんばりやす!
10月 13th, 2005 at 1時08分14秒
チューニングの観点では、データはそのサイズでアライメントする必要があります。今回のように動作しない命令は少ないのですが・・・64Bit化は大変な作業のようですね!がんばって下さい。