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

[WitchTech 00527] Re: ワンべぇ 0.04



 川俣です。

 "boots@estyle.ne.jp"さんは書きました:
> VC 用のスタートアップルーチンもつくられたのですね。
> これだけでも配布の価値があるような。
 使いたい人はどんどん使ってください。
 ただ、現時点では、ワンべぇを動かすには十分ですが、それ以外のソフトでも
正常に使えるかどうか検証されていませんので、単体で公開していません。
 ソースもワンべぇのアーカイブに入っているので、スタートアップコードの動
作検証も歓迎します。

> VC に切替えたのは C の開発環境の快適さからでしょう
> か、速度などの性能のためでしょうか。
 以下の問題が発生したから、というのが理由です。
 wonbe.cのentranceUI関数を書いている時に、

struct stat statbuf;

 に対するアクセスで問題が生じました。
 WWのTurbo C 2.0では、関数に渡すバッファはDS上に無いと動かないケースが
多いのですが、getentに渡す構造体は、なぜかSS上に確保しないと正常に動きま
せんでした。
 ところが、struct statは内部に文字列を保持するchar配列があるなど、構造
が複雑です。
 1文字単位でこの配列にアクセスするコードを書く場合、単純なプログラム
のときは動きます。実際に、WWのサンプルコードのlsなどは動いてます。
 ところが、プログラムが複雑になると動かなくなります。その理由を解析した
ところ、以下のことが分かりました。

・ 配列にアクセスするインデックスとなる変数がレジスタ変数のときは動く
  ([bp+arrayname+di]のようなコードになるがbpがベースなので、デフォルト
はSSになって動作する)

・ そうでないときはアドレス計算した上でbxを経由してアクセスするのでSS上
のデータにアクセスできない
  (bx経由は、DSがデフォルトなので)

・ つまり、変数の数が少ないときは、配列へのインデックスアクセスを行う変
数が高い確率でレジスタ変数に割り当てられるので、ラッキーにも動く。しかし、
変数が増えると、高い確率で動かなくなる。

 wonbe.cのentranceUI関数では、拡張子のチェックなど少し込み入った処理も
やりたかったし、SS != DS回避のために変なコードを埋め込むことでソースが読
みにくくなることにも限界を感じていたので、ぶち切れてVisual C++1.51を取り
出してきました。

 一応、registerキーワードで、明示的にレジスタ変数を設定するという選択も
あることを付記しておきます。ただ、registerキーワードは万能の薬ではなく、
ちょっと処理が込み入るとレジスタ変数を使ってもアクセス不能になります。

> #反応弾頭ミサイルってのがなんだか今風
 反応兵器といえば、某超時空要塞マクロスが本場ですが、既にレトロな領域に
入りつつある1980年代の作品ですよ〜^^;

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


ML Archives