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

[OSASK 2643] Re: About NASM.



  こんばんは、川合です。


nabe さんは 2001/12/09 17:05:24 の「[OSASK 2639] Re: About NASM.
」で書きました:

>>>>    MOV DWORD [FS:EBX+4],.l001 ; これはうまくいかない(disp32)
>>>>    MOV DWORD [FS:EBX+4],.l000 ; これはうまくいくのに(disp8)
>>ですね。これはどうみてもdisplacementが8bitに納まるって分かるのに
>>、なんでdisp32になってしまうんでしょうか?多分、チェック方法に手
>>抜きがあるんでしょう。
>1パス目でサイズを決定するときに .1001 が未定義シンボルですから
>disp32 と解釈してしまうのでしょう。
>byte か何かでシンボルを修飾すればうまくいくような
>気がしましたが、それだと川合さんの本来の目的をはずれますね……。

  はい。

  ・・・というか、みんな僕とは違うところを見ているかもしれない・
・・。なべちゃんさんすら分かってくれないところをみると、僕の説明
が足りないせいだと思いました。ごめんなさい。ということで説明をや
り直します。

BITS 32
L000:
    MOV DWORD [EBX+4],L001 ; これはうまくいかない
    MOV DWORD [EBX+4],L000 ; これはうまくいくのに
L001:

  これをNASMでアセンブルすると、

00000000 C78304000000[11000000] ; disp32, imm32
0000000B C74304[00000000]       ; disp8,  imm32

と、こうなります。僕が納得いかないのは、imm32の方ではなくて、dis
p32の方なのです。[EBX+4]はどうみてもdisp8で指定できます。それが
、L001という未定義シンボルのために、つられて「サイズ不定」にされ
ているような気がします。L001の値がなんであっても、DWORD指定され
ている以上、imm32にするのは当然なのです。この場合、displacement
の部分は定数式であって、これは1パス目で十分に判定できると思うの
ですが・・・。

  ちなみに、

    MOV DWORD [BYTE EBX+4],L001

とすれば、ちゃんと直ります。直りますが、なんで4をBYTEで示せるな
んてことをいちいち教えてあげなきゃいけないんだあ〜。それくらいは
自動的に分かっておくれよー、ということなのです(笑)。

  これで、僕の不満を共有していただけるでしょうか?(笑)。

---

  あの、どなたか、こういうツールを作ってほしいといったら、やって
くれるでしょうか。簡単に言うと、ラベル計算以外の全てをやってしま
うアセンブラです。先のプログラムを、

L000:
    DB(0xc7, 0x43, 0x04); DD(L001);
    DB(0xc7, 0x43, 0x04); DD(L000);
L001:

のような形式に展開するんです。また、条件ジャンプ、"JE L002"など
は、

    if (-0x80 <= L002-L003 <= 0x7f) {
        DB(0x74, L002-L003);
    } else {
        DB(0x0f, 0x74); DD(L002-L003);
    }
L003:

のように展開します。・・・ここでは分かりやすくするためにテキスト
で書きましたが実際はもっと単純なバイナリーフォーマットにします。
ここまでやっていただければ汎用的なラベル計算プログラムを作ればい
いわけで、それなら僕がちょっと腕を振るってみてもいいです。


  それでは。

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