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

[OSASK 3019] Re: ASKA(ASM) での呼び出し方について



  こんばんは、川合です。


rakkyo さんは 2002/01/22 17:21:58 の「[OSASK 3018] Re: ASKA(ASM)
 での呼び出し方について」で書きました:

>> 駄目なら駄目で、以上の修正を加えた状態で再度質問してください。
>指摘されたところを直してやってみたんですが、今度は
>
>INT 0x0D General Protect
>CS:EIP = 0090:000003ec ec=0

>となってしまいました。
>ライブラリの呼び出しの所さえも、いかなくなってしまいました。
>これは何が悪いのでしょうか??
>お手数お掛けしますが、よろしくお願いします。m(_ _)m

  おおっと、すごいのをだしましたね(笑)。・・・いや、実は僕もこ
の報告を見たときは途方に暮れたのですが・・・。

  はい、種を明かせば簡単で、

>    DD(0x4096 + 180224); // stack4k + malloc:176k

  これがまずいです。正解は、

    DD(4096 + 180224); // stack4k + malloc:176k

です。これなら多分ライブラリ呼び出しまでは行くでしょう。

  ついでに詳しく書いておくと、このstack+mallocのサイズを16進数で
表した時に下3桁が0でないとまずいんです。今回はそれが原因です。

  ええと、

>        /* malloc_addr */
>        DD(0); DD(0x4096 + 180224);

のところも"0x"をはずしてあげてくださいね。

  それと、

>        asmout("mov ECX, dword ptr CS:[14H]");

は、

    ECX = (int) [CS:0x0014];

と書いた方がASKAらしくて(C言語っぽくて)、素敵です。

>        DX = [EDI];
>        if(DX== 0x6677/* 'BM' */)goto nmac;

  この部分は、別にDXを使うことはなく、

    if ((unsigned) (short) [DS:EDI] == 0x4d42 /* 'BM' */)
        goto nmac;

でできます。ちなみに、'BM'は0x4d42です。10進数と16進数を混ぜては
いけません。このif文中の(unsigned)キャストは、本来は不要なのです
が今のASKAではこのキャストを外すとうまくいかなくなってしまうんで
す。


  それでは。

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