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

[WitchTech 00306] Re: LSI-CforWitch の関数ポインタ



検証ありがとうございます。
なるほど、関数を前方参照する場合は、コード生成する段階で関数が
自分と同じセグメントにあるかどうかわからないので、
call far を push cs/call near に置き換えませんね。
far 関数は、呼び出す前に定義するか static で指定することになりますね。
(この場合のみ far 関数の参照は機能する)
同じモジュールにある関数を far で呼び出すことにどういう意味があるのかは、
たしかに疑問ですが^_^;
別のモジュールにあるのなら、川俣さんの示したとおり _CS を使って明示的に
コードセグメントを参照させることになりますね。

まあ、long演算と構造体コピーができるというだけでも価値ある結果でしょう:-)

大野

Akira Kawamata wrote:
> 
>  川俣です。
> 
> > ということで、どなたか試してみませんか?
> > タイニィモデル(.COM)は、いわゆるセグメントリロケーションがないので
> > far 呼び出しも push cs/call near に置き換えられます。
>  これも含めて更に試してみました。
>  ちょっと長くなりますが、テストプログラムのmakefileと、リンク情報のrsp
> ファイルも一緒に付けます。
>  要するに、-msを-mtに変更しsmallモデルからtinyモデルに変更し、Turbo-Cの
> ヘルパ関数をリンクできるように、CS.LIBをライブラリの最後に追加しています。
> (注:Turbo-Cではtinyモデルでもsmallモデルのライブラリを使うのでCS.LIBを指
> 定する。CT.LIBは存在しない)
>  下記プログラムの実行結果は、
> 00000181 9DE00181 2 6
>  となります。
>  これは、以下のことを意味します。
> ・ far関数のアドレスをfar関数ポインタへ代入するコードはtinyモデルでも動
> 作していない(CSを参照するコードは吐いてくれない)
> ・ far関数への直接呼び出しは成功している(call farからpush cs, call near
> に変わった)
> ・ far関数であるlongのかけ算も正常に呼び出すことに成功している。
> 
>  というわけで。
>  この実験の結果としては。
> ・ WonderWitchではfarアドレスに対する静的な参照はすべて機能しない
> ・ 動的に実行時にfarポインタを得る場合は、OSから直接値をもらうか、ある
> いは、セグメントレジスタの値を参照してアドレスのセグメント値を得なければ
> ならない
> ・ 上記の条件からコードセグメントを複数持つことはできない(正しい?)
> ・ Turbo-Cのlongのかけ算に関しては、tinyモデルを指定してcs.libを最後(重
> 要!)にリンクすることで解決できる(確実?)
> ・ 一般論としてtinyモデルを使うとfar関数への直接呼び出しは可能になるが
> 同じセグメントに属する関数しか呼べないので(push cs, call nearになるから)、
> それにどのような意味があるのかは不明。
> 
> ---------------------b002.c---------------------------------------
> #include <sys/bios.h>
> #include <stdio.h>
> 
> char (far *tmp_func)(int no);
> 
> char far t1(int no);
> 
> void main() {
>         static char str[32];
>         unsigned int cs,ip;
>         unsigned long target;
>         int n;
>         long m1,m2,m3;
> 
>         cs = _CS;
>         ip = (unsigned int)t1;
>         target = ((unsigned long)cs << 16L) | (unsigned long)ip;
> 
>         text_screen_init();
>         text_put_string(0, 0, "start");
> 
>         /* far呼び出しのテスト */
>         n = t1(1);
> 
>         /* longかけ算テスト */
>         m1 = 2L;
>         m2 = 3L;
>         m3 = m1 * m2;
> 
>         tmp_func = t1;
>         sprintf(str, "%08lx %08lx %d %ld", tmp_func, target,n,m3);
>         text_put_string(0, 1, str);
> 
>         while(1)
>                 if(key_press_check() == KEY_START)
>                         break;
> }
> 
> char far t1(int no) {
>         return no + 1;
> }
> ---------------------b002.c---------------------------------------
> 
> ---------------------libww.rsp--------------------------------------
> ..\common\libww.lib ..\common\runtime.lib C:\VSHARE\WW\TC\LIB\CS.LIB
> ---------------------libww.rsp---------------------------------------
> 
> ---------------------makefile---------------------------------------
> # start up routine
> C0WW_JAPANESE2=..\common\c0wwjpn2.obj
> 
> C0WW=$(C0WW_JAPANESE2)
> 
> LIBWW=@..\common\libww.rsp
> 
> CFLAGS=-mt -zPCGROUP -zSDGROUP -zGDGROUP -w
> 
> all:    b002.fx
> 
> b002.fx:        b002.bin
>         mkfent b002.cf
> 
> b002.bin:       b002.obj
>         tlink /m /c $(C0WW) b002, b002, b002, $(LIBWW)
>         exe2fbin b002.exe b002.bin
> 
> b002.obj:       b002.c
>         tcc -c $(CFLAGS) $(DEFINES) -IC:\vshare\ww\dev\WWitch\include b002.c
> ---------------------makefile---------------------------------------
> 
> (株)ピーデー 川俣 晶 (http://www.autumn.org/ mailto:autumn@piedey.co.jp)


ML Archives