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

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



 川俣です。

> ということで、どなたか試してみませんか?
> タイニィモデル(.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