2012-09-18 4 views
11

32ビットまたは64ビットのシステムが意味することをよく理解しています。基本的にすべてのレジスタまたはワード長は32または64ビットです。32ビットメモリと32ビットプロセッサでCPUが1バイトのメモリにアクセスする方法

わかりやすくするために、32ビットシステムを使って、int型を宣言するとC言語でプログラムを記述してみましょう。 "int a = 5;" 1ワード長のメモリ位置がvar aのために予約される。だから、いつでも私はそれにアクセスしたいと思います。私はそのメモリロケーションのワードアドレスを使ってアクセスできます。

しかし、私は4文字 "char a、b、c、d; 1バイトであるので、すべて1ワードに配置されているので、char bだけにアクセスしたいのですが(メモリがバイトアドレス可能であると言っています)、今はbがワードの3バイト目です...バスにどうやって来るの? 3バイト目はバスの17〜24行目に配線されていませんか?だから、bだけがアクセスされていると、他の24行に何が起こるのですか?

+0

特定のCPU、特にメモリアドレッシングとCPUレジスタに関する部分について、機械語、アセンブリ言語を確認してください。 – theglauber

+1

@deepak、バイトアドレス指定をサポートする32ビットプラットフォームでは、書き込まれた他の3バイト(Byte Enable信号がオフになる)なしで1バイトをメモリに書き込むことができます。 –

+0

@ EricZ、今私が望むバイトがメモリ内の2番目のバイト(ゼロから始まるカウント)であればどうなりますか?通常、メモリからワードにアクセスすると、2番目のバイトはレジスタのビット位置23〜16の間に上がります。しかし、この場合は7〜0の位置になければなりません。メモリのビット0はレジスタのビット0に、ビット31はビット31に接続するように配線されていると思うので、混乱します。すべての回路では、どのようにビット位置16に着陸すると思われるビットは、バイトアクセス中に位置0に上がる可能性がありますか? – deepak

答えて

3

質問に対する回答は、使用するコンパイラとCPU、メモリコントローラ、メモリアーキテクチャ(キャッシュと外部メモリ)の内部動作によって大きく異なります。
コンパイラを制御できるのは(CまたはC++コンパイラを使用していることが前提です)。コンパイラは、単語サイズより小さい変数を使用している場合に、異なるモードを持っています。速度最適化とメモリ最適化のフラグがあります。これらのフラグがオンになっているかどうかに応じて、コンパイラは4つの変数すべてを1つの単語にパックするコードを生成することがあります。あるいは、コンパイラは、各変数にメモリワードを割り当てることを選択できますが、実際の値を格納するために特定のバイトを使用します。コンパイラがそれぞれのケースでそれを行う方法は、CPUに対して異なる命令セットを生成することです。後者の場合、変数がメモリから読み出されると、ワード全体がバス上に置かれ、汎用レジスタに格納されます。前者の場合、ワードはレジスタに入れられるが、ワードはビット単位でシフトされ、他のビットは論理AND演算を使用してゼロにすることができる。そうすれば、正しいバイトがレジスタに入るでしょう。または、CPUアーキテクチャーが1ワードでバイトレベルのアクセスをサポートしている場合は、CPUによって実行される1つの操作だけになります。 最後に、内部で何が起こるのかを理解することをお勧めしますが、コンパイラによって生成される一連の命令があなたの立場から正しく機能するため、あまり気にしません。気になる唯一の時間は、パフォーマンスに敏感なソフトウェアを書くときです。その場合は、CPUとメモリの詳細と、コンパイラがサポートするフラグを知る必要があります。

3

アセンブラによっては、1ワードのメモリまたはバイトを与えることもできます。
これで、単語に4つの異なる文字があっても、すべてが同時にアクセスされますが、必要なものだけが操作されます。すなわちそれらの全てがメモリからプロセッサに入ると、あなたが望むバイトだけが考慮され、他は拒否される。

関連する問題