[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