TOP/PROGRAM/まなめ 2000/まなめ命令セットとその文法

まなめ命令セットとその文法

基本文法

まなめ 2000 は 1 行に 1 命令を記述する形式となっています。

他には以下の特徴があります。

コメント

記述形式
スルー力{コメント}
解説

コメントです。この行では何も実行しません。

記述例
スルー力 特にこの行は何もしません
スルー力 この行も何もしないよ
スルー力半角スペースを入れる必要もなしっす

アキュムレータ操作

LOAD_FROM_AC 命令

記述形式
まなめ{まなめ|は|う|す}...
解説

アキュムレータから指定したレジスタに値をロードします。 レジスタの指定は 1 命令で複数指定できます。

記述例

アキュムレータの値を「は」レジスタにロードする

まなめは

アキュムレータの値を「は」レジスタと「う」レジスタと「す」レジスタにロードする。

まなめはうす

LOAD_TO_AC 命令

記述形式
なまめ{まなめ|は|う|す}...
解説

指定したレジスタの値をアキュムレータにロードします。

レジスタの指定は 1 命令で複数指定できますが、実質最後に指定されたの値だけに意味があります。 (一応、内部的には指定した順番にアキュムレータにロードされる。)

記述例

値を「は」レジスタの値をアキュムレータにロードする

なまめは

四則演算

NUM_ADD 命令

記述形式
めまな{まなめ|は|う|す}...
解説

加算を実行します。現在のアキュムレータの値に指定したレジスタの値を足し入れます。

レジスタの指定は 1 命令で複数指定できます。指定した分だけアキュムレータに足し入れます。

記述例

アキュムレータに「は」レジスタの値を足し入れる。

めまなは

アキュムレータに「は」レジスタの値と「う」レジスタの値と「す」レジスタの値を足し入れる。

めまなはうす

アキュムレータにアキュムレータの値を 1 回と「は」レジスタの値を 5 回足し入れる。

めまなまなめははははは

以下、他の計算命令でも似たように応用できます。

NUM_SUB 命令

記述形式
ぬまな{まなめ|は|う|す}...
解説

減算を実行します。現在のアキュムレータの値から指定したレジスタの値を引き入れます。

レジスタの指定は 1 命令で複数指定できます。指定した分だけアキュムレータから引き入れます。

記述例

アキュムレータから「は」レジスタの値を引き入れる。

ぬまなは

NUM_MUL 命令

記述形式
めなま{まなめ|は|う|す}...
解説

乗算を実行します。現在のアキュムレータの値に指定したレジスタの値を掛け入れる。

レジスタの指定は 1 命令で複数指定できます。指定した分だけアキュムレータに掛け入れます。

記述例

アキュムレータに「は」レジスタの値を掛け入れる。

めなまは

NUM_DIV 命令

記述形式
ぬなま{まなめ|は|う|す}...
解説

除算を実行します。現在のアキュムレータの値から指定したレジスタの値を割り入れます。

レジスタの指定は 1 命令で複数指定できます。指定した分だけアキュムレータに割り入れます。

この操作を実行した時、指定したレジスタの値が 0 の場合、エラーになります。

記述例

アキュムレータに「は」レジスタの値を割り入れる。

ぬなまは

NUM_MOD 命令

記述形式
はい、({まなめ|は|う|す})人組み作ってー
解説

余りを求め、その値をアキュムレータに格納します。 現在のアキュムレータの値を指定したレジスタの値で割った余りを、アキュムレータに入れます。

この操作を実行した時、指定したレジスタの値が 0 の場合、エラーになります。

記述例

アキュムレータの値をに「は」レジスタの値で割った余りをアキュムレータに格納する。

はい、(は)人組み作ってー

インクリメント演算・シフト演算

INCREMENT 命令

記述形式
マッチョ
解説

アキュムレータをインクリメントします。要するに 1 足します。

値が 2147483647 の場合、値はオーバーフローして -2147483648 になります。多分。

記述例

アキュムレータをインクリメントする。

マッチョ

DECREMENT 命令

記述形式
ウィンプ
解説

アキュムレータをデクリメントします。要するに 1 引きます。

値が -2147483648 の場合、値はアンダーフローして 2147483647 になります。多分。

記述例

アキュムレータの値をデクリメントする。

ウィンプ

SHIFT_RIGHT 命令

記述形式
こんに(ry
解説

アキュムレータを右シフト演算します。たいがいは 2 で割った値になりますが、 よくわからないならググレカス。俺はおまえのパパじゃない。

記述例

アキュムレータを右シフト演算する。

こんに(ry

SHIFT_LEFT 命令

記述形式
こんにちはこんにちは!!
解説

アキュムレータを左シフト演算します。たいがいは 2 倍の値になりますが、 よくわからないならググレカス。私はあんたのママじゃない。

記述例

アキュムレータを左シフト演算する。

こんにちはこんにちは!!

レジスタ操作

ABSOLUTE_REG 命令

記述形式
('(゚∀゚∩なおるよ!
解説

使用するレジスタを、現在の状態に関わらず表レジスタを使用します。

記述例

現在使用するレジスタを、表レジスタにする。

('(゚∀゚∩なおるよ!

TOGGLE_REG 命令

逆に考えるんだ
解説

使用するレジスタを、現在の状態とは逆のレジスタを使用するようにします。 表レジスタを使用している場合は、裏レジスタを。 裏レジスタを使用している場合は、表レジスタを使用するようにします。

記述例

現在使用するレジスタを、逆のレジスタにするようにする。

逆に考えるんだ

メモリ操作

MEMORY_LOAD 命令

記述形式
まめな{まなめ|は|う|す}...
解説

指定したレジスタの値のアドレスが指すメモリの値を、アキュムレータにロードします。

レジスタの指定は 1 命令で複数指定できますが、実質最後に指定されたの値だけに意味があります。 (一応、内部的には指定した順番にアキュムレータにロードされる。)

この命令を実行するまでに、一度もそのアドレスが指す領域に MEMORY_WRITE 命令を 実行していない場合、エラーとなります。

記述例

「は」レジスタの値のアドレスが指すメモリの値を、アキュムレータにロードする。

まめなは

MEMORY_WRITE 命令

記述形式
なめま{まなめ|は|う|す}...
解説

指定したレジスタの値のアドレスが指すメモリの領域に、アキュムレータの値を格納します。

レジスタの指定は 1 命令で複数指定できます。 指定した全てのレジスタの値のアドレスが指すメモリの領域に、 アキュムレータの値を格納します。

記述例

「は」レジスタの値のアドレスが指すメモリの領域に、アキュムレータの値を格納する。

なめまは

「は」レジスタの値のアドレスが指すメモリの領域と、 「う」レジスタの値のアドレスが指すメモリの領域と、 「す」レジスタの値のアドレスが指すメモリの領域に、 アキュムレータの値を格納する。

なめまはうす

画面出力

PUT 命令

記述形式
{まなめ|は|う|す}...爆発しろ!
解説

指定したレジスタの値をそのまま文字として画面に出力します。 値(数値)がどの文字に対応するのかは、ASCII とか Shift JIS とかその辺勉強してください。

レジスタの指定は 1 命令で複数指定できます。 指定した全てのレジスタの値を順番に出力します。

記述例

アキュムレータの値をそのまま文字として画面に出力します。

まなめ爆発しろ!

アキュムレータの値と「は」レジスタの値と「う」レジスタの値と「す」レジスタの値を、 その順番でそのまま文字として画面に出力します。

まなめはうす爆発しろ!

「は」レジスタの値を 5 回そのまま文字として画面に出力します。

ははははは爆発しろ!

PUT_AS_NUM 命令

記述形式
{まなめ|は|う|す}...爆発しる!
解説

指定したレジスタの値を数値として画面に出力します。

レジスタの指定は 1 命令で複数指定できます。 指定した全てのレジスタの値を順番に出力します。

記述例

アキュムレータの値を数値として画面に出力する。

まなめ爆発しる!

リテラル

LITERAL 命令

記述形式
要は、{文字列}がないんでしょ?
解説

アキュムレータに、指定した文字列または数値をそのままロードします。

文字列は 4 バイトまで指定できます。要するに半角文字で 4 文字まで、全角では 2 文字までです。

文字列中はエスケープシーケンスが使用出来ます。使用可能なエスケープシーケンスは以下です。 意味は他の言語とだいたい一緒です。

\a \b \f \n \r \t
\v \\ \? \' \" \0
記述例

アキュムレータに文字列「a」をロードする。

要は、aがないんでしょ?

アキュムレータに文字列「勇気」をロードする。

要は、勇気がないんでしょ?

アキュムレータに改行文字をロードする。

要は、\nがないんでしょ?

LITERAL 命令

記述形式
ワシの波動球は{数値}式まであるぞ
解説

アキュムレータに、指定した文字列または数値をそのままロードします。

数値は整数のみ、-2147483648 〜 2147483647 の値を指定出来ます。

記述例

アキュムレータに 108 をロードする。

ワシの波動球は108式まであるぞ

アキュムレータに -999 をロードする。

ワシの波動球は-999式まであるぞ

タグ

STATIC_TAG 命令

記述形式
ようこそ{はてなID}さん
解説

現在の位置のタグをつけます。これ自体では何も処理しません。 ジャンプ命令やコール命令のジャンプ先として指定します。

複数の場所に同じ名前を指定することはできません。

「はてなID」の形式ははてな ID の制限を受けます。 実際にどーゆー制限かはてきとーに調べてくだしあ。 ってゆーか、実際にあるはてなIDを使えば良いのですよ。

記述例

この場所に、temtan という名前のタグを付ける。

ようこそtemtanさん

DYNAMIC_TAG 命令

記述形式
また明日から刺身の上にタンポポのせる仕事が始まるお
解説

現在のプログラムコードの行数の値を、アキュムレータにロードします。 DYNAMIC_JUMP 命令や DYNAMIC_CALL 命令でジャンプ先に指定する際に使用します。

記述例

現在のプログラムコードの行数をアキュムレータにロードする。

また明日から刺身の上にタンポポのせる仕事が始まるお

ジャンプ命令

JUMP 命令

記述形式
id:{はてなID}は死ねばいいのに
解説

「はてなID」で指定した場所に処理が移ります。

プログラムコード中に存在しない「はてなID」を指定した場合、エラーになります。

記述例

STATIC_TAG 命令で「temtan」と名付けた場所に処理を移す。

id:temtanは死ねばいいのに

IF_ZERO_JUMP 命令

記述形式
かわいいよid:{はてなID}かわいいよ
解説

現在のアキュムレータの値が 0 であった場合、 「はてなID」で指定した場所に処理が移ります。

そうでない場合、ここでは何も処理が行われずに次の命令に移ります。

プログラムコード中に存在しない「はてなID」を指定した場合、エラーになります。

記述例

アキュムレータの値が 0 であった場合、 STATIC_TAG 命令で「temtan」と名付けた場所に処理を移す。

かわいいよid:temtanかわいいよ

DYNAMIC_JUMP 命令

記述形式
スイーツ({まなめ|は|う|す})
解説

指定したレジスタの値の行数のプログラムコードに処理を移します。

通常は DYNAMIC_TAG 命令で取得した値を使用しますが、別にそうでない値を使用することも可能です。

プログラムコードの全行数よりも大きな値を指定した場合、エラーになります。

この命令、作ったは良いですが、いまいち使い道がわかりません。

記述例

「は」レジスタの値の行数のプログラムコードに処理を移します。

スイーツ(は)

プログラムの最初に処理を移す。 (アキュムレータに 0 をロードして 0 行目に処理を移す)

ワシの波動球は0式まであるぞ
スイーツ(まなめ)

コール命令

CALL 命令

記述形式
これはひどいid:{はてなID}
解説

「はてなID」で指定した場所をサブルーチンコールをします。 一旦、指定した場所に処理が移ります。 処理が移った後に RETURN 命令が実行された時は、処理はこの場所から継続されます。

プログラムコード中に存在しない「はてなID」を指定した場合、エラーになります。

記述例

STATIC_TAG 命令で「temtan」と名付けた場所をサブルーチンコールします。

これはひどいid:temtan

IF_ZERO_CALL 命令

記述形式
id:{はてなID}…恐ろしい子!
解説

現在のアキュムレータの値が 0 であった場合、 「はてなID」で指定した場所をサブルーチンコールをします。 一旦、指定した場所に処理が移ります。 処理が移った後に RETURN 命令が実行された時は、処理はこの場所から継続されます。

そうでない場合、ここでは何も処理が行われずに次の命令に移ります。

記述例

アキュムレータの値が 0 であった場合、 STATIC_TAG 命令で「temtan」と名付けた場所をサブルーチンコールします。

id:temtan…恐ろしい子!

DYNAMIC_CALL 命令

記述形式
ライフハック({まなめ|は|う|す})
解説

指定したレジスタの値の行数のプログラムコードをサブルーチンコールをします。

通常は DYNAMIC_TAG 命令で取得した値を使用しますが、別にそうでない値を使用することも可能です。

プログラムコードの全行数よりも大きな値を指定した場合、エラーになります。

この命令、作ったは良いですが、DYNAMIC_JUMP よりさらに使い道がわかりません。

記述例

「は」レジスタの値の行数のプログラムコードをサブルーチンコールします。

ライフハック(は)

RETURN 命令

記述形式
さあ、はやく作業に戻るんだ
解説

サブルーチンからリターンする命令です。 サブルーチンコール後にこの命令を実行すると、サブルーチンコールした場所に処理が戻ります。

一度もサブルーチンコールされていない時に、この命令を実行した場合エラーになります。

記述例

以前、サブルーチンコールをした場所に処理を戻す。

さあ、はやく作業に戻るんだ

レジスタスタック操作

PUSH 命令

記述形式
ゆっくりしていってね!!!
解説

現在使用しているレジスタ群の値を、レジスタ用スタックに保存します。

典型的な使い方として、サブルーチンの最初に使用して呼び出し元のレジスタを保護する使い方があります。

記述例

現在使用しているレジスタ群の値をレジスタ用スタックに保存します。

ゆっくりしていってね!!!

POP 命令

記述形式
ゆっくりした結果がこれだよ!!!
解説

レジスタ用スタックに格納してあるレジスタ群の値を取り出して、現在使用しているレジスタにロードします。

典型的な使い方として、PUSH 命令とセットでサブルーチンの最後の RETURN 命令の実行の直前に使用して、 保護していた呼び出し元のレジスタを回復させる使い方があります。

それまでに一度も PUSH 命令を実行していない時に、この命令を実行した場合エラーになります。

記述例
ゆっくりした結果がこれだよ!!!

TOP/PROGRAM/まなめ 2000/まなめ命令セットとその文法