質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

Q&A

解決済

5回答

1254閲覧

CPUのジャンプって戻れないんですか?

VqFeCFRUL0U7zc6

総合スコア5

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

0グッド

0クリップ

投稿2020/08/14 08:40

編集2020/08/14 08:43

CPUの仕組みが書かれている本を読んでいるのですが、

「関数を呼び出すときにはジャンプではなく、コール命令とリターン命令を使う。なぜなら、関数を実行し終わって、プログラムカウンタの値を関数が呼び出されたところに戻す方法がないからだ。」

と書かれています。

でも、関数が呼び出されたときにプログラムカウンタの値を覚えておいて、関数終了後にその次のプログラムカウンタにジャンプすれば良いだけなのではないのでしょうか?(この仕組みがコール、リターンなのだと思いますが、、、だとしたらなぜコール、リターンという名前を付けているのでしょうか。普通にジャンプで戻るではまずいのでしょうか)
戻す方法がないという言葉が引っかかります。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ジャンプと別にコールとリターンがあるCPUの設計思想としては、「1つの命令で複雑なことができた方が良い」ということがあると思います。
「戻りアドレスをどこかに保存して関数へジャンプ」や「戻りアドレスをどこかから取り出してそこへジャンプ」はよく使われる処理の流れなので、専用の命令を作ろうというわけです。

そうでないCPUもあって、例えばリターンの無いCPUはわりと多く、知っているところでARMとMIPSとRISC-Vと、あとPowerPCとSPARCもそうかな。
理由ですが、「命令は単純なもののみにすればCPUは小さくできるし1つ1つの命令は高速に実行できる」ということ、
あとスタックはメモリの読み書きが発生して遅いので、戻りアドレスをレジスタに保管する方が速いという理由もあります。
そうするとリターン側はレジスタの内容でジャンプするという一般的なジャンプ命令で済むようになります。
コール側の専用命令はありますが、命令名はジャンプ&リンクとかブランチ&リンクとするものが多いと思います。ブランチとジャンプはだいたい同じ意味で使われます。戻りアドレスをレジスタに保管することをリンクと呼びます。

この辺の設計思想の違いについてはCISCとRISCで調べるとよいかと。

あとコール側も無いCPUも1つだけ知っています。
SuperFXというCPUで、上記ジャンプ&リンクの内リンクだけをするLINK命令があります。
関数呼び出しはLINK命令と普通のジャンプ命令の2命令です。
ただLINK命令に関数呼び出し以外に出番があるかというとたぶん無くて、結局関数呼び出し専用命令があるのとあまり変わりませんね。

あとは専用のコール・リターン命令ではスタックが足りないなど何らかの問題がある時、コールとリターンは要するにPCをどこかに保存してそこへジャンプすればよいのだと知っていれば、そういうコードを書いて制限を超えることができます。

投稿2020/08/14 18:42

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

CPUによって若干の相違があると思いますが、、、

コール命令: 次の実行アドレスをスタックに積み、指定されたアドレスに制御を移す。
リターン命令: スタックに積まれたアドレスに制御を移す。この時、スタックを一つ戻す。
ジャンプ命令: 指定されたアドレスに制御を移す。

ジャンプ命令だけでも関数呼び出しは実現できますが、関数終了時にどこに制御を戻すか分からないので、そのアドレスをどこかに保存する必要があります。コール命令/リターン命令が使えれば、戻りアドレスの保存、復帰が自動でできます。

なお、アセンブラの小技として、関数の最後が別の関数呼び出しの場合、コール命令でなく、ジャンプ命令を使う事があります。(少し、コードが減って、速くなる)

また、上では、スタックに積むと書きましたが、CPUによっては、特定のレジスタに保存するってのもあった気がします。

投稿2020/08/14 11:56

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

callでアドレスをスタックしretで解放しているので、jumpで戻るとスタックが積まれたままになってしまいます。

投稿2020/08/14 09:18

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

VqFeCFRUL0U7zc6

2020/08/14 09:39

確かにジャンプで戻ったら、スタック解放できないですね!
guest

0

プログラムカウンタの値をどこに覚えておきますか? という問題が発生します。
たとえばサブルーチンへ飛んだ先でさらに別のサブルーチンに飛ぶときとか考えないといけないですよね。

そういう手間を省いてくれるのがコール命令なわけです。

投稿2020/08/14 09:10

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

VqFeCFRUL0U7zc6

2020/08/14 09:36

おお、確かに関数の中から関数を呼び出すとややこしくなりそうですね! コールは便利なんですね!
guest

0

普通にジャンプで戻るではまずいのでしょうか

まずくはないのですが、よく使う処理なのでまとめて書けるほうが効率的ですし、単なるジャンプでなく権限切り替えなどを行っている場合は単なるジャンプで戻れません。x86ではインクリメントも1命令として実装されています。

投稿2020/08/14 09:01

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

VqFeCFRUL0U7zc6

2020/08/14 09:34

なるほど!都合がいいんですね! ところで、権限切り替えっていうのはルートユーザーとかユーザー1とゲストユーザーのことであってますか?そうであるならば、ゲストからルートにアクセスできないのと同じように、ルートからゲストに何かしらの処理を行ったあとゲストの領域からルートユーザーの領域にはジャンプで戻れないということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問