[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[WitchTech 00418] Re: DS!=SS 対応コンパイラ?



 川俣です。

 "高橋 亮 <CQB04050@nifty.ne.jp>"さんは書きました:
> とはいえ、これでいいんでしょうか?
> どなたかアセンブラの読める方確認してもらえませんか?
 考えてみれば、アセンブラ分からない方が今は普通なんですね。
 アセンブラソース上でSS!=DS問題を確認するチェックポイントだけ説明します。

 自動変数をアクセスするコードで、
・ bpを使っている場合はアクセスできる
・ bp以外(bxなど)を使っている場合はアクセスできない(DSにアクセスしている)
・ bp以外(bxなど)を使っている場合でもss:が付いている場合はアクセスできる

 より詳しく説明すると。
 ss:は、次に記述された命令がメモリアクセスに使用するセグメントレジスタ
をSSに変更するという機能を持ったプリフィクスです。
 bp経由のアクセスではプリフィクスが無い場合SS経由ですので、自動変数に正
常にアクセスできます。
 bx経由のアクセスではプリフィクスが無い場合DS経由なので、自動変数へのア
クセスは正常にできません。しかし、ss:を付けるとSS経由になるので、自動変
数へのアクセスが可能になります。

 なぜ、bp以外を経由して自動変数にアクセスするコードが生成されるかという
と、主にアクセスするアドレスを計算する必要が生じるためです。
 bpは、自動変数の基本となるアドレスを保持する必要があるため、計算に使用
することができません。(使用すると値が変わってしまうから)。いちいち保存と
復帰をするぐらいなら、他のレジスタ(たとえばbx)を使って計算する方が効率が
良いのです。その結果、bxを使ってアクセスするといったコードが生成され、自
動変数へのアクセスが失敗します。
 これが、単純変数の自動変数は使えるのに、配列変数は使えない理由となりま
す。
 これを回避する方法としては、bxなどを使ってアクセスするコードに、ss:を
付ければ良いことになります。
 TurboC++の出力コードは、まさに、そのような対処を行っているものですから、
これは正常に動作すると考えて良いと思います。

(株)ピーデー 川俣 晶 (http://www.autumn.org/ mailto:autumn@piedey.co.jp)



ML Archives