page0025
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* lbstk ver.0.03の説明
-(by [[K]], 2013.04.15)
** lbstkとは?
-簡単に言うと、OSECPUのアセンブラを支援するためのツールで...
--x86などの一般的なCPUの開発ツールでいうと、リンカに相当...
-語源はlabel-stackです。
-前バージョンのlbstk01やlbstk02と比較すると、内部仕様が変...
--仕様が変わったので互換性はありません。
//-C言語の標準ライブラリだけで書いた場合は210行くらいの非...
-できれば将来OSECPUアプリとして移植したいと思っています。
-最初のバージョンはosecpu022aにバンドルされています。
** きっかけ
-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がもっとがんばってうまく処理すればいい...
** 仕組み
-上記の関数呼び出しを次のように書くことにしました。
lbstk2(0,1); PLIMM(P1E, lbstk1(0,0)); JMP(12); LB0(lbstk...
-これは次のような意味を持ちます。
--lbstk2(j, sz); : 新規にラベル用の連続した番号をsz個発行...
---上記例でj=0としたのは、関数コール用のスタックとしてj=0...
--この命令自身は、ラベルの発行を促す以上の意味を持たない...
--lbstk1(j, ofs) : スタック[j]から一番上のラベル番号を取...
--lbstl3(j); : スタック[j]から一番上のラベル番号をpopし、...
-このような機構により、以下のように完全に同一の記述を何度...
lbstk2(0,1); PLIMM(P1E, lbstk1(0,0)); JMP(12); LB0(lbstk...
lbstk2(0,1); PLIMM(P1E, lbstk1(0,0)); JMP(12); LB0(lbstk...
-ということで、これはマクロ化されて、 CALL(12); とだけ書...
#define CALL(label) lbstk2(0,1); PLIMM(P1E, lbstk1(0...
-このスタック操作は、ソースの書き換えの際にラベル番号を求...
** 応用
-osecpu_asm.hには以下のような記述があります。
#define LOOP() lbstk2(0,2); LB0(lbstk1(0,0))
#define CONTINUE lbstk1(0,0)
#define BREAK lbstk1(0,1)
#define ENDLOOP0() lbstk3(0) /* BRE...
#define ENDLOOP1() LB0(lbstk1(0,1)); lbstk3(0) /* BRE...
-これがあると以下のような表記が可能になります。
#define sum R00
#define i R01
LIMM(sum, 0);
LIMM(i, 0);
LOOP();
ADD2(sum, i);
ADDI(i, i, 1);
CMPIJNE(i, 10001, CONTINUE);
ENDLOOP0(); /* BREAKを使わない場合用 */
-このようにループを書く際にラベル番号を気にしないで済みま...
-なおこのマクロによるループは、ENDLOOPしても次のループを...
** 発展
-他にlbstk0(n);とlbstk4(n);とlbstk5(i)という表記をサポー...
-まずlbstk0(n); はlbstkが発行するラベル番号の開始番号を指...
-lbstk4(n);は関数の先頭で宣言されるべきもので、関数内でい...
-lbstk5(i)はi番目のローカルラベル番号を返します。iはlbstk...
-これらについてはosecpu_asm.hで以下のように整備されていま...
#define GLOBALLABELS(n) lbstk0(n)
#define LOCALLABELS(n) lbstk4(n)
#define LOCAL(i) lbstk5(i)
** こめんと欄
-このページにこめんと欄はありません。このページの内容にコ...
終了行:
* lbstk ver.0.03の説明
-(by [[K]], 2013.04.15)
** lbstkとは?
-簡単に言うと、OSECPUのアセンブラを支援するためのツールで...
--x86などの一般的なCPUの開発ツールでいうと、リンカに相当...
-語源はlabel-stackです。
-前バージョンのlbstk01やlbstk02と比較すると、内部仕様が変...
--仕様が変わったので互換性はありません。
//-C言語の標準ライブラリだけで書いた場合は210行くらいの非...
-できれば将来OSECPUアプリとして移植したいと思っています。
-最初のバージョンはosecpu022aにバンドルされています。
** きっかけ
-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がもっとがんばってうまく処理すればいい...
** 仕組み
-上記の関数呼び出しを次のように書くことにしました。
lbstk2(0,1); PLIMM(P1E, lbstk1(0,0)); JMP(12); LB0(lbstk...
-これは次のような意味を持ちます。
--lbstk2(j, sz); : 新規にラベル用の連続した番号をsz個発行...
---上記例でj=0としたのは、関数コール用のスタックとしてj=0...
--この命令自身は、ラベルの発行を促す以上の意味を持たない...
--lbstk1(j, ofs) : スタック[j]から一番上のラベル番号を取...
--lbstl3(j); : スタック[j]から一番上のラベル番号をpopし、...
-このような機構により、以下のように完全に同一の記述を何度...
lbstk2(0,1); PLIMM(P1E, lbstk1(0,0)); JMP(12); LB0(lbstk...
lbstk2(0,1); PLIMM(P1E, lbstk1(0,0)); JMP(12); LB0(lbstk...
-ということで、これはマクロ化されて、 CALL(12); とだけ書...
#define CALL(label) lbstk2(0,1); PLIMM(P1E, lbstk1(0...
-このスタック操作は、ソースの書き換えの際にラベル番号を求...
** 応用
-osecpu_asm.hには以下のような記述があります。
#define LOOP() lbstk2(0,2); LB0(lbstk1(0,0))
#define CONTINUE lbstk1(0,0)
#define BREAK lbstk1(0,1)
#define ENDLOOP0() lbstk3(0) /* BRE...
#define ENDLOOP1() LB0(lbstk1(0,1)); lbstk3(0) /* BRE...
-これがあると以下のような表記が可能になります。
#define sum R00
#define i R01
LIMM(sum, 0);
LIMM(i, 0);
LOOP();
ADD2(sum, i);
ADDI(i, i, 1);
CMPIJNE(i, 10001, CONTINUE);
ENDLOOP0(); /* BREAKを使わない場合用 */
-このようにループを書く際にラベル番号を気にしないで済みま...
-なおこのマクロによるループは、ENDLOOPしても次のループを...
** 発展
-他にlbstk0(n);とlbstk4(n);とlbstk5(i)という表記をサポー...
-まずlbstk0(n); はlbstkが発行するラベル番号の開始番号を指...
-lbstk4(n);は関数の先頭で宣言されるべきもので、関数内でい...
-lbstk5(i)はi番目のローカルラベル番号を返します。iはlbstk...
-これらについてはosecpu_asm.hで以下のように整備されていま...
#define GLOBALLABELS(n) lbstk0(n)
#define LOCALLABELS(n) lbstk4(n)
#define LOCAL(i) lbstk5(i)
** こめんと欄
-このページにこめんと欄はありません。このページの内容にコ...
ページ名: