[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[WitchTech 00838] Re: DMC の環境設定
- Subject: [WitchTech 00838] Re: DMC の環境設定
- From: sakura@tennodai.com
- Date: Mon, 02 Jul 2001 00:33:30 +0900 (JST)
きゆきです。
wanderer> _heap の値は他の部分で参照される前なら、書き換えても問題ないと
wanderer> 思いますが、その前にDMCでコンパイルしたプログラムって _heap 直後の
wanderer> アドレスが勝手にゼロで上書されませんか?
sakura> どのタイミングでゼロクリアされるようなんでしょうか? wwalloc では、
sakura> _heap 直後のアドレスに配置されるのは、operator new 用に予め確保した
sakura> メモリのバイト数なので、main() を呼び出し、WwAlloc::initialize() を
sakura> 実行した後にこの場所がゼロクリアされると致命的です。
$(WW)/src/dmc_rt/ctww.asm と obj2asm の結果や *.map を見比べていると、
以下の2つのセグメントがありますが、
CONST segment word public 'CONST'
c_common segment word public 'BSS'
このままのスタートアップを使うと、これらがどうも
_HEAP segment para public 'BSS'
heap_start:
_HEAP ends
よりも後に配置されてしまうように見えます。
CONST と c_common にどのようなデータが入るのかわかりませんが、もし
これらが _HEAP よりも後に配置されるとなると、CONST や c_common 内の
変数に値が代入されれば _heap 直後のアドレスのデータが破壊されますね。
私のところでは、ゼロクリア現象が起きていないので何とも言えないのですが。
ゼロクリア現象が起きたときの *.map ファイルを見ていただいて、CONST や
c_common にデータがあるか、これらが _HEAP よりも後に配置されているかを
確認し、スタートアップを書き換えてアセンブルして、など、できましたら、
試してみていただけないでしょうか。
私は以下のようにしました。tasm32 を使うと CONST が予約語だという
警告は出ますが、アセンブルはできます。
> tasm32 /s /ml /dDISPLAY_MODE_JAPANESE1 ctww.asm, ctwwjpn2.obj
こうしてリンクすると、少なくとも *.map の出力を見る限りでは、_HEAP セグメントが
一番後に配置されるようです。
といっても、もう10年以上前のアセンブラの知識なので、どの程度正しいのか
自信がありませんが…
~/ww> diff -c3 /mnt/c/WWitch/src/dmc_rt/ctww.asm ctww.asm
*** /mnt/c/WWitch/src/dmc_rt/ctww.asm Tue May 22 16:03:02 2001
--- ctww.asm Mon Jul 2 00:17:15 2001
***************
*** 90,95 ****
--- 90,98 ----
DATA segment para public 'DATA' ; for LSI-C
DATA ends
+ CONST segment word public 'CONST' ; for DMC
+ CONST ends
+
BSS segment word public 'DATA' ; for LSI-C
bss_start:
BSS ends
***************
*** 97,108 ****
_BSS segment word public 'BSS' ; for TurboC
_BSS ends
_HEAP segment para public 'BSS'
heap_start:
_HEAP ends
CGROUP group _TEXT, TEXT
! DGROUP group _DATA, DATA, BSS, _BSS, _HEAP
assume cs:CGROUP, ds:DGROUP, es:DGROUP
--- 100,114 ----
_BSS segment word public 'BSS' ; for TurboC
_BSS ends
+ c_common segment word public 'BSS' ; for DMC
+ c_common ends
+
_HEAP segment para public 'BSS'
heap_start:
_HEAP ends
CGROUP group _TEXT, TEXT
! DGROUP group _DATA, DATA, CONST, BSS, _BSS, c_common, _HEAP
assume cs:CGROUP, ds:DGROUP, es:DGROUP
~/ww>
--
sakura@tennodai.com
ML Archives