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

[WitchTech 00573] Re: TC++1 の setargv のこと



おおくぼです。

いろいろ調べ回った末、WitchFan で同じハマリしてる人がすでに居ました。

> >        extrn   __setargv__:far
> これってコマンドライン引数の解析用のライブラリ関数では
> ないかと思うのですが・・・

そのとおりでした。

http://www.wonderwitch.com/ml/archives/WitchFan/msg00390.html

にもありますが、main(int argc,char *argv[]) でなく main() とすれば
setargv は参照しなくなり(もともと呼んでもいないんですが) grep -v はし
なくてもよくなります。

ただ、

> Witch には無用だと思います。

まぁ大抵の場合には不要でしょうが、wwman2nd.pdf の p.69 (46/100) の

10.5.2 プロセス起動の流れ
4.コマンドラインパラメータの設定
ユーザプロセス用データ領域の空き部分にコマンドラインパラメータを設定します。

同じく p.159 (92/100)(「しおり」なしの PDF 配ってんじゃねーよ...) の

D.1 リモートシェル通信プロトコル仕様
exec <SP ><絶対パスファイル名>[<パラメータ>]<改行>
指定したファイル名のファイルを実行する(ファイルシステム上のコマンドを
先にサーチし、失敗した場合内部コマンドをサーチする)。

ということで、argv で値を受け渡すことは Witch でもありえます。

さらに調べると、またまた灯台下暗し、Turbo C 2.01 の配布物の中に

    SETARGV  ASM - Assembler source code for parsing the command line
    SETENVP  ASM - Assembler source code for preparing the environment

なんてものがありました。これもきっと DOS 用で Witch の argv にはそのま
までは使えないんでしょうが、参考にはなると思います。

C:\WWitch\src\tcc_rt\c0ww.asm 中で

; set argv starting position at heap start

とかある辺りと関係あるんでしょうけど、ようわからんので、この先は
「TC++1 で argv が実際に必要なプログラムを書くことになった人」に
お任せしたいな、と。

# リモートデバッガとかサウンド関係のソフトでそういうこと
# 既にやってる人もいたと思うんですけど、何でしたっけ?
# LSI-C では argv は使えてるんでしょうか?
# C:\WWitch\lsic86ww\lib\s\runtime.lib のソースって無いんですよね?
# って、じゃあ Turbo C 2.01 ではどうなんだろう。

ちょっと外れますけど、Simtel.net MS-DOS collection なるところに

setargv.c : Expand wildcard arguments : 09-Mar-88
allocaap.zip : alloca() for TC2.0 and TC++1.0 by Alex Pruss : 28-Aug-90

とかもありました。ワイルドカードはさすがにいらんなぁ。

もう一件、

> >       mov bx,registers[(KEYWORD_BX-KEYWORD_AX)*2]

> アセンブラというものはそういうものです。型の概念がない
> のでデスティネーションのサイズに関係なくアドレス計算は
> バイト単位で行われます。一応、基本だと思いますが・・・

Turbo Pascal & DOS2.01 の debug の A コマンド の経験はあるんですが 
MASM は触らずじまいだったので...(歳がばれる)

Borland C++ 5.0J のマニュアルによると
# BC++5 のマニュアルにあるだけで、同じことが TC++1 で
# できるかどうか確かめた訳ではないのですみません...

struct myStruct {
  int a_a;
  int a_b;
} myA;

asm { mov ax, myA.a_b }

と書いて a_b のアドレスはちゃんと解決されるそうなんですが、インデック
スが定数であっても配列のアドレッシングは決してそうならないのは一貫性に
欠けるんじゃないかと。

まぁ逆に、アセンブラ内でインデックスを計算して

mov bx,registers[DI]

とかやったとき、勝手に DI<<1 されるんでなく mov bx,[DI+_registers] に
なってくれる(アドレッシングモードはでたらめです)ということなんでしょう
か。構造体の要素の位置は解決するけど配列の*要素*は解決しない、と。

まだ何か誤解しているようでしたら突っ込んで下さい。

-- 
おおくぼ


ML Archives