いつもお世話になっております。独学で情報処理の勉強をしています。昨日CASLIIをキャスルツーと読むことを知ったぐらいです。「なるべく専門用語を使わないで答えてくださる方」よろしくお願いします。
基本情報午後の選択はCASLIIがいいと思って参考書を読んでみたのですが、とても難しく、ネットで検索していたら理解を深めるための記事みたいのがあったのですが、【主プログラムから副プログラムのデータの受け渡し】ということで以下のことが書かれてます。
LAD GR1,123 ;GR1に123を格納する(主プログラムの先頭) PUSH 0,GR1 ;123をスタックに格納する
LAD GR2,456 ;GR2に456を格納する
PUSH 0,GR2 ;456をスタックに格納する
CALL SUB1 ;副プログラムSUB1を呼び出す
POP GR3 ;加算結果をスタックからGR3に取り出す
: ;これ以降の処理は省略する
SUB1 POP GR4 ;戻り番地を逃がしておく ←これ!!
POP GR1 ;GR1に456を取り出す(副プログラムの先頭) POP GR2 ;GR2に123を取り出す
ADDA GR1,GR2 ;GR1とGR2の加算結果をGR1に格納する
PUSH 0,GR1 ;加算結果をスタックに格納する
PUSH 0,GR4 ;戻り番地を元通りにする ←ここも!!
RET ;主プログラムに戻る(副プログラムの末尾)
の、戻り番地を逃がしておくが意味がよく分かりません。なので、戻り番地を元通りにするもよく分かりません。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
#1です。
返信が遅くなりました。 m(_ _)m「どこにもPUSHと書いてないのになんで「1 (番地) CALLしたときの戻り番地」となるのですか。」
「CALLしたらスタックに番地をPUSHする決まりがあるのですか。」
「なんでそうする必要があるのですか。」
「具体的には番地っていくつですか。」
まずは、CASL2の仕様から見てみましょう。
1.1 (5)
PR(プログラムレジスタ,Program Register) は、次に実行すべき命令語の先頭アドレスを保持している。
1.1(7)コール,リターン命令
CALL
SP ←(SP)-1,
(SP)←(PR),
PR←実行アドレス
RET
PR←((SP)),
SP←(SP)+1
と、なっています。
コールするときCASL2はスタックポインタの値を1すすめて、そこに今現在のプログラムレジスタの値を格納します。これは、CALL命令の次の命令をさしています。そのあと、プログラムレジスタに実行アドレス(サブルーチンの先頭アドレス)を代入しています。
事実上CALL命令はPUSHしなくてもプログラムレジスタの値をスタックに積むことができるのです。
そして、RET命令の時はスタックから元々のプログラムレジスタの値、つまりCALL命令の次の命令のアドレスを「POP」しているのです。
これで、1、2、4番目の補足質問はいいでしょうか?
また、3番目の補足質問についてはサブルーチンが色々なところから呼ばれるものだというのが理由です。CALL命令で呼ばれた先はどこから呼ばれたのかは判りませんからどうにかして教えてあげないと、正しく命令を実行することができません。
例えば、110番地からCALLしたときのプログラムレジスタの値はCALL命令の次の命令を指していますが、サブルーチンにジャンプしたときは、サブルーチンの先頭アドレスを指しています。これでは、RET命令を実行したときにどこに帰ればいいのかが判りませんからスタックに戻り先を格納しておくのです。
判りました?
う~・・
お返事を待ち望んでいたのですが、やはり難しいです。独学で勉強しているせいか何か根本的なところが分かってないような気がします。2回も回答して頂いて分からないのも申し訳ないのですが、4回とか回答してもらって分からないともっと申し訳ないので諦めます・・。
どうもありがとうございました。
No.1
- 回答日時:
スタックは後から入れたものを先に取り出す方式になっているためです。
最初からスタックの中を追いかけてみましょう。
1 (123) PUSHしたときの値
2 不定
3 不定
↓
1 (456) PUSHしたときの値
2 (123) PUSHしたときの値
3 不定
↓
1 (番地) CALLしたときの戻り番地
2 (456) PUSHしたときの値
3 (123) PUSHしたときの値
※ここでPOPするのですが、スタックの1番しか取り出すことができません。また、RET命令はスタックから戻り番地を取り出します。なので、実際に計算させたい値を取り出すには3回POPしないといけないのですが、最後のRET命令も考慮しなくてはいけません。
1 (456) PUSHしたときの値 → GR4に戻り番地を退避させます
2 (123) PUSHしたときの値
3 不定
↓ ここで、2回POPして計算させます。2回POPした後のスタックは、
1 不定
2 不定
3 不定
となっています。
計算結果をPUSHします。
1 (579) PUSHしたときの値
2 不定
3 不定
↓ GR4に退避させた戻り番地をスタックに積みます。
1 (番地) CALLしたときの戻り番地
2 (579) PUSHしたときの値
3 不定
↓ ここで、RET命令が実行されるとスタックから番地が取り出されます。
1 (579) PUSHしたときの値
2 不定
3 不定
↓ 計算結果をPOPします。
GR3←579
判ります?
この回答への補足
回答ありがとうございます。が、難しいです。
CALL SUB1 は、SUB1を呼び出すということで、どこにもPUSHと書いてないのになんで「1 (番地) CALLしたときの戻り番地」となるのですか。CALLしたらスタックに番地をPUSHする決まりがあるのですか。なんでそうする必要があるのですか。具体的には番地っていくつですか。
質問ばかりですみません。よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 【CASLプログラム】 定数(80と55)を確保し、その和をGR1に、その差をGR2に求めるCASL 1 2022/12/16 01:17
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Perl perlのプログラミング 部分入れ替えの方法 1 2022/10/11 22:26
- その他(プログラミング・Web制作) 機械語に詳しい方 2 2022/07/10 12:06
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- システム CPUの問題について 2 2022/07/09 12:04
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
医師・看護師・助産師
薬剤師・登録販売者・MR
医療事務・調剤薬局事務
歯科衛生士・歯科助手
臨床検査技師・臨床工学技士
理学療法士・作業療法士・言語聴覚士
臨床心理士・心理カウンセラー・ソーシャルワーカー
介護福祉士・ケアマネージャー・社会福祉士
弁護士・行政書士・司法書士・社会保険労務士
フィナンシャルプランナー(FP)
中小企業診断士
公認会計士・税理士
簿記検定・漢字検定・秘書検定
情報処理技術者・Microsoft認定資格
TOEFL・TOEIC・英語検定
建築士
インテリアコーディネーター
宅地建物取引主任者(宅建)
不動産鑑定士・土地家屋調査士
マンション管理士
電気工事士
美容師・理容師
調理師・管理栄養士・パティシエ
シェフ
保育士・幼稚園教諭
教師・教員
国家公務員・地方公務員
警察官・消防士
その他(職業・資格)
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Zと2とか紛らわしいのがあるか...
-
グーグルの障害者訓練プログラ...
-
三菱製PLC:ファイルレジスタ(...
-
初心者です。プログラムを作り...
-
PostgreSQL+DataGridView
-
マスクROM と PROMの違いについて
-
テストについて
-
プログラマーの土日のみのアル...
-
プログラムソースの値段
-
プログラムを作ってもらう費用
-
マシニングセンタ プログラム...
-
三菱シーケンサーA1SHCPUとA1SJ...
-
ソケット通信の受信処理につい...
-
納品 vs ご納品 どちらが正し...
-
「スポット受注」はどういう意...
-
営業職をやってます。先月発注...
-
敬語チェックお願いします!
-
スーパー発注し始めて3週間たち...
-
texに関する初歩的な質問
-
納期の前倒しを依頼する場合 ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Zと2とか紛らわしいのがあるか...
-
テストについて
-
三菱製PLC:ファイルレジスタ(...
-
プログラマーの土日のみのアル...
-
グーグルの障害者訓練プログラ...
-
オーバレイ方式と仮想記憶シス...
-
インプットとアウトプット
-
プログラムソースの値段
-
エントリーシート
-
初心者です。プログラムを作り...
-
PostgreSQL+DataGridView
-
三菱シーケンサーA1SHCPUとA1SJ...
-
マスクROM と PROMの違いについて
-
システムを作るにあたり、SQLSe...
-
プログラムのバージョンが上が...
-
東京でヨコイのソース買えますか?
-
マシニングセンタ プログラム...
-
フライに天つゆ
-
ナショナル NE-1401F の業...
-
3000行位の帳票作成プログラム...
おすすめ情報