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

[WitchTech 00427] Re: DS!=SS 対応コンパイラ?



高橋です、どうも。

> 
> なるなると申します。
> 
>  >  TurboC++の出力コードは、まさに、そのような対処を行っているものですから
、
>  > これは正常に動作すると考えて良いと思います。
> 
> そのとおりなんですが、ポインタは依然として near ですから、(「これでいいん
> でしょうか ?」っていうような話だと) まだまだはまる余地は残っているような気
> がします。
> 
> こんなのどうでしょう ? > 元記事の方

試してみました。
DS!=CSでコンパイルしたときのみ以下の警告がでました。

Suspicious pointer conversion
問題のあるポインタの変換

だそうです。実行してみても正しい値はでません。
一応その部分を抜き出してみました。
生成されたコードはDS!=SSオプションに関わらず同じです。
;  main()
; val = foo(height(buf), buf);
;	
  lea  ax,word ptr [bp-4]
  push ax
  mov  ax,4
  push ax
  call near ptr CGROUP:_foo
  pop  cx
  pop  cx
  mov  si,ax

; int foo(int n, char buf[])	
;  while (n-- > 0) {
;     tmp += *buf++;
;	
  mov  al,byte ptr [di]
  cbw	
  add  si,ax
  inc  di

C言語ソース
http://homepage2.nifty.com/amenity/sample2.txt
生成されたコード
http://homepage2.nifty.com/amenity/sample2a.txt

川俣さんのおかげでアセンブラの読解力がついたので読んでみます。
・・・だめですね。スタックへのポインタをfooへ渡しているのに
foo内でbyte ptr [di]としています。

結局このオプションでDS!=SSを無視できるわけではないようです。
ただ、この警告が出ることでDS!=SSではまる可能性が減るということでしょうか。

おかげさまでコンパイラのDS!=SSが何をしてくれるのかわかってきました。
ありがとうございます。


ML Archives