page0016
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* lbstk00の説明
-(by [[K]], 2013.03.28)
** lbstk00とは?
-簡単に言うと、OSECPUのアセンブラを支援するためのツールで...
--x86などの一般的なCPUの開発ツールでいうと、リンカに相当...
-語源はlabel-stackです。
-C言語の標準ライブラリだけで書いた場合は150行くらいの非常...
-最初のバージョンはosecpu010aにバンドルされています。
** きっかけ
-OSECPUでは関数を呼ぶときに関数呼び出しの命令があるわけで...
PLIMM(P1E, 4); JMP(12); LB0(4);
--この例では、LB0(12);の関数を呼んでいます。
-もしこの関数を連続で2度呼ぶとしたら、こうなります。
PLIMM(P1E, 4); JMP(12); LB0(4);
PLIMM(P1E, 5); JMP(12); LB0(5);
-つまり関数呼び出しのたびにラベルを作る必要があって、しか...
-このような仕様なのには理由があります。OSECPUはラベルのあ...
-それにこのような仕様だからこそ、OSECPUでは分岐命令はJMP...
-それならosecpu.exeがもっとがんばってうまく処理すればいい...
** 仕組み
-上記の関数呼び出しを次のように書くことにしました。
lbstk1(2); PLIMM(P1E, lbstk2()); JMP(12); LB0(lbstk2());
-これは次のような意味を持ちます。
--lbstk1(2); : 新規にラベル用の番号を一つ発行し、その番号...
---2回つむのは、このラベル番号を2回参照するからです。
--この命令自身は、ラベルの発行を促す以上の意味を持たない...
--lbstk2() : スタックからラベル番号を一つ取ってきます。こ...
-このような機構により、以下のように何度書いても問題なくな...
lbstk1(2); PLIMM(P1E, lbstk2()); JMP(12); LB0(lbstk2());
lbstk1(2); PLIMM(P1E, lbstk2()); JMP(12); LB0(lbstk2());
-このスタック操作は、ソースの書き換えの際にラベル番号を求...
** 応用
-osecpu_asm.hには以下のような記述があります。
#define LOOPSTART(n) lbstk1(n); LB0(lbstk2())
#define CONTINUE lbstk2()
-これがあると以下のような表記が可能になります。
#define sum R00
#define i R01
#define const1 R30
#define const10001 R31
LIMM(const1, 1);
LIMM(const10001, 10001);
LIMM(i, 0);
CP(sum, i);
LOOPSTART(2); /* CONTINUEを使う回数+1を書く */
ADD2(sum, i);
ADD2(i, const1);
CMPJNE(i, const10001, CONTINUE);
-このようにループを書く際にラベル番号を気にしないで済みま...
** 発展
-他にlbstk0(n);とlbstk3(n);とlbstk4(i)という表記をサポー...
-まずlbstk0(n); はlbstk00.exeが発行するラベル番号の開始番...
-lbstk3(n);は関数の先頭で宣言されるべきもので、関数内でい...
-lbstk4(i)はi番目のローカルラベル番号を返します。iはlbstk...
-これらについてはosecpu_asm.hで以下のように整備されていま...
#define GLOBALLABELS(n) lbstk0(n)
#define LOCALLABELS(n) lbstk3(n)
#define LOCAL(i) lbstk4(i)
** こめんと欄
-このページにこめんと欄はありません。このページの内容にコ...
終了行:
* lbstk00の説明
-(by [[K]], 2013.03.28)
** lbstk00とは?
-簡単に言うと、OSECPUのアセンブラを支援するためのツールで...
--x86などの一般的なCPUの開発ツールでいうと、リンカに相当...
-語源はlabel-stackです。
-C言語の標準ライブラリだけで書いた場合は150行くらいの非常...
-最初のバージョンはosecpu010aにバンドルされています。
** きっかけ
-OSECPUでは関数を呼ぶときに関数呼び出しの命令があるわけで...
PLIMM(P1E, 4); JMP(12); LB0(4);
--この例では、LB0(12);の関数を呼んでいます。
-もしこの関数を連続で2度呼ぶとしたら、こうなります。
PLIMM(P1E, 4); JMP(12); LB0(4);
PLIMM(P1E, 5); JMP(12); LB0(5);
-つまり関数呼び出しのたびにラベルを作る必要があって、しか...
-このような仕様なのには理由があります。OSECPUはラベルのあ...
-それにこのような仕様だからこそ、OSECPUでは分岐命令はJMP...
-それならosecpu.exeがもっとがんばってうまく処理すればいい...
** 仕組み
-上記の関数呼び出しを次のように書くことにしました。
lbstk1(2); PLIMM(P1E, lbstk2()); JMP(12); LB0(lbstk2());
-これは次のような意味を持ちます。
--lbstk1(2); : 新規にラベル用の番号を一つ発行し、その番号...
---2回つむのは、このラベル番号を2回参照するからです。
--この命令自身は、ラベルの発行を促す以上の意味を持たない...
--lbstk2() : スタックからラベル番号を一つ取ってきます。こ...
-このような機構により、以下のように何度書いても問題なくな...
lbstk1(2); PLIMM(P1E, lbstk2()); JMP(12); LB0(lbstk2());
lbstk1(2); PLIMM(P1E, lbstk2()); JMP(12); LB0(lbstk2());
-このスタック操作は、ソースの書き換えの際にラベル番号を求...
** 応用
-osecpu_asm.hには以下のような記述があります。
#define LOOPSTART(n) lbstk1(n); LB0(lbstk2())
#define CONTINUE lbstk2()
-これがあると以下のような表記が可能になります。
#define sum R00
#define i R01
#define const1 R30
#define const10001 R31
LIMM(const1, 1);
LIMM(const10001, 10001);
LIMM(i, 0);
CP(sum, i);
LOOPSTART(2); /* CONTINUEを使う回数+1を書く */
ADD2(sum, i);
ADD2(i, const1);
CMPJNE(i, const10001, CONTINUE);
-このようにループを書く際にラベル番号を気にしないで済みま...
** 発展
-他にlbstk0(n);とlbstk3(n);とlbstk4(i)という表記をサポー...
-まずlbstk0(n); はlbstk00.exeが発行するラベル番号の開始番...
-lbstk3(n);は関数の先頭で宣言されるべきもので、関数内でい...
-lbstk4(i)はi番目のローカルラベル番号を返します。iはlbstk...
-これらについてはosecpu_asm.hで以下のように整備されていま...
#define GLOBALLABELS(n) lbstk0(n)
#define LOCALLABELS(n) lbstk3(n)
#define LOCAL(i) lbstk4(i)
** こめんと欄
-このページにこめんと欄はありません。このページの内容にコ...
ページ名: