[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[WitchTech 00026] SS!=DS 問題 (Re: [WitchFan 00036] Re: はじめまして)
- Subject: [WitchTech 00026] SS!=DS 問題 (Re: [WitchFan 00036] Re: はじめまして)
- From: Akira Kawamata <autumn@piedey.co.jp>
- Date: Wed, 19 Jul 2000 18:27:41 +0900
この話題、こちらに引っ越しました。
""c.mos" <c.mos@zob.ne.jp>"さんは書きました:
> そうなんですよ。とにかく SS!=DS 問題が、最初にぶちあたる壁です。
実は、16bit WindowsのDLLも、SS!=DSでした。
SS!=DS問題がややこしいのは、nearポインターが自動変数を示すことができな
い、という点にあります。そこで必要もないのにfarポインターを使って重くな
ったりしてました。
以下が解説。(c.mosさんは分かってると思いますが他の人のために)
func()
{
char c;
char * p; /* nearポインターとして */
c = 'A';
p = &c; /* ここで問題発生! */
putc( *p );
}
&cのセグメントはssなのに、pはセグメント情報を格納せず、dsと決め打ちし
てアクセスするから、*pは関係ないアドレスを指し示します。
アセンブラ的にいうと、bp間接のときは、ss:がデフォルトで、それ以外はds:
がデフォルトであるため、アクセスに使用するレジスタを変えるだけで、違うセ
グメントにアクセスしてしまう可能性がある。ということだったかなぁ。もう記
憶が薄い^^;
アセンブラで書けば、セグメントプリフィクスをオーバーライドするのも簡単
なんだけどなぁ。
と言うわけで、きっと、SS!=DSプログラミングの経験が無い人はこれを読んで
頭をかきむしっている頃でしょう(笑い)
(株)ピーデー 川俣 晶 (http://www.autumn.org/ mailto:autumn@piedey.co.jp)
ML Archives