3

私の質問は: 私がこのようなものを持っているとき:

lea rax, rbp - 8

// コードにローカルの "int" 変数があるため、これはスタック上の int である可能性があります。私がこれを行うとき、CPUはデータがどこにあるかをどのように知っていますか:

mov qword [rax], 14

つまり、それは単なるアドレスです... にメモリを予約していたらどうなる2^64 - xでしょうか?

割り当てられたメモリにこの種のアドレスがありませんか?

または、割り当てられたメモリと同じアドレスになるまでスタックが成長した場合はどうなるでしょうか?

それは起こりますか?

アセンブラーは rax の数値を認識しないため、near JMP や far JMP のように MOVstack や MOVheap にすることはできません。

4

1 に答える 1

6

この mov qword [rax], 14 を実行すると、CPU はどのようにしてデータがどこにあるかを知ることができますか?

データがスタック上にあるかヒープ上にあるかをCPUが知る必要があるのはなぜですか? どちらも同じ場所、RAM にあります。

つまり、それは単なるアドレスです... 2^64 でメモリを予約していたらどうなるでしょうか

アドレスがアドレス空間よりも大きい場合、そこにメモリを予約することはできません。

または、割り当てられたメモリと同じアドレスになるまでスタックが成長した場合はどうなるでしょうか? それは起こりますか?

はい、それは発生します。これはスタックオーバーフローと呼ばれます:)、おそらくセグメンテーション違反が発生します。

アセンブラは rax の数がわからないため、MOVstack と MOVheap にはなりません。

私が知る限り、スタックまたはヒープにアクセスするための個別の命令はありません。前述のように、スタックとヒープは両方とも RAM に存在します。CPU が気にするのは、読み書きするアドレスだけですが、一部のアーキテクチャでは、メモリにマップされた I/O を持たないアーキテクチャでは、I/O レジスタにアクセスするための特別な命令があり、ほとんどのアーキテクチャでは I/ O は単なる別のメモリアドレスです。

コンピュータ アーキテクチャに関する本を読む必要があります。この本をお勧めします。Computer Organization and Design, 4th Ed by Patterson です。

于 2012-11-13T20:29:13.467 に答える