a23_usm007
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* a23_useSelfMade #7
-(by [[K]], 2023.03.19)
--親ページ: [[a23_useSelfMade]]
** 2023.03.19 Sun #1
-HL-9にはwhileがないです。+=とかもないです。これは不便だ...
~
** 2023.03.20 Mon #1
-gccには関数内関数の機能があります。easy-Cの基本コンセプ...
~
** 2023.03.22 Wed #1
-今日はeasy-Cでの開発の様子を紹介します。数学の公式にcomb...
-''[1]''まずはパーミュテーションの計算をする関数を作りた...
int perm(int n, int k)
{
int i = 1, j;
for (j = 0; j < k; j++) { i *= n--; }
return i;
}
-これを適当なテキストファイルに入力します。ここではとりあ...
// ここに追加関数へのincludeを自由に書く.
#include "20230322.c"
と書き足します。これで準備完了です(コンパイルとかしませ...
HL9>!pr perm(4, 0)
1
HL9>!pr perm(4, 1)
4
HL9>!pr perm(4, 2)
12
HL9>
-(知らない人のために説明しておくと!はgccモードでの実行を...
-とてもうまく計算できているようです。よしよし。
-''[2]''次はコンビネーションの計算です。先ほどの20230322....
int comb(int n, int k) { return perm(n, k) / perm(k, k); }
-そしてまたワンライナーでテストです。
HL9>!pr comb(4, 2)
6
HL9>!pr comb(5, 3)
10
-これまた合っているようです。絶好調です。
-''[3]''ここまでできれば後は簡単です。
HL9>![n = 0:<=10] { int sum = 0; sum += comb(n, 0:<=n); ...
n=0 sum=1 pow=1
n=1 sum=2 pow=2
n=2 sum=4 pow=4
n=3 sum=8 pow=8
n=4 sum=16 pow=16
n=5 sum=32 pow=32
n=6 sum=64 pow=64
n=7 sum=128 pow=128
n=8 sum=256 pow=256
n=9 sum=512 pow=512
n=10 sum=1024 pow=1024
-おお、ちゃんと検証できました!
-''[解説]''
-HL-9にはgcc実行モードというのがあって、それを使うと後付...
-[3]では簡易ループ演算子を多用しています。[n = 0:<=10]はf...
-easy-Cでは、i~nの変数はintで宣言済みなので、自分で宣言...
-この作り方で作っていくと、関数を一つ作るたびに「ちゃんと...
-このやり方になってから、C言語がコンパイラだとあまり感じ...
~
** 2023.03.22 Wed #2
-OSCが近いので明日までで開発を切りのいいところまで進めて...
~
** 2023.03.23 Thu #1
-easyc003a.zipを公開しました。 → [[a23_ec001]]
~
-''[開発環境としてみたときのeasy-Cの特徴]''
-ワンライナーができる。
-別ファイルに関数を書いておくと、それを組み込み関数のよう...
-プロンプトで$を使えばシェルコマンドが実行できる。
-インタープリタ実行モードもある。
-''[言語拡張としてみたときのeasy-Cの特徴]''
-prなどの便利命令が使える。
-簡易ループ演算子が使える。
-AXFncを使うと、関数の返値を複数で受け取れる。従来は&yや&...
- → 例: AXFnc_i3(y, m, d, =, fixDate(2023, 1, 100)); /...
-''[プログラミング入門としてみたときのeasy-Cの特徴]''
-入門に最適なPLAY命令がある。
-入門者が使いそうな命令については、大文字でも入力できる。...
-ソースファイル作成は「NEW ファイル名」、テキストエディタ...
-I~N(i~n)については、変数がintで宣言済みなので、宣言...
-グラフィック描画ライブラリが使える(簡単なゲームが作れる...
** 2023.03.23 Thu #2
-fixDateの実装例
int getMonthDays(int y, int m)
{
static int days[12] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
if (m == 2 && y % 4 == 0) return 29; // 手抜きの閏年...
return days[m - 1];
}
#define fixDate(y, m, d) ACA_fixDate(aCA, y, m, d)
void ACA_fixDate(AComArg *aCA, int y, int m, int d)
{
while (d > getMonthDays(y, m)) {
d -= getMonthDays(y, m); m++;
if (m > 12) { m -= 12; y++; }
}
aCA->com->retValInt[0] = y;
aCA->com->retValInt[1] = m;
aCA->com->retValInt[2] = d;
}
HL9>!int y, d; AXFnc_i3(y, m, d, =, fixDate(2023,1,100))...
2023/4/10
~
** 2023.03.24 Fri #1
-OSCで何を紹介するかを考え中です。2023.03.23 Thu #1 に書...
|''[開発環境としてみたときのeasy-Cの特徴]''|RIGHT:小計+3....
|#00 ワンライナーができる。|RIGHT:+1.0点||
|#01 別ファイルに関数を書いておくと、それを組み込み関数の...
|#02 プロンプトで$や$$を使えばシェルコマンドが実行できる...
|#03 gcc実行モードのほかにインタープリタ実行モードがある...
||||
|''[言語拡張としてみたときのeasy-Cの特徴]''|RIGHT:小計+2....
|#04 prなどの便利命令が使える。|RIGHT:+1.0点||
|#05 簡易ループ演算子が使える。|RIGHT:+0.9点|現状の実装は...
|#06 AXFncを使うと、関数の返値を複数で受け取れる。|RIGHT:...
||||
|''[プログラミング入門としてみたときのeasy-Cの特徴]''|RIG...
|#07 入門に最適なPLAY命令がある。|RIGHT:+1.0点||
|#08 入門者が使いそうな命令については、大文字でも入力でき...
|#09 「NEW ファイル名」「$$ファイル名」によって、ファイル...
|#10 I~N(i~n)については、変数がintで宣言済みなので、...
|#11 グラフィック描画ライブラリが使える(簡単なゲームが作...
-こうしてみると、言語拡張としてはまだまだ弱いことがよくわ...
-それで、まあ春のOSCには間に合わないものの、この先1~2か...
|''[言語拡張としてみたときのeasy-Cの特徴]''|RIGHT:小計+2....
|#12 インタプリタモードの時だけ、演算子の優先順位を変更で...
|#13 gccモードでの、#longdef, #endlongdef, #longuse|RIGHT...
|#14 Uniform Function Call Syntax に対応。|RIGHT:+1.0点|...
** 2023.03.27 Mon #1
-小学生2名が仲良く遊べるような、協力型のゲームを一つ作り...
-へびゲーム系のもので、1マス進むごとに+1点ですが、協力型...
-hb2.c[62行]
int spd = 128, hi = 0; AWin *w = aOpenWin(800, 600, "HB2...
int dir[2], bom[2], x[2], y[2], col[2], scr, dxy[14] = {...
start:
aFillRect(w, 800, 584, 0, 16, 0xffffff); aFillRect(w, 78...
[i=0:<2] { dir[i] = 4; bom[i] = 0; y[i] = 304; } x[0] = ...
col[0] = 0x00ff00; col[1] = 0x0000ff; scr = 0;
[9] { aFillOval(w, 8, 8, aRnd(96) * 8 + 16, aRnd(68) * 8...
while (dir[0] != 6 || dir[1] != 6) {
aGrPrintf(w, 16, 0, 0xffffff, 0, "SCORE:%05d HIGH:%...
[i=0:<2] { if (dir[i] < 6) { aFillOval(w, 8, 8, x[i]...
while ((k = aInkey(w, 1)) != 0) {
char *p = "swazxq:@;/\\p", *q;
if ('A' <= k && k <= 'Z'){ k += 'a' - 'A'; }
q = strchr(p, k);
if (q == 0) continue;
if (q - p < 6) {
if (dir[0] < 6) { dir[0] = q - p; }
} else {
if (dir[1] < 6) { dir[1] = q - p - 6; }
}
}
[i=0:<2] {
x[i] = x[i] + dxy[dir[i] * 2 + 0];
y[i] = y[i] + dxy[dir[i] * 2 + 1];
j = aGetPix(w, x[i] + 4, y[i] + 4);
if (j == 0xffff00) { j = 0; bom[i] = bom[i] + 1; }
if (dir[i] < 4 && j != 0) {
x[i] = x[i] - dxy[dir[i] * 2 + 0];
y[i] = y[i] - dxy[dir[i] * 2 + 1];
dir[i] = 6;
}
if (dir[i] == 6) { aFillOval(w, 8, 8, x[i], y[i]...
if (dir[i] == 5) {
if (bom[i] > 0) {
bom[i] = bom[i] - 1; scr += 100;
for (j = -1; j <= 0; j++) {
for (l = 24; l < 592; l += 8) {
n = (l - y[i]) * (l - y[i]);
for (k = 8; k < 792; k += 8) {
m = (k - x[i]) * (k - x[i]);
if (n + m < 6400) { aFillRec...
}
}
if (j < 0) { aWait(256); }
}
}
dir[i] = 4;
}
if (dir[i] < 4) { scr++; }
}
aWait(spd);
if (dir[0] < 4 && dir[1] < 4) { scr++; }
if (AWin_isClose(w)) goto end;
if (dir[0] == 6 && dir[1] == 6) break;
}
if (hi < scr) { hi = scr; }
for (;;) {
aWait(128);
k = aInkey(w, 1);
if (k == AWinKey_Esc || AWin_isClose(w)) goto end;
if (k == AWinKey_Enter) goto start;
}
end:
https://essen.osask.jp/files/pic20230327a.png
||色|上|左|右|下|止|爆|
|1P|緑|W|A|S|Z|X|Q|
|2P|青|@|;|:|/|\|P|
-黄色を取るとボムが増えます。この黄色があるおかげで、とり...
** 2023.03.28 Tue #1
-オープンソースカンファレンスのためのチラシを作成・・・。
--https://essen.osask.jp/files/dc20230401_0a.pdf
** 2023.04.03 Mon #1
-03/29(水) サイボウズ・ラボユースの成果発表会
-03/30(木) OSCの準備(デモ環境の構築)
-03/31(金) サイボウズ・ラボユースの懇親会
-04/01(土) OSC東京春
-04/02(日) OSCの懇親会の代わりのお花見ジビエBBQ
-といろいろ忙しくしていたら更新をさぼってしまいました。今...
~
** 2023.04.04 Tue #1 [easy-C] [casm]
-まずは演算子の優先順位変更のことを考えつつ、「Cコンパイ...
** 2023.04.05 Wed #1 [casm]
-また悪い癖が出て拡張的な仕様にしようとして進まなくなる・...
** 2023.04.05 Wed #2 [casm]
-迷っているところを妥協したらすぐにできました。
-casmというアセンブラです。
-t0001.c:
LdImm32(R00, 32); // MOV EAX,32;
Label(2); // L_2:
ApiPutCharReg32(R00); // PUSH EAX; CALL ap...
AddShtImm32(R00, 1); // ADD EAX,1;
CmpJmpNotEquImm32(R00, 127, 2); // CMP EAX,127; JNE...
End();
-これをアセンブルして実行すると、
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW...
がでます。
** 2023.04.06 Thu #1 [casm]
-[Q] casmってなんですか?
-[A] 基本的にはアセンブラです。
-[Q] 既存のアセンブラと比較して何が違いますか?
-[A] たとえばx86の場合、レジスタ名はEAX, ECX, EDX, EBX,.....
-[Q] それは一見便利そうに思いますが、たとえばx86のストリ...
-[A] そういう命令はcasmでは直接はサポートせず、api経由で...
-[Q] レジスタ数はどうなりますか?
-[A] 整数レジスタが64本、ポインタレジスタが64本、浮動小数...
-[Q] え、それはx64ですらそんなにたくさんのレジスタはない...
-[A] そうです。実レジスタを超えた分はメモリを使って代用し...
-[Q] だんだんわかってきました。つまりcasmの1命令がCPUの1...
-[A] 全くその通りです。だから純粋なアセンブラではなく、ア...
-[Q] そういうことであれば、C言語でもいいのではないかと思...
-[A] もちろんそれでもいいのですが、しかしC言語の処理系は...
-[A] casmではすべての命令がC言語のマクロみたいな方法で記...
-[Q] 他に特徴はありますか?
-[A] casm32.cというファイルが提供されていて、これをインク...
-[A] つまりCコンパイラさえあれば、casmの処理系を準備しな...
-[Q] そもそもアセンブラを使いたくなる理由として、速度が欲...
-[A] まず、普通のアセンブラを全力で使った場合には勝てない...
-[A] じゃあ何のためにアセンブラなんか使うのか。それは結局...
** 2023.04.07 Fri #1 [casm]
-t0002.c:
LdImm32(R00, 256); // MOV EAX,256;
ApiWindowReg32(R00, R00); // PUSH EAX; PUSH EA...
XorSht32(R03, R03); // XOR EBX,EBX;
XorSht32(R02, R02); // XOR ECX,ECX;
Label(2); // L_2:
XorSht32(R01, R01); // XOR EDX,EDX;
Label(3); // L_3:
ApiSetPixReg32(P00, R01, R02, R03); // PUSH EBX; PUSH ED...
AddShtImm32(R01, 1); // ADD ECX,1;
AddSht32(R03, R00); // ADD EBX,EAX;
CmpJmpNotEqu32(R01, R00, 3); // CMP ECX,EAX; JNE...
AddShtImm32(R02, 1); // ADD EDX,2
CmpJmpNotEqu32(R02, R00, 2); // CMP EDX,EAX; JNE...
ApiWaitForExit32(); // CALL ApiWaitForEx...
End();
https://essen.osask.jp/files/pic20230407a.png
-補足
--XorやAddなどの演算命令についているShtはshortの略。ショ...
--Immがついているものは最後の引数がimm。
** 2023.04.09 Sun #1 [casm]
-結局casmで書いてもアセンブラで書くみたいには高速化されな...
-私はcasmを自作のLLVMモドキだと思っているのです。LLVMの場...
-ここまで書いて分かったのは、casmがLLVMの劣化版だとするな...
-うーん、次の一手としては、HL-9がcasmを出力するとか??
** 2023.04.10 Mon #1 [casm]
-x64が出たとき、関数呼び出しの方法が変わって、一部レジス...
-でも自分でcasmみたいなものを作ればいろいろ実験ができる気...
-第一世代OSASK方式:
--引数へのポインタはEBXで渡していました。たいていの場合ス...
** 2023.04.10 Mon #2 [casm]
-C言語にはintptr_tという型があります(同様のものがacl1ラ...
-そもそもポインタを整数のフィールドに格納しておきたいとき...
-理想ではそうでも、実際はポインタからintに変換しているよ...
** 2023.04.11 Tue #1 [casm] [easy-C]
-よし、とりあえずHL-9でcasmの出力ができるようになりました。
HL9>print 1+2
3
HL9>casm 1
HL9>print 1+2
LdImm32(R00, 1);
AddLngImm32(R01, R00, 2);
ApiPrintReg32(R01);
End();
HL9>print 1+2+3
LdImm32(R00, 1);
AddLngImm32(R01, R00, 2);
AddLngImm32(R02, R01, 3);
ApiPrintReg32(R02);
End();
HL9>
// *=など、ACalFnc
// persistent-C
//一覧を得る関数があって、後は自分でフィルタ・ソートする。
//kvs, 言語は型を知るべき, 言語はオブジェクトを知るべき
//winのクローズ
* こめんと欄
-掲示板をご利用ください。→[[a23_bbs]]
終了行:
* a23_useSelfMade #7
-(by [[K]], 2023.03.19)
--親ページ: [[a23_useSelfMade]]
** 2023.03.19 Sun #1
-HL-9にはwhileがないです。+=とかもないです。これは不便だ...
~
** 2023.03.20 Mon #1
-gccには関数内関数の機能があります。easy-Cの基本コンセプ...
~
** 2023.03.22 Wed #1
-今日はeasy-Cでの開発の様子を紹介します。数学の公式にcomb...
-''[1]''まずはパーミュテーションの計算をする関数を作りた...
int perm(int n, int k)
{
int i = 1, j;
for (j = 0; j < k; j++) { i *= n--; }
return i;
}
-これを適当なテキストファイルに入力します。ここではとりあ...
// ここに追加関数へのincludeを自由に書く.
#include "20230322.c"
と書き足します。これで準備完了です(コンパイルとかしませ...
HL9>!pr perm(4, 0)
1
HL9>!pr perm(4, 1)
4
HL9>!pr perm(4, 2)
12
HL9>
-(知らない人のために説明しておくと!はgccモードでの実行を...
-とてもうまく計算できているようです。よしよし。
-''[2]''次はコンビネーションの計算です。先ほどの20230322....
int comb(int n, int k) { return perm(n, k) / perm(k, k); }
-そしてまたワンライナーでテストです。
HL9>!pr comb(4, 2)
6
HL9>!pr comb(5, 3)
10
-これまた合っているようです。絶好調です。
-''[3]''ここまでできれば後は簡単です。
HL9>![n = 0:<=10] { int sum = 0; sum += comb(n, 0:<=n); ...
n=0 sum=1 pow=1
n=1 sum=2 pow=2
n=2 sum=4 pow=4
n=3 sum=8 pow=8
n=4 sum=16 pow=16
n=5 sum=32 pow=32
n=6 sum=64 pow=64
n=7 sum=128 pow=128
n=8 sum=256 pow=256
n=9 sum=512 pow=512
n=10 sum=1024 pow=1024
-おお、ちゃんと検証できました!
-''[解説]''
-HL-9にはgcc実行モードというのがあって、それを使うと後付...
-[3]では簡易ループ演算子を多用しています。[n = 0:<=10]はf...
-easy-Cでは、i~nの変数はintで宣言済みなので、自分で宣言...
-この作り方で作っていくと、関数を一つ作るたびに「ちゃんと...
-このやり方になってから、C言語がコンパイラだとあまり感じ...
~
** 2023.03.22 Wed #2
-OSCが近いので明日までで開発を切りのいいところまで進めて...
~
** 2023.03.23 Thu #1
-easyc003a.zipを公開しました。 → [[a23_ec001]]
~
-''[開発環境としてみたときのeasy-Cの特徴]''
-ワンライナーができる。
-別ファイルに関数を書いておくと、それを組み込み関数のよう...
-プロンプトで$を使えばシェルコマンドが実行できる。
-インタープリタ実行モードもある。
-''[言語拡張としてみたときのeasy-Cの特徴]''
-prなどの便利命令が使える。
-簡易ループ演算子が使える。
-AXFncを使うと、関数の返値を複数で受け取れる。従来は&yや&...
- → 例: AXFnc_i3(y, m, d, =, fixDate(2023, 1, 100)); /...
-''[プログラミング入門としてみたときのeasy-Cの特徴]''
-入門に最適なPLAY命令がある。
-入門者が使いそうな命令については、大文字でも入力できる。...
-ソースファイル作成は「NEW ファイル名」、テキストエディタ...
-I~N(i~n)については、変数がintで宣言済みなので、宣言...
-グラフィック描画ライブラリが使える(簡単なゲームが作れる...
** 2023.03.23 Thu #2
-fixDateの実装例
int getMonthDays(int y, int m)
{
static int days[12] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
if (m == 2 && y % 4 == 0) return 29; // 手抜きの閏年...
return days[m - 1];
}
#define fixDate(y, m, d) ACA_fixDate(aCA, y, m, d)
void ACA_fixDate(AComArg *aCA, int y, int m, int d)
{
while (d > getMonthDays(y, m)) {
d -= getMonthDays(y, m); m++;
if (m > 12) { m -= 12; y++; }
}
aCA->com->retValInt[0] = y;
aCA->com->retValInt[1] = m;
aCA->com->retValInt[2] = d;
}
HL9>!int y, d; AXFnc_i3(y, m, d, =, fixDate(2023,1,100))...
2023/4/10
~
** 2023.03.24 Fri #1
-OSCで何を紹介するかを考え中です。2023.03.23 Thu #1 に書...
|''[開発環境としてみたときのeasy-Cの特徴]''|RIGHT:小計+3....
|#00 ワンライナーができる。|RIGHT:+1.0点||
|#01 別ファイルに関数を書いておくと、それを組み込み関数の...
|#02 プロンプトで$や$$を使えばシェルコマンドが実行できる...
|#03 gcc実行モードのほかにインタープリタ実行モードがある...
||||
|''[言語拡張としてみたときのeasy-Cの特徴]''|RIGHT:小計+2....
|#04 prなどの便利命令が使える。|RIGHT:+1.0点||
|#05 簡易ループ演算子が使える。|RIGHT:+0.9点|現状の実装は...
|#06 AXFncを使うと、関数の返値を複数で受け取れる。|RIGHT:...
||||
|''[プログラミング入門としてみたときのeasy-Cの特徴]''|RIG...
|#07 入門に最適なPLAY命令がある。|RIGHT:+1.0点||
|#08 入門者が使いそうな命令については、大文字でも入力でき...
|#09 「NEW ファイル名」「$$ファイル名」によって、ファイル...
|#10 I~N(i~n)については、変数がintで宣言済みなので、...
|#11 グラフィック描画ライブラリが使える(簡単なゲームが作...
-こうしてみると、言語拡張としてはまだまだ弱いことがよくわ...
-それで、まあ春のOSCには間に合わないものの、この先1~2か...
|''[言語拡張としてみたときのeasy-Cの特徴]''|RIGHT:小計+2....
|#12 インタプリタモードの時だけ、演算子の優先順位を変更で...
|#13 gccモードでの、#longdef, #endlongdef, #longuse|RIGHT...
|#14 Uniform Function Call Syntax に対応。|RIGHT:+1.0点|...
** 2023.03.27 Mon #1
-小学生2名が仲良く遊べるような、協力型のゲームを一つ作り...
-へびゲーム系のもので、1マス進むごとに+1点ですが、協力型...
-hb2.c[62行]
int spd = 128, hi = 0; AWin *w = aOpenWin(800, 600, "HB2...
int dir[2], bom[2], x[2], y[2], col[2], scr, dxy[14] = {...
start:
aFillRect(w, 800, 584, 0, 16, 0xffffff); aFillRect(w, 78...
[i=0:<2] { dir[i] = 4; bom[i] = 0; y[i] = 304; } x[0] = ...
col[0] = 0x00ff00; col[1] = 0x0000ff; scr = 0;
[9] { aFillOval(w, 8, 8, aRnd(96) * 8 + 16, aRnd(68) * 8...
while (dir[0] != 6 || dir[1] != 6) {
aGrPrintf(w, 16, 0, 0xffffff, 0, "SCORE:%05d HIGH:%...
[i=0:<2] { if (dir[i] < 6) { aFillOval(w, 8, 8, x[i]...
while ((k = aInkey(w, 1)) != 0) {
char *p = "swazxq:@;/\\p", *q;
if ('A' <= k && k <= 'Z'){ k += 'a' - 'A'; }
q = strchr(p, k);
if (q == 0) continue;
if (q - p < 6) {
if (dir[0] < 6) { dir[0] = q - p; }
} else {
if (dir[1] < 6) { dir[1] = q - p - 6; }
}
}
[i=0:<2] {
x[i] = x[i] + dxy[dir[i] * 2 + 0];
y[i] = y[i] + dxy[dir[i] * 2 + 1];
j = aGetPix(w, x[i] + 4, y[i] + 4);
if (j == 0xffff00) { j = 0; bom[i] = bom[i] + 1; }
if (dir[i] < 4 && j != 0) {
x[i] = x[i] - dxy[dir[i] * 2 + 0];
y[i] = y[i] - dxy[dir[i] * 2 + 1];
dir[i] = 6;
}
if (dir[i] == 6) { aFillOval(w, 8, 8, x[i], y[i]...
if (dir[i] == 5) {
if (bom[i] > 0) {
bom[i] = bom[i] - 1; scr += 100;
for (j = -1; j <= 0; j++) {
for (l = 24; l < 592; l += 8) {
n = (l - y[i]) * (l - y[i]);
for (k = 8; k < 792; k += 8) {
m = (k - x[i]) * (k - x[i]);
if (n + m < 6400) { aFillRec...
}
}
if (j < 0) { aWait(256); }
}
}
dir[i] = 4;
}
if (dir[i] < 4) { scr++; }
}
aWait(spd);
if (dir[0] < 4 && dir[1] < 4) { scr++; }
if (AWin_isClose(w)) goto end;
if (dir[0] == 6 && dir[1] == 6) break;
}
if (hi < scr) { hi = scr; }
for (;;) {
aWait(128);
k = aInkey(w, 1);
if (k == AWinKey_Esc || AWin_isClose(w)) goto end;
if (k == AWinKey_Enter) goto start;
}
end:
https://essen.osask.jp/files/pic20230327a.png
||色|上|左|右|下|止|爆|
|1P|緑|W|A|S|Z|X|Q|
|2P|青|@|;|:|/|\|P|
-黄色を取るとボムが増えます。この黄色があるおかげで、とり...
** 2023.03.28 Tue #1
-オープンソースカンファレンスのためのチラシを作成・・・。
--https://essen.osask.jp/files/dc20230401_0a.pdf
** 2023.04.03 Mon #1
-03/29(水) サイボウズ・ラボユースの成果発表会
-03/30(木) OSCの準備(デモ環境の構築)
-03/31(金) サイボウズ・ラボユースの懇親会
-04/01(土) OSC東京春
-04/02(日) OSCの懇親会の代わりのお花見ジビエBBQ
-といろいろ忙しくしていたら更新をさぼってしまいました。今...
~
** 2023.04.04 Tue #1 [easy-C] [casm]
-まずは演算子の優先順位変更のことを考えつつ、「Cコンパイ...
** 2023.04.05 Wed #1 [casm]
-また悪い癖が出て拡張的な仕様にしようとして進まなくなる・...
** 2023.04.05 Wed #2 [casm]
-迷っているところを妥協したらすぐにできました。
-casmというアセンブラです。
-t0001.c:
LdImm32(R00, 32); // MOV EAX,32;
Label(2); // L_2:
ApiPutCharReg32(R00); // PUSH EAX; CALL ap...
AddShtImm32(R00, 1); // ADD EAX,1;
CmpJmpNotEquImm32(R00, 127, 2); // CMP EAX,127; JNE...
End();
-これをアセンブルして実行すると、
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW...
がでます。
** 2023.04.06 Thu #1 [casm]
-[Q] casmってなんですか?
-[A] 基本的にはアセンブラです。
-[Q] 既存のアセンブラと比較して何が違いますか?
-[A] たとえばx86の場合、レジスタ名はEAX, ECX, EDX, EBX,.....
-[Q] それは一見便利そうに思いますが、たとえばx86のストリ...
-[A] そういう命令はcasmでは直接はサポートせず、api経由で...
-[Q] レジスタ数はどうなりますか?
-[A] 整数レジスタが64本、ポインタレジスタが64本、浮動小数...
-[Q] え、それはx64ですらそんなにたくさんのレジスタはない...
-[A] そうです。実レジスタを超えた分はメモリを使って代用し...
-[Q] だんだんわかってきました。つまりcasmの1命令がCPUの1...
-[A] 全くその通りです。だから純粋なアセンブラではなく、ア...
-[Q] そういうことであれば、C言語でもいいのではないかと思...
-[A] もちろんそれでもいいのですが、しかしC言語の処理系は...
-[A] casmではすべての命令がC言語のマクロみたいな方法で記...
-[Q] 他に特徴はありますか?
-[A] casm32.cというファイルが提供されていて、これをインク...
-[A] つまりCコンパイラさえあれば、casmの処理系を準備しな...
-[Q] そもそもアセンブラを使いたくなる理由として、速度が欲...
-[A] まず、普通のアセンブラを全力で使った場合には勝てない...
-[A] じゃあ何のためにアセンブラなんか使うのか。それは結局...
** 2023.04.07 Fri #1 [casm]
-t0002.c:
LdImm32(R00, 256); // MOV EAX,256;
ApiWindowReg32(R00, R00); // PUSH EAX; PUSH EA...
XorSht32(R03, R03); // XOR EBX,EBX;
XorSht32(R02, R02); // XOR ECX,ECX;
Label(2); // L_2:
XorSht32(R01, R01); // XOR EDX,EDX;
Label(3); // L_3:
ApiSetPixReg32(P00, R01, R02, R03); // PUSH EBX; PUSH ED...
AddShtImm32(R01, 1); // ADD ECX,1;
AddSht32(R03, R00); // ADD EBX,EAX;
CmpJmpNotEqu32(R01, R00, 3); // CMP ECX,EAX; JNE...
AddShtImm32(R02, 1); // ADD EDX,2
CmpJmpNotEqu32(R02, R00, 2); // CMP EDX,EAX; JNE...
ApiWaitForExit32(); // CALL ApiWaitForEx...
End();
https://essen.osask.jp/files/pic20230407a.png
-補足
--XorやAddなどの演算命令についているShtはshortの略。ショ...
--Immがついているものは最後の引数がimm。
** 2023.04.09 Sun #1 [casm]
-結局casmで書いてもアセンブラで書くみたいには高速化されな...
-私はcasmを自作のLLVMモドキだと思っているのです。LLVMの場...
-ここまで書いて分かったのは、casmがLLVMの劣化版だとするな...
-うーん、次の一手としては、HL-9がcasmを出力するとか??
** 2023.04.10 Mon #1 [casm]
-x64が出たとき、関数呼び出しの方法が変わって、一部レジス...
-でも自分でcasmみたいなものを作ればいろいろ実験ができる気...
-第一世代OSASK方式:
--引数へのポインタはEBXで渡していました。たいていの場合ス...
** 2023.04.10 Mon #2 [casm]
-C言語にはintptr_tという型があります(同様のものがacl1ラ...
-そもそもポインタを整数のフィールドに格納しておきたいとき...
-理想ではそうでも、実際はポインタからintに変換しているよ...
** 2023.04.11 Tue #1 [casm] [easy-C]
-よし、とりあえずHL-9でcasmの出力ができるようになりました。
HL9>print 1+2
3
HL9>casm 1
HL9>print 1+2
LdImm32(R00, 1);
AddLngImm32(R01, R00, 2);
ApiPrintReg32(R01);
End();
HL9>print 1+2+3
LdImm32(R00, 1);
AddLngImm32(R01, R00, 2);
AddLngImm32(R02, R01, 3);
ApiPrintReg32(R02);
End();
HL9>
// *=など、ACalFnc
// persistent-C
//一覧を得る関数があって、後は自分でフィルタ・ソートする。
//kvs, 言語は型を知るべき, 言語はオブジェクトを知るべき
//winのクローズ
* こめんと欄
-掲示板をご利用ください。→[[a23_bbs]]
ページ名: