アプリ版:「スタンプのみでお礼する」機能のリリースについて

【3+5の計算をするプログラム】
シミュレータで汎用レジスタの内容をトレースしていったのですが
初心者なもので、どうしてそうなるかわからなかったので質問
させていただきます。


アドレス SMP0613 START
8000   PUSH 5
8002 PUSH 3
8004 CALL SUB
8006 POP GR6
8007 ST GR6,ANS
8009 RET
800A ANS DS 1
END
SUB START
800B POP GR7
800C POP GR1
800D POP GR2
800E ADDA GR1,GR2
800F PUSH 0,GR1
8011 PUSH 0,GR7
8013 RET
END
800B番地までトレースするとGR7に8006番地が格納されました。
GR7に数字の3が格納されると思ったのですが、その下のGR1に3が
格納されました。なぜこうなるのか教えていただきたいです。

また、CALLを抜けるとGR6をスタックからPOPすることになるのですが、
この内容が8になっていました。

スタックの仕組みについて触れながら説明していただきたいです。
よろしくお願いいたします。

A 回答 (1件)

スタックはFILO(First In, Last Out=最初に入れたものが最後に取り出される)データ構造です。


実行される順番でスタックの中を追いかけてみましょう。
以下はアドレス、スタックの先頭→最後の順に並んでいます。

8000 5
8002 3 5
8004 8006 3 5
  ※CALLは戻り先(=CALLの次の行)のアドレスをスタックに格納してから指定番地にジャンプします
800B 3 5  ←戻り先の8006がGR7に取り出される
800C 5    ←3がGR1に取り出される
800D     ←5がGR2に取り出される
800E 
800F 8
8011 8006 8
8013 8    ←RETを実行するとスタックの先頭の戻り先アドレスを取り出してジャンプ
8006     ←8がGR6に取り出される

ポイントはCALLもスタックを使うと言うところですね。
    • good
    • 0
この回答へのお礼

なるほど。スタックは自分ではわかっていたのですが、
コールの使い方をよくわかっていませんでした。
わざわざトレースしていただいてありがとうございました^^

お礼日時:2009/07/30 17:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!