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

[OSASK 2631] Re: About NASM.



Hidemi さん、こんにちは。I.Tak. です。

Sat, 08 Dec 2001 14:15:33 -0000 の
[OSASK 2627] About NASM.
に返信です。

(注:行頭の.が消えたので書き加えました)
>g000:
>.l000
>    jc  .l001 ; これを8bitブランチにできない (MASMはできる)
>    jne .l000 ; これは8bitブランチになっている 
>    MOV DWORD [FS:EBX+4],.l001 ; これはうまくいかない(disp32)
>    MOV DWORD [FS:EBX+4],.l000 ; これはうまくいくのに(disp8)
>.l001
>end
>  どうやら、後ろの方で定義しているラベルを参照するときの取り扱い
>がかなり下手のようです。MASMやNWSAのように、ラベルの定義位置によ
>らず一番コンパクトなコードを自動的に選択してほしいのですが・・・

 そうです。NASMには高々2パスでしかない、という弱点があります。
第1パスでコードのサイズを決定し、第2パスで実際に出力するそうです。
そこを見たときにまだコードサイズが分かっていない場合は32ビットを
仮定するので、そうなるのでしょう(説明書より)。
 今はベータ版(V0.98.)なので将来は強化されるかも知れませんが……
パスを増やすのは大変でしょうねえ……。
 ASKAも最終的にはそういう計算をするはずですから、ASKAを強化する手も
あります(^_-☆

 で、私がNASMの将来について知ってるのはこのくらいなのですが、普段
使っている分、文法については色々言いたい事があります。
まず、endはいりません。それから、ORGはbinモード専用で、オリジン指定で
しかないので、ORG 8 とするとファイルオフセット8まで埋まる、という
ことはありません。そういう事をしたいなら、
%define masmORG(a) times a-($-$$) nop
という風にしなさいとあります。あと、COFFやobjではsegment文も使えます。

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

------------------------------------------------------------
I.Tak. <msy !Atmark! catvmics.ne.jp>
http://home1.catvmics.ne.jp/~msy/takhome.htm