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

[WitchTech 00838] Re: DMC の環境設定



きゆきです。

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