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

[OSASK 3575] Re: nask00a.



  こんにちは、川合です。


I.Tak. さんは 2002/04/17 14:14:48 の「[OSASK 3572] Re: nask00a.
」で書きました:

>  おひさしぶりの I.Tak.です。ようやく帰ってきました。

  NASKにあわせて帰ってきていただけるなんて、とても助かります。

>>  NASKでは、BITSを[]でくくらなければなりません。
>  これでも互換ソースは書けるのでしょうか?今手元にnasmが無いので分かり
>ませんが。

  はい、大丈夫です。NASMでも[BITS 32]は通ります。

>  BITS 32 を指定したときでもデフォルトは8086なのでしょうか?
>COFFを作るときでも8086なのでしょうか?

  ううう、確かにそれはなんとも情けない仕様でありますが、しかしデ
フォルトは8086のままです。基本的に、デフォルトに頼ることなく指定
してあげて下さい。手間のかかるアセンブラですみません。

>>    [EBP+EDX]のようなものでは、SSやDSが指定されていればプリフィックスを省略でき
>>  る方法を求めてどちらをベースにするか選びますし、そうでなければEDXをベースにし
>>  て、disp8の省略を狙います。
>  nasmでは先に書いた方にセグメントを合わせまして、[ebp+edx]と[edx+ebp]は
>違います。これも互換の妨げになりませんか?

  NASKでは、OPTIMIZEがOFFになっていると、以下のようになります。

     1 00000000                                 [BITS 32]
     2 00000000                                 ;%NASK	[INSTRSET "i386"]
     3 00000000                                 ;%NASK	[FORMAT "BIN"]
     4 00000000                                 ;%NASK	[OPTIMIZE 0]
     5 00000000                                 ;%NASK	[OPTION 1]
     6 00000000 F6 54 15 00                     NOT BYTE [EBP+EDX]
     7 00000004 F6 14 2A                        NOT BYTE [EDX+EBP]
     8 00000007 F6 54 15 00                     NOT BYTE [EDX*1+EBP]
     9 0000000B F6 14 2A                        NOT BYTE [EDX+EBP*1]
    10 0000000E F6 14 2A                        NOT BYTE [EDX*1+EBP*1]
    11 00000011 F6 54 15 00                     NOT BYTE [EBP*1+EDX*1]
    12 00000015 3E F6 14 2A                     NOT BYTE [DS:EDX+EBP]
    13 00000019 36 F6 14 2A                     NOT BYTE [SS:EDX+EBP]
    14 0000001D 26 F6 14 2A                     NOT BYTE [ES:EDX+EBP]

  6と7と10と11の挙動については、I.Tak.さんの懸念を解消できている
でしょう。しかし8と9についてはNASMとは違うかもしれません。

  しかしまあなんというか、NASKとNASMで共通にアセンブルできるソー
スは作れますが、今までのNASMのものを無変更でNASKへ持ってくる、と
いうわけにはいかないかもしれません。

  NASKのベース、インデックスの扱いにつきましては、基本的にインデ
ックスの方に「*1」を書くという方針です(「1*」でもよい)。これで
決定できないときに、書く順序で決めようとしています。またOPTIMIZE
がONなら不要なプリフィックスは自動的に消えるので、曖昧さが残る場
合は積極的にセグメントレジスタの指定をご利用ください(指定がなけ
ればどっちでも構わないという意思表示だと解釈します)。・・・とい
うのがNASKの基本方針です。

  以下は上記ソースを[OPTIMIZE 1]にした場合です。参考にして下さい
。

     1 00000000                                 [BITS 32]
     2 00000000                                 ;%NASK	[INSTRSET "i386"]
     3 00000000                                 ;%NASK	[FORMAT "BIN"]
     4 00000000                                 ;%NASK	[OPTIMIZE 1]
     5 00000000                                 ;%NASK	[OPTION 1]
     6 00000000 F6 14 2A                        NOT BYTE [EBP+EDX]
     7 00000003 F6 14 2A                        NOT BYTE [EDX+EBP]
     8 00000006 F6 54 15 00                     NOT BYTE [EDX*1+EBP]
     9 0000000A F6 14 2A                        NOT BYTE [EDX+EBP*1]
    10 0000000D F6 14 2A                        NOT BYTE [EDX*1+EBP*1]
    11 00000010 F6 14 2A                        NOT BYTE [EBP*1+EDX*1]
    12 00000013 F6 14 2A                        NOT BYTE [DS:EDX+EBP]
    13 00000016 F6 54 15 00                     NOT BYTE [SS:EDX+EBP]
    14 0000001A 26 F6 14 2A                     NOT BYTE [ES:EDX+EBP]


  それでは。

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