CASL Ⅱ - プログラミングの基礎(スタック操作命令 コール,リターン命令) |
(4) スタック操作命令 コール,リターン命令
(A) スタック操作命令
スタックとは、床に本を積み重ねていくとき、最後に置いた本が一番上にくる。その本を取り出すときは一番上から取る約束としておく。ここで本をデータと考え、これをメモリ上に実現したものがスタックである。First In Last Out(FILO)という。すなわち、一番最後に入れたデータを、一番最初に取り出すことができる、一時的なデータ格納用領域として使われることが多い。スタック領域はSP(スタックポインタ)で管理される。
スタックを使用するための命令がPUSH(PUSH, プッシュ)、POP(POP, ポップ)である。PUSH命令がスタック領域にデータを格納する命令で、POP命令がスタック領域からデータを取り出す命令である。
このスタックを利用しているものにCALL(CALL subroutine, コール)とRET(RETurn from subroutine, リターン)がある。CALL命令はサブルーチン(サブプログラム)を呼出し、RET命令で呼出し元に戻る。このとき、呼出し元へ戻るためのアドレスをスタックに記憶させている。
一度にレジスタGRをスタックに記憶するのに便利なマクロ命令が用意されている。
命令例 動作 PUSH 100 スタックに100を記憶する。 PUSH 0, GR0
PUSH 0, GR1スタックに(0+GR1の内容)を記憶する。
すなわち、GR1をスタックに記憶することになる。POP GR2 スタックから取り出したデータをGR2に格納する。
RPUSH … GRの内容を GR1, GR2, …, GR7 の順でスタックに格納する。
RPOP … スタックから順にデータを取りだし、GR7, GR6, …, GR1の順に格納する。
【注意】PUSH 0, GR0とは書けません。指標レジスタとして指定できるのはGR1~GR7です。
例題4-1 GR1とGR2の内容を入れ替える。
EX41 START LD GR1, =123 LD GR2, =789 PUSH 0, GR1 PUSH 0, GR2 POP GR1 POP GR2 RET END
2,3行目でGR1,GR2にデータを格納している。データは適当である。実行の結果、GR1=789、GR2=123となる。
|
GR1
|
→ |
|
GR1
|
→ |
|
GR1
|
→ |
|
GR1
|
||||||||||||||||||||
4行目 PUSH 0,GR1 |
5行目 PUSH 0,GR2 |
6行目 POP GR1 |
7行目 POP GR2 |
一般的にはサブプログラムの中でレジスタの内容が変わってしまっては困るときなどに、そのサブプログラムで使用しているレジスタについて、最初にPUSHしておき、サブプログラムの終わり(RET命令の直前)でPOPする。例えば、あるサブプログラムでGR1とGR3を使用しているときは次のようにする。
SUB START PUSH 0, GR1 PUSH 0, GR3 … 処理 … POP GR3 POP GR1 RET
(b) コール,リターン命令
命令例 動作 CALL SUB SUB番地から始まるプログラムを呼び出す。
実際には、現在の次命令のアドレスをスタックに格納してから、LABEL番地にジャンプする。RET 呼出し元へ戻る。
実際には、スタックから取り出したデータ(アドレス)に1を加算した番地にジャンプする。
例題4-2 GR1とGR2の内容を入れ替えるサブプログラムを作成する。
EX42 START LD GR1, =123 LD GR2, =789 CALL SUB ST GR1, DATA1 ST GR2, DATA2 RET DATA1 DS 1 DATA2 DS 1 END SUB START PUSH 0, GR1 PUSH 0, GR2 POP GR1 POP GR2 RET END
例題4-1のPUSH命令とPOP命令を使った入れ替え処理をサブプログラムにした。最初のSTART命令から10行目のEND命令までがメインプログラムにあたる。11行目のSTART命令から最後までがサブプログラムである。
そのほか、機械語命令にはSVC(SuperVisor Call, スーパバイザコール)やNOP(No OPeration, ノーオペレーション)がある。
CASL Ⅱ | Copyright © 2003,2021 Hiroshi Masuda |
※ 2021.6.5 tedG3様から誤りのご連絡をいただきました。