また、スタックのサイズは有限であるため、深いレベルでサブルーチン呼び出しを
行ったり、連続してpush命令を使って大量のデータをスタック上に保存したり
しないように注意すること。
例えば、
以下の命令コードを実行すると、レジスタ2に値 30 (16進表記で 1E)が格納される。
レジスタ1(上位16ビット)には0が格納されることに注意する。
LC 1,10 ←レジスタ1に定数10をセット LC 2,3 ←レジスタ2に定数3をセット MULT 1,(2) ←レジスタ1:2に乗算結果
また、以下の命令コードを実行すると、 レジスタ1に商、レジスタ0に余りが格納される。 被除数が16ビット以内に収まる値の場合は、除算命令を実行する前に 上位16ビット(この場合はレジスタ0)に0をセットするのを忘れないこと。
LC 1,10 ←レジスタ1に定数10をセット LC 2,3 ←レジスタ2に定数3をセット LC 0,0 ←レジスタ0(被除数の上位16ビット)に定数0をセット DIV 0,(2) ←レジスタ0とレジスタ1に余りと商を格納
第2オペランドにおいて、カッコを付けないときは定数、カッコを付けると レジスタの指定になる。
※すべての命令において同様である。ADD 1,2 ←レジスタ1に定数2を加算 ADD 1,(2) ←レジスタ1にレジスタ2を加算 ADD 1,3(2) ←レジスタ1にレジスタ2と定数3を加算
命令レジスタの ND部は 8ビットの長さしかないので、指定可能な値は0〜255となる。 これより大きい値を指定してもアセンブラはエラーにしないが、 実際の機械命令コードは下位8ビットの値だけが使われるので注意する。
例えば、以下のような命令コードでもエラーにはならないが、 実際の値は下位8ビットの値なので、予想外の動作になる。
LC 1,300 ←レジスタ1に定数300をセットするつもり 実際は 300 % 256 = 44 (16進表記で 2C)が使われる
例えば、 以下の通り、第2オペランドにレジスタ0を指定すると、レジスタ0の値を 無視して定数0が使用される。
レジスタ0以外の場合は期待通りにレジスタの値が使用される。ADD 1,(0) ←レジスタ1に定数0を加算(レジスタ0ではない) ADD 1,0(0) ←レジスタ1に定数0を加算(レジスタ0は無視) ADD 1,2(0) ←レジスタ1に定数2を加算(レジスタ0は無視) ADD 1,2 ←レジスタ1に定数2を加算
※ これは、ADD命令に対応するマイクロプログラムの定義による。 MICROONE (MICROONE.O)のマイクロプログラムによる機械語命令定義を用いる場合は、 テキスト「マイクロプログラミング」90ページ「(b) 加減算マイクロプログラム(ADD, SUB)」の 図5.11に示されているように、レジスタ0だけが特別扱いされる。 むろん、レジスタ0だけを特別扱いしないように機械語命令のマイクロプログラムを書くことも可能である。 (その場合、定数値をレジスタに代入する操作をどのように実現すればよいか、 考えてみよ)ADD 1,(2) ←レジスタ1にレジスタ2を加算(定数2ではない) ADD 1,0(2) ←レジスタ1にレジスタ2と定数0を加算 ADD 1,3(2) ←レジスタ1にレジスタ2と定数3を加算
3 => 0000 0000 0000 0011 (3を2進表現) => 1111 1111 1111 1100 (全ビット反転) => 1111 1111 1111 1101 (+1加算) => F F F D (-3の16進表現)
使用例: L 1,L1 ←ラベルL1のデータをレジスタ1に読み込む LA 1,L1 ←ラベルL1のアドレスをレジスタ1にセットする LC 1,9 ←定数 9をレジスタ1にセットする LX 1,4(2) ←レジスタ2に定数4を足したアドレスからデータをレジスタ1に読み込む LEA 1,4(2) ←レジスタ2に定数4を足したアドレスをレジスタ1にセットする