プログラミングに使用する要素が分かったところで、次は命令文を紹介します。
こちらにすべての命令に対する解説がございますが、ここではよく使用されるものを取り上げ、具体例を交えてご説明いたします。
これらは重要な命令文の一つですが、先ほどのリンクで丁寧に解説されております。
追記事項は特にありません。強いて言うなれば、計算処理におけるゼロフラグとキャリーフラグの動きにご注意ください。
読んで字の如くとはこのこと。なお、下記の使用例における「機械語」については、後述の「実践編」にて解説します。
pc=xxyyとします。すなわち、次に参照される値はxxyy座標となります。
pc=pc+xxとします。ただし、xx≧80のとき、pc=pc-(100-xx)となります。
座標 | 機械語 | ニモニック |
---|---|---|
D000: | C3 06 D0 | jp D006 |
D003: | C3 08 D0 | jp D008 |
D006: | 18 FB | jr D003 |
D008: | (略) | - |
この場合、参照される座標の順番は以下のようになります。
D000(C3)->D001(06)->D002(D0)->D006(18)->D007(FB)->D003(C3)->D004(08)->D005(D0)->D008->…
基礎編で少しだけ触れたsp(スタックポインタ)を扱います。
任意の2つのレジスタに保存されている2ケタの16進数二つを統合し、4ケタの16進数としてspへ上書きします。
spに保存されている4ケタの16進数を上下4bitずつ2ケタの16進数二つに分割し、任意の2つのレジスタへ保存します。
その後、spをpushやcall(後述)される前の値に戻します。
座標 | 機械語 | ニモニック |
---|---|---|
D000: | 01 23 01 | ld bc,0123 |
D003: | 11 67 45 | ld de,4567 |
D006: | 21 AB 89 | ld hl,89AB |
D009: | C5 | push bc |
D00A: | D5 | push de |
D00B: | E5 | push hl |
D00C: | D1 | pop de |
D00D: | C1 | pop bc |
D00E: | E1 | pop hl |
この場合、spの動きは(元のsp)->0123->4567->89AB->4567->0123->(元のsp)となります。
また、各レジスタの最終的な値はbc=4567,de=89AB,hl=0123です。
これらはジャンプとスタック操作を組み合わせた命令です。
上記二つを使っても同じようなことができるため厳密には覚える必要のない命令なのですが、実際に多用されているほか容量の節約になるため、ついでに覚えてしまいましょう。
pcの値をspへ上書きし、xxyy座標にジャンプします。
spの値をpcに入れます。すなわち、サブルーチンから元の場所に戻る命令です。
その後、spをpushやcallされる前の値に戻します。
座標 | 機械語 | ニモニック |
---|---|---|
D000: | CD 05 D0 | call D005 |
D003: | 18 FB | jr D000 |
D005: | C9 | ret |
この場合、参照される座標の順番は以下のようになります。
D000(CD)->D001(05)->D002(D0)->D005(C9)->D003(18)->D004(FB)->D000(CD)->…(以下ループ)
ここまで学習したことを振り返ってみましょう。
問.以下のコードにおいて、参照される座標の順番を答えよ。
D000 | 3E 02 | ld a,02 |
D002 | 3D | dec a |
D003 | 18 FD | jr nz,-03 |
D005 | 16 D0 | ld d,D0 |
D007 | 1E EC | ld e,EC |
D009 | 93 | sub e |
D00A | 5F | ld e,a |
D00B | 18 02 | jr +02 |
D00D | C1 | pop bc |
D00E | C9 | ret |
D00F | D5 | push de |
D010 | CD 0D D0 | call D00D |
D013 | (略) | - |
分かりましたか?答えは以下の通りです(反転)。
D000(3E)->D001(02)->D002(3D)->D003(18)->D004(FD)->D002(3D)->D003(18)->D004(FD)->D005(16)->D006(D0)->D007(1E)->D008(EC)->D009(93)->D00A(5F)->D00B(18)->D00C(02)->D00F(D5)->D010(CD)->D011(0D)->D012(D0)->D00D(C1)->D00E(C9)->D014->…
ここまで来ればあとひといきです。実践編へ行きましょう!