text0007
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 川合のプログラミング言語自作のためのテキスト#0007
-(by [[K]], 2019.05.07)
** (14) TJ-20 (註:番号が一気に飛んでいるのは、過去に作...
-TJ-03が高評価なので、予定を変更してちょっとした発展版を...
-TJ-03はTJ-02と比較すると圧倒的に高速でしたが、しかしまだ...
-C言語には「レジスタ変数」という機能があります。しかし最...
-どうですか?面白そうじゃないですか?ということでやってみ...
→ 最初から以下の #define ECX 1 までは、TJ-03と同じなので...
#define ECX 1
#define EDX 2
#define REGVAR 'i' // レジスタ変数の変数名(固定).
int isNumber(unsigned char c) → TL-02と同じなので省略.
void getNumberSub()
{
unsigned char *p = &txt[pc], *q;
put32(strtol(p, (char **) &q, 0));
pc += q - p;
}
void getNumber(int reg) // 定数は2桁以上でもOK. レジス...
{
unsigned char c = txt[pc], *p, *q;
if (isNumber(c) != 0) { // 数字.
code[qc++] = 0xb8 + reg; // MOV reg,const.
getNumberSub();
return;
}
pc++; // 1文字の変数.
if (c == REGVAR) {
if (reg != EDX) {
code[qc++] = 0x89; // MOV reg,EDX.
code[qc++] = reg + EDX * 8 + 0xc0;
}
} else {
code[qc++] = 0x8b; // MOV reg,[const].
code[qc++] = reg * 8 + 0x05;
put32((int) &var[c]);
}
}
void sub_print(int i) → TJ-03と同じなので省略
void sub_time() → TJ-03と同じなので省略
int main(int argc, const char **argv)
{
→ ここの部分はTJ-03と同じなので省略.
for (;;) {
pc0 = pc;
if (txt[pc] == 0) // ファイル終端.
break;
if (txt[pc] == REGVAR && txt[pc + 1] == '=') { //...
pc += 2;
getNumber(EDX);
if (txt[pc] == ';') {
} else if (txt[pc] == '+') { // 加算.
pc++;
if (isNumber(txt[pc]) != 0) {
code[qc++] = 0x81;
code[qc++] = 0xc0 + EDX;
getNumberSub();
} else
goto err; // 変数の加算はまだ作ってな...
} else
goto err; // 加算以外はまだ作ってない.
continue;
}
if (txt[pc] == '\n' || txt[pc] == ' ' || txt[pc] ...
pc++;
} else if (txt[pc + 1] == '=') { // 2文字目が"=".
→ ここ以降はTJ-03と同じなので省略.
-結局どこを改造したのかというと、getNumber()を改造したこ...
-このTJ-20では、変数iが自動でレジスタ変数として扱われます...
-これにより、処理が以下のように単純化されます。
|処理|普通の変数の場合|レジスタ変数の場合|
|i=3;|[2命令] MOV(EAX,3); MOV([const],EAX);|[1命令] MOV(E...
|i=a;|[2命令] MOV(EAX,[const]); MOV([const],EAX);|[1命令]...
|i=i;|[2命令] MOV(EAX,[const]); MOV([const],EAX);|[0命令]|
|i=i+5;|[4命令] MOV(EAX,[const]); MOV(ECX,5); ADD(EAX,ECX...
-ということで、おそらくTJ-03と比較して2倍以上は速くなった...
-でもC言語の速さはこんなものじゃありません。ということで...
** 次回に続く
-次回: [[text0008]]
*こめんと欄
#comment
終了行:
* 川合のプログラミング言語自作のためのテキスト#0007
-(by [[K]], 2019.05.07)
** (14) TJ-20 (註:番号が一気に飛んでいるのは、過去に作...
-TJ-03が高評価なので、予定を変更してちょっとした発展版を...
-TJ-03はTJ-02と比較すると圧倒的に高速でしたが、しかしまだ...
-C言語には「レジスタ変数」という機能があります。しかし最...
-どうですか?面白そうじゃないですか?ということでやってみ...
→ 最初から以下の #define ECX 1 までは、TJ-03と同じなので...
#define ECX 1
#define EDX 2
#define REGVAR 'i' // レジスタ変数の変数名(固定).
int isNumber(unsigned char c) → TL-02と同じなので省略.
void getNumberSub()
{
unsigned char *p = &txt[pc], *q;
put32(strtol(p, (char **) &q, 0));
pc += q - p;
}
void getNumber(int reg) // 定数は2桁以上でもOK. レジス...
{
unsigned char c = txt[pc], *p, *q;
if (isNumber(c) != 0) { // 数字.
code[qc++] = 0xb8 + reg; // MOV reg,const.
getNumberSub();
return;
}
pc++; // 1文字の変数.
if (c == REGVAR) {
if (reg != EDX) {
code[qc++] = 0x89; // MOV reg,EDX.
code[qc++] = reg + EDX * 8 + 0xc0;
}
} else {
code[qc++] = 0x8b; // MOV reg,[const].
code[qc++] = reg * 8 + 0x05;
put32((int) &var[c]);
}
}
void sub_print(int i) → TJ-03と同じなので省略
void sub_time() → TJ-03と同じなので省略
int main(int argc, const char **argv)
{
→ ここの部分はTJ-03と同じなので省略.
for (;;) {
pc0 = pc;
if (txt[pc] == 0) // ファイル終端.
break;
if (txt[pc] == REGVAR && txt[pc + 1] == '=') { //...
pc += 2;
getNumber(EDX);
if (txt[pc] == ';') {
} else if (txt[pc] == '+') { // 加算.
pc++;
if (isNumber(txt[pc]) != 0) {
code[qc++] = 0x81;
code[qc++] = 0xc0 + EDX;
getNumberSub();
} else
goto err; // 変数の加算はまだ作ってな...
} else
goto err; // 加算以外はまだ作ってない.
continue;
}
if (txt[pc] == '\n' || txt[pc] == ' ' || txt[pc] ...
pc++;
} else if (txt[pc + 1] == '=') { // 2文字目が"=".
→ ここ以降はTJ-03と同じなので省略.
-結局どこを改造したのかというと、getNumber()を改造したこ...
-このTJ-20では、変数iが自動でレジスタ変数として扱われます...
-これにより、処理が以下のように単純化されます。
|処理|普通の変数の場合|レジスタ変数の場合|
|i=3;|[2命令] MOV(EAX,3); MOV([const],EAX);|[1命令] MOV(E...
|i=a;|[2命令] MOV(EAX,[const]); MOV([const],EAX);|[1命令]...
|i=i;|[2命令] MOV(EAX,[const]); MOV([const],EAX);|[0命令]|
|i=i+5;|[4命令] MOV(EAX,[const]); MOV(ECX,5); ADD(EAX,ECX...
-ということで、おそらくTJ-03と比較して2倍以上は速くなった...
-でもC言語の速さはこんなものじゃありません。ということで...
** 次回に続く
-次回: [[text0008]]
*こめんと欄
#comment
ページ名: