[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 2636] Re: About NASM.



  こんにちは、川合です。


I.Tak. さんは 2001/12/09 13:41:31 の「[OSASK 2631] Re: About NAS
M.」で書きました:

>(注:行頭の.が消えたので書き加えました)

  すみません、ありがとうございます。

> そうです。NASMには高々2パスでしかない、という弱点があります。
>第1パスでコードのサイズを決定し、第2パスで実際に出力するそうです。
>そこを見たときにまだコードサイズが分かっていない場合は32ビットを
>仮定するので、そうなるのでしょう(説明書より)。

  なるほど。でも、ちょっと納得が行かないのは、

>>    MOV DWORD [FS:EBX+4],.l001 ; これはうまくいかない(disp32)
>>    MOV DWORD [FS:EBX+4],.l000 ; これはうまくいくのに(disp8)

ですね。これはどうみてもdisplacementが8bitに納まるって分かるのに
、なんでdisp32になってしまうんでしょうか?多分、チェック方法に手
抜きがあるんでしょう。

> 今はベータ版(V0.98.)なので将来は強化されるかも知れませんが……
>パスを増やすのは大変でしょうねえ……。

  そうでしょうねえ・・・。でも強化してほしいなあ。今の仕様はちょ
っと古くて不便です(僕にとってはかなりほしい機能です)。

> ASKAも最終的にはそういう計算をするはずですから、ASKAを強化する手も
>あります(^_-☆

  これはバイナリー出力型ASKAへ移行しようってことでしょうか?・・
・まあ確かにそれにまさる解決方法はありません(笑)。

> で、私がNASMの将来について知ってるのはこのくらいなのですが、普段
>使っている分、文法については色々言いたい事があります。

  はい、是非おっしゃってください(笑)。

>まず、endはいりません。それから、ORGはbinモード専用で、オリジン指定で

  おお、endはなくてもいいんですか?・・・じゃあ、nasmcnvで出力す
るのやめようかな・・・。

>しかないので、ORG 8 とするとファイルオフセット8まで埋まる、という
>ことはありません。そういう事をしたいなら、
>%define masmORG(a) times a-($-$$) nop
>という風にしなさいとあります。あと、COFFやobjではsegment文も使えます。

  ORGについては、僕も知っていました。また、segment文が使えるのも
光成さんのmandelのおかげで分かっていました。

> MASMについても(あまり知らないのですが)少し。masmcnvの説明書にいう
>「MASMは mov ax,csを長くする悪い癖がある」というのは誤りです。この
>命令には「eaxの上位16ビットを変えないでね」という含みがあります。
>mov eax,cs として「eax上位を変えてもいいよ」としないと、短くなりません。
>実際にMASMでも通りましたし、NASMでもこうなっています。

  そのようです。いつからかIA-32の仕様が変わったようです。i486の
頃は、MOV(AX,CS);にオペランドサイズオーバーライドプリフィクスを
付ける必要はないみたいに書かれていました。でも、昨日NASMをいろい
ろ試していたら上位bitはundefinedだと説明されていました。ちなみに
逆はどうなんでしょうか?MOV(DS,AX);もプリフィクスが必要なんです
か?(NASMは0x66が付きますが)。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/