(since 1998/11)(更新 2004/02/26)

TNO:CASL入門[15]

情報系/IT系の広告を掲載しています。(広告一覧)
©Copyright 1998-2001,2003,2004 小野智章(小野情報設計)
無断転載を禁止します。
本ページは、「Rook」仕様に対応済みです。
CASL入門[目次]
CASL入門[索引]
CASL入門[14]
CASL入門[16]

(chapter15-page1)
15-1.スタック・ボトム

 PUSHとPOPの数が一致しない時は、どうなるでしょうか? 実際にPUSHとPOPの数を変えて、どうなるか試して下さい。 (プログラム例は示しません。 どの様に修正すれば良いか、自分で考えて下さい。)

 PUSHの方が多い(POPの方が少ない)場合は、 表示例は示しませんが、この例では一応正常に終了します。 (本アセンブラ独自仕様のEXIT命令でなく、 RET命令で終了しようとする場合は、異常が発生します。) しかし、スタックにはデータが残ったままです。 もし、スタックに残ったデータの方を取り出したかったとすると、 正しい結果は得られません。

 PUSHの方が少ない(POPの方が多い)場合は、次の様になります。
Input : GR1 = 66(0042)
GR0=66(0042)
>5; pop gr1
error:Pop元SP[8000]は、スタックの有効範囲ではありません。
PR[000B;S+11]が指定したPOP命令は、実行出来ませんでした。
 「error」は、実行出来なくなる「異常があった」という意味です。 「Pop元…スタックの有効範囲ではありません。」は、 「Popするアドレスはスタック用ではなかった」という意味で、 つまり「スタックの範囲外からPOPしようとした」ために 異常が発生しているのです。
注意!Rookでは、独自の判定機能によってこの異常をチェックしています。 一般的には、この様なチェックは出来るとは限りません。
 この様な、それ以上POPすることの出来ない スタック・ポインタのアドレスのことを、 スタックの底という意味で、 「スタック・ボトム」と 呼びます。 又、プログラム実行開始時点では、OSによって、 スタック・ポインタはスタック・ボトムを指す様に設定されています。

 この様に、PUSHとPOPは対応させて使用する必要があります。 特に、条件付の分岐命令を使う時は、 実際に実行されるPUSHやPOPの対応関係が 分岐命令の条件によって崩れることの無い様に、注意して下さい。
 又、RPUSHとRPOPもスタックを使用するので、 同様に対応させる必要があります。 これらは7件のデータのスタックを一度に扱うため、 厳密にはデータ件数さえあっていれば、 PUSHやPOPと対応させることも可能です。 が、RPUSHとRPOP、PUSHとPOPで順序良く対応させて、 混乱を避けた方が良いです。

(chapter15-page2)
15-2.スタックとサブルーチン

 以前出てきたサブルーチンの実行で、 RET命令でサブルーチンから呼び出したプログラムへ戻っていました。 さて、同じサブルーチンが何ケ所からも呼び出されている時、 この戻るアドレスはどの様にして分かるのでしょうか?

 実は、このサブルーチンから戻るアドレスはスタックに保存されていたのです。 サブルーチンの実行の様子は次の様になります。
 因みに、スタックに入れられるCALL命令の次の命令のアドレスのことを、 サブルーチンから「戻る(Returnする)」アドレスという意味で、 「戻りアドレス(Returnアドレス)」と呼びます。

 CALL/RET命令の前後のスタック・ポインタの値は どの様になっているのでしょう。 次のプログラムを実行して、スタック・ポインタの値を確認してみましょう。 ただし、操作ボタン群の左側にある「Alart」操作欄の設定が 「Alart時、停止」になっていると、 途中で停止します。 「Alart表示」に切替えて、実行して見てください。
(chapter15-page3)
SAMPLE  START
  WRITE  −1 ; SP
  CALL  TEST
  WRITE  −1 ; SP
  EXIT
TEST
  WRITE  −1 ; SP
  POP  GR1
  PUSH  0,GR1 ; STACK RECOVER
  WRITE  ; RET−ADDRESS
  PUSH  ; PUSH VALUE
  WRITE  −1 ; SP
  POP  GR0
  WRITE  −1 ; SP
  RET
  END
SP=-32768(8000)
SP=32767(7FFF)
>9; POP GR1
alart:Popしようとしているスタック・データは、用途が違います。
GR1=6(0006)
SP=32766(7FFE)
SP=32767(7FFF)
>16; RET
alart:Popしようとしているスタック・データは、用途が違います。
SP=-32768(8000)
プログラムは、PR[000A;SAMPLE+10]が指定したEXIT命令で終了しました。

 「alart」は、実行継続が可能な「異常があった」という意味です。 「Popしようとしているスタック・データは、用途が違います。」は、 CALL命令で保存された戻りアドレスをPOP命令で取出そうとした、 或いは逆に、PUSH命令で保存したデータを RET命令で戻りアドレスとして取出そうとした、 と言う意味です。
 この様に、CALLはPUSHと、 RETはPOPと、それぞれ対応した動作をしていることが分かります。 ということは、PUSH/POPと同様、 CALLとRETも対応させる必要があります。
 また、サブルーチン中のPUSH/POP命令は、 サブルーチン内だけで対応関係を持たせる必要があるので、 注意しておいて下さい。 サブルーチン中でのPUSH/POP命令の対応関係が崩れると、 次の様な異常動作をしてしまいます。

(chapter15-page4)
 RPUSHとRPOPも同様です。

CASL入門[目次]
CASL入門[索引]
CASL入門[14]
CASL入門[16]
学習室
トップ・ページへ

質問・ご意見等、お待ちしております。
小野智章(小野情報設計) 
Mail to Mail連絡先
©Copyright 1998-2001,2003,2004 小野智章(小野情報設計)
無断転載を禁止します。