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

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



rakkyo さん、こんにちは。アセンブリファンのI.Tak. です。

Tue, 22 Jan 2002 08:21:58 -0000 の
[OSASK 3018] Re: ASKA(ASM) での呼び出し方について
に返信です。

>INT 0x0D General Protect
>CS:EIP = 0090:000003ec ec=0

 そのバグは私も実際に出しました。原因は川合さんの言うとおりですが、
そのことはintrocの中のtviewcの解説にほのめかしてあります。
私が書いたページが少ぅしだけ、参考になる、かも知れません。
http://home1.catvmics.ne.jp/~msy/tak/osask/ostwkai6.htm


 私もソースを読んでみました。気付いた事をいくつか。

>struct LIB_GRAPHBOX {
>//	int reserve[64 / 4];
>	int reserve[16];
>};

 これはC言語のヘッダから持って来るときに気を利かせましたね……(^^;
int reserve[64]; と書いてください。オリジナルに 64/4 と書いてあるのは、
64バイトだと明示するためでしょう(本当はC言語でint=32ビットを決めつける
のは良くないので 64 / (sizeof)int とかにするべきかも知れません……
まあ32ビットのコンパイラではint=32ビットが普通ですが)。

>void near static_datas()

 dataは複数形ですので、datasとは言いません(^_^;; 川合さ〜ん

>// 静的変数領域の初期値設定
>// ・・・決まり文句だと思ってください。深く考えなくていいです。

 ベタデータをコピーしてますね。tek0を使えるといいんですが……

>AX = CS; // code_sel
>DS = AX;

 これはあまりよくありません。PUSH(CS); POP(DS); と書きましょう。
これまたtek0を使えば問題ではないのですが、サンプルが……

>// malloc()が使えるように、初期化する

 mallocを使うと、プログラムがやたらとでかくなります。小さいプログラム
が目標なら、やめるべきです。DD((offset)work->initwork); とか書きましょう。
このサンプルはベータリリースのcolor1です。

>xor(EAX, 1);

 EAX^=1; でXOR演算ができます。それから、ニモニック関数(勝手命名)は
大文字で書きます。例えば、これ。
>test(CH, 0x01);
TEST(CH, 0x01); としてください。また、コンパイル結果は出てしまいますが、
こうしたエラー行は省かれます。本当はエラーが出たら出力ファイルを消して
くれるといいんですが。

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

 これでECXに代入されるのは、ヘッダに書きこんだこの値です。
>DD(94208 + 1, 0, 0); // file:92k
したがって、#define filesize 0x17000 などとして、DD(filesize+1);
ECX = filesize; などと書いた方が良いと思います。これなら&演算もいりません。
 同様の理由で、
>asmout("mov EDI, dword ptr CS:[10H]");
>work->lib_mapmodule.addr = EDI;
ここも書きなおせます。lib_mapmodule.addr に最初からDDで書いておけます。

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

 16ビットレジスタはできるだけ使わない方が小さくかつ速いプログラムになり
ます。ここでは、DX = を EDX = にしてください(もちろん比較はDXです)。
ほかのところでも16ビットレジスタがよく使ってありますが、できるだけ32ビット
レジスタを使いましょう。

>mlp:
    :
>	if(!= 0)goto mlp;

 こういう用途には do{}while(!=0); を使いましょう。これでこそASKAです。

 ASKAらしいと言えば、レジスタの役割が固定しているならエリアスを使うと
見通しが良くなります。


 ASKA人口の増加は、アセンブリ人口の増加に近いことです。応援しますよ。

------------------------------------------------------------
I.Tak. <msy !Atmark! catvmics.ne.jp>
http://home1.catvmics.ne.jp/~msy/takhome.htm