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

[WitchTech 00026] SS!=DS 問題 (Re: [WitchFan 00036] Re: はじめまして)



 この話題、こちらに引っ越しました。

 ""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