CASL Ⅱ - プログラミングの基礎(スタック操作命令 コール,リターン命令)
 前へ 目次へ 次へ

 (4) スタック操作命令 コール,リターン命令

 (A) スタック操作命令

 スタックとは、床に本を積み重ねていくとき、最後に置いた本が一番上にくる。その本を取り出すときは一番上から取る約束としておく。ここで本をデータと考え、これをメモリ上に実現したものがスタックである。First In Last Out(FILO)という。すなわち、一番最後に入れたデータを、一番最初に取り出すことができる、一時的なデータ格納用領域として使われることが多い。スタック領域はSP(スタックポインタ)で管理される。

 スタックを使用するための命令がPUSH(PUSH, プッシュ)、POP(POP, ポップ)である。PUSH命令がスタック領域にデータを格納する命令で、POP命令がスタック領域からデータを取り出す命令である。

 このスタックを利用しているものにCALL(CALL subroutine, コール)とRET(RETurn from subroutine, リターン)がある。CALL命令はサブルーチン(サブプログラム)を呼出し、RET命令で呼出し元に戻る。このとき、呼出し元へ戻るためのアドレスをスタックに記憶させている。

命令例 動作
PUSH  100 スタックに100を記憶する。
PUSH  0, GR0
PUSH  0, GR1
スタックに(0+GR1の内容)を記憶する。
すなわち、GR1をスタックに記憶することになる。
POP  GR2 スタックから取り出したデータをGR2に格納する。
一度にレジスタGRをスタックに記憶するのに便利なマクロ命令が用意されている。
  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となる。

 
 
123
GR1
123
GR2
789
 
789
123
GR1
123
GR2
789
 
 
123
GR1
789
GR2
789
 
 
     
GR1
789
GR2
123
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様から誤りのご連絡をいただきました。

 

 

inserted by FC2 system