掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
レコード型の可変部分について (ID:43226)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
タルトさん、こんにちは。 Delphi2007でも同じ現象になったので、XE2とコンパイル結果を比較してみました。 Delphi2007では data.dWord := $FFFF ; で、定数$FFFFを一旦16ビットのSIレジスタにセットしたのを使いまわし Label1.Caption := IntToStr( data.dSmallInt ) ; この行のIntToStrを呼ぶときに movsx edi,si ←16ビットから32ビットへ符号付拡張 mox eax,edi ←拡張結果をIntToStrの引数(eaxレジスタ)にセット としていますが Label2.Caption := IntToStr( data.dWord ) ; この行でIntToStrを呼ぶときにも 先ほど32ビットへ拡張した結果を使いまわし mox eax,edi だけを実行しています。 つまり、符号付の32ビット整数をIntToStrに渡していることになります。 一方、XE2では Label2.Caption := IntToStr( data.dWord ) ; この行でIntToStrを呼ぶときに movzx eax,[ebp-$06] ;[ebp-$06]はdataの変数領域(2007とちょっと違い、変数領域から直接変換) と、movzx(16ビットから32ビットへ符号なし拡張)命令を使って 符号なし整数にしてから呼び出していました。 ですので、当然結果も-1でなく65535になるわけです。 で、なんでこの違いが出るのか比較してみたら 最適化を行うかどうかでこの違いが出ることが分かりました。 2007では最適化を行う設定になっていたので試しに 最適化のチェックをはずして再構築したところ 2007でも期待通りの結果になりました。(アセンブラでもmovzx命令が挿入されています) それではと、XE2で最適化をONにして再構築すると 望ましくない結果となりました。 アセンブラコードも2007と同じように、最初のLabel1.Captionへの代入のときに ediレジスタにmovsxで格納して、Label2.Captionへの代入のときにediレジスタを 使いまわすようになりました。 結論としては、Delphiの最適化の不具合のようです。 XE2ではデフォルトで最適化なしになっていたので期待通りの結果になっただけで Delphi2007(おそらくそれ以前のDelphi、もちろん4でも)では最適化がONになっていたため この不具合に遭遇したということではないでしょうか。 Delphi4でも最適化をしない設定にして再構築してみてください。 多分、期待通りの結果になるんではないかと思います。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.