#include "osecpu_ask.h"
#define L_func LOCAL(0)
LOCALLABELS(1);
#define func(_r, a, b) R30=a; R31=b; CALL(L_func); _r=R30
// main
do {
func(R00, 2, 3);
api_fillRect(MODE_COL3, R00, 16, 16, 0, 0);
}
api_end(); // これがないと下の関数を再度実行して無限ループになってしまう.
beginFunc(L_func);
do {
Int32s a:R30, b:R31, r:R30;
r = a + b;
}
endFunc();#define func(_r, a, b) R30=a; R31=b; CALL(L_func); _r=R30
#include "osecpu_ask.h"
#define L_func LOCAL(0)
LOCALLABELS(1);
#define func(_r, a) R30=a; CALL(L_func); _r=R30
// main
do {
Int32s ans:R00;
func(ans, 10);
api_putStringDec('\1', ans, 10, 1); // 「OSECPU-ASKA入門 #0015」で解説します.
}
api_end(); // これがないと下の関数を再度実行して無限ループになってしまう.
beginFunc(L_func);
do {
Int32s _a:R30, _r:R30, a:R00, b:R01;
a = _a; // R30以降のレジスタは、関数呼び出しやAPI呼び出しをすると壊れてしまうので、a(=R00)に保存する.
if (a > 1) {
b = a - 1;
func(b, b); // b = func(a - 1);
a *= b; // a = a * func(a - 1);
}
_r = a;
}
endFunc();#include "osecpu_ask.h"
#define L_func LOCAL(0)
LOCALLABELS(1);
#define func_R00_R30() CALL(L_func) // R00で値を渡す. R30で値を返す.
// main
do {
Int32s ans:R00;
R00 = 10; func_R00_R30(); ans = R30;
api_putStringDec('\1', ans, 10, 1);
}
api_end(); // これがないと下の関数を再度実行して無限ループになってしまう.
beginFunc(L_func);
do {
Int32s _r:R30, a:R00, b:R01;
_r = a;
if (a > 1) {
b = a;
a--;
func_R00_R30();
_r *= b; // _r = a * func(a - 1);
}
}
endFunc();| コメント | お名前 | NameLink | |