page0017
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* lbstk01の説明
-(by [[K]], 2013.03.29)
** lbstk01とは?
-簡単に言うと、OSECPUのアセンブラを支援するためのツールで...
--x86などの一般的なCPUの開発ツールでいうと、リンカに相当...
-語源はlabel-stackです。
-前バージョンのlbstk00と比較すると、ループのBREAKやブロッ...
-C言語の標準ライブラリだけで書いた場合は210行くらいの非常...
-最初のバージョンはosecpu011aにバンドルされています。
** きっかけ
-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(0,1,2); PLIMM(P1E, lbstk2(0,0)); JMP(12); LB0(lbs...
-これは次のような意味を持ちます。
--lbstk1(j, sz, n); : 新規にラベル用の連続した番号をsz個...
---上記例でj=0としたのは、関数コール用のスタックとしてj=0...
---上記例で2回つむのは、このラベル番号を2回参照するからで...
--この命令自身は、ラベルの発行を促す以上の意味を持たない...
--lbstk2(j, ofs) : スタック[j]からラベル番号を一つ取って...
-このような機構により、以下のように完全に同一の記述を何度...
lbstk1(0,1,2); PLIMM(P1E, lbstk2(0,0)); JMP(12); LB0(lbs...
lbstk1(0,1,2); PLIMM(P1E, lbstk2(0,0)); JMP(12); LB0(lbs...
-ということで、これはマクロ化されて、 CALLS(12); とだけ書...
#define CALLS(label) lbstk1(0,1,2); PLIMM(P1E, lbstk...
-このスタック操作は、ソースの書き換えの際にラベル番号を求...
** 応用
-osecpu_asm.hには以下のような記述があります。
#define LOOP(c,b) lbstk1(0,2,c+b+1+((b!=0)&1)); LB0(...
#define CONTINUE lbstk2(0,0)
#define BREAK lbstk2(0,1)
#define ENDLOOP0() /* BREAKを使わない場合用、省略可能...
#define ENDLOOP1() LB0(lbstk2(0,1))
-これがあると以下のような表記が可能になります。
#define sum R00
#define i R01
#define const1 R30
#define const10001 R31
LIMM(const1, 1);
LIMM(const10001, 10001);
LIMM(i, 0);
CP(sum, i);
LOOP(1, 0); /* CONTINUEを使う回数, BREAKを使う回数 */
ADD2(sum, i);
ADD2(i, const1);
CMPJNE(i, const10001, CONTINUE);
-このようにループを書く際にラベル番号を気にしないで済みま...
-なおこのマクロによるループは、ENDLOOPしても次のループを...
--このような仕様になっているのは、暗黙の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)
** こめんと欄
-このページにこめんと欄はありません。このページの内容にコ...
終了行:
* lbstk01の説明
-(by [[K]], 2013.03.29)
** lbstk01とは?
-簡単に言うと、OSECPUのアセンブラを支援するためのツールで...
--x86などの一般的なCPUの開発ツールでいうと、リンカに相当...
-語源はlabel-stackです。
-前バージョンのlbstk00と比較すると、ループのBREAKやブロッ...
-C言語の標準ライブラリだけで書いた場合は210行くらいの非常...
-最初のバージョンはosecpu011aにバンドルされています。
** きっかけ
-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(0,1,2); PLIMM(P1E, lbstk2(0,0)); JMP(12); LB0(lbs...
-これは次のような意味を持ちます。
--lbstk1(j, sz, n); : 新規にラベル用の連続した番号をsz個...
---上記例でj=0としたのは、関数コール用のスタックとしてj=0...
---上記例で2回つむのは、このラベル番号を2回参照するからで...
--この命令自身は、ラベルの発行を促す以上の意味を持たない...
--lbstk2(j, ofs) : スタック[j]からラベル番号を一つ取って...
-このような機構により、以下のように完全に同一の記述を何度...
lbstk1(0,1,2); PLIMM(P1E, lbstk2(0,0)); JMP(12); LB0(lbs...
lbstk1(0,1,2); PLIMM(P1E, lbstk2(0,0)); JMP(12); LB0(lbs...
-ということで、これはマクロ化されて、 CALLS(12); とだけ書...
#define CALLS(label) lbstk1(0,1,2); PLIMM(P1E, lbstk...
-このスタック操作は、ソースの書き換えの際にラベル番号を求...
** 応用
-osecpu_asm.hには以下のような記述があります。
#define LOOP(c,b) lbstk1(0,2,c+b+1+((b!=0)&1)); LB0(...
#define CONTINUE lbstk2(0,0)
#define BREAK lbstk2(0,1)
#define ENDLOOP0() /* BREAKを使わない場合用、省略可能...
#define ENDLOOP1() LB0(lbstk2(0,1))
-これがあると以下のような表記が可能になります。
#define sum R00
#define i R01
#define const1 R30
#define const10001 R31
LIMM(const1, 1);
LIMM(const10001, 10001);
LIMM(i, 0);
CP(sum, i);
LOOP(1, 0); /* CONTINUEを使う回数, BREAKを使う回数 */
ADD2(sum, i);
ADD2(i, const1);
CMPJNE(i, const10001, CONTINUE);
-このようにループを書く際にラベル番号を気にしないで済みま...
-なおこのマクロによるループは、ENDLOOPしても次のループを...
--このような仕様になっているのは、暗黙の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)
** こめんと欄
-このページにこめんと欄はありません。このページの内容にコ...
ページ名: