[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]
[OSASK 3019] Re: ASKA(ASM) での呼び出し方について
- Subject: [OSASK 3019] Re: ASKA(ASM) での呼び出し方について
- From: Hidemi KAWAI <kawai !Atmark! imasy.org>
- Date: Tue, 22 Jan 2002 11:12:17 -0000
こんばんは、川合です。
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/