- ベストアンサー
ビット数とデータ幅について
こんにちは。過去の質問も検索してみましたが、ドンピシャのものがなかったので、質問させていただきます。 現在、ARMの入門書を読みながらアナログデバイスのマイクロコントローラを勉強しています。このデバイスは32ビットなのですが、先入観で特定のアドレスを指定すると、32ビットのデータが出てくるものだと信じておったのですが、実は仮想的にそうしているだけで実際のレジスタ上では8ビット幅のようです。つまり、アドレス4個分使って32ビットのデータ幅を実現していると・・・ エンディアンというキーワードがあるようですね。 したがって、いまある多くのCPUといわれるものは、ミクロな視点からすると、一度に8ビットのデータにしかアクセスしていない、ということでいいのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> そうなれば先ほどのload(0xf000+2*i)などはそのままload(0xf000+i)として16ビットデータを取得できる、ということになるのでしょうか。 いいえ。CPUコアのアーキテクチャとメモリバスは独立です。メモリバスが8ビットであろうが16ビットであろうが32ビットであろうが、メモリアドレスがバイト単位でついている限り、データをロードする命令は load(データの先頭アドレス) です。 16ビットデータロード命令の場合、8ビットバスなら2回、16/32ビットバスなら1回、メモリアクセスが行われます。32ビットバスの場合は32ビットのうち半分のビットにだけデータが乗るとおもってください。 ただし、16ビットバスで奇数アドレスからの16ビットデータロードの場合は、2回に分けてロードされるか、エラーになるか、CPUの機種次第です。 16ビットバスで接続したメモリにシステム取っては、以下の3種類のアクセスモードがあるということになります。 ・偶数アドレスからの16ビットアクセス ・偶数アドレスの8bitアクセス ・奇数アドレスの8bitアクセス オンラインで仕様書が確認できる単純なCPUということで80186を例に挙げますと、アドレスの他にメモるアクセスモードを指定する信号線が1本あります。これにより、メモリアクセスを種別を示します。。
その他の回答 (3)
- Qwerty-36
- ベストアンサー率25% (58/226)
全く違います。回路図を見て、データバスの幅を確認してください。 8bitしか渡せないものはデータバスの幅が8bitです。32bitあれば、一気に32bitアクセス可能です。
お礼
ご回答ありがとうございます。参考になりました。
- a-saitoh
- ベストアンサー率30% (524/1722)
CPUのデータ処理の単位と、メモリのアドレスの粒度は別の概念ですよ。 マイクロコンピュータ系のCPUはバイト単位でアドレスがついていることが多いですが、32ビットずつまとめてあつかいます。ARMがどうなのかは手元に資料がないので分かりませんが、たいていのCPUでは32ビットとか64ビットづつデータにアクセスします。CPU内部のデータ転送もそうです。このため、データを4の倍数のアドレスに置くということをします。 インテルのPentiumなどは、バイト単位でアクセスすること「も」できますが。
お礼
ご回答ありがとうございました。 本回答が、しっくりと納得のいく手がかりになりました。改めて、ARMのデータシートをみてみると、たとえばこのチップはフラッシュROMを抱いていますが32k x 16bitとなっています。このROMへアクセスするためのサンプルCコードもありましたのでみてみると、load(0xf000+2*i)というように、アドレスが2倍とびになっていました。メモリマップをみると、やはりデータbit幅は8bitでアドレス2個分で1データを構成していました。 今回のチップに関してはデータ幅8bit固定でしたが、モノによっては16bit幅であったりするってことですよね? そうなれば先ほどのload(0xf000+2*i)などはそのままload(0xf000+i)として16ビットデータを取得できる、ということになるのでしょうか。
- jacta
- ベストアンサー率26% (845/3158)
> したがって、いまある多くのCPUといわれるものは、ミクロな視点からすると、一度に8ビットのデータにしかアクセスしていない、ということでいいのでしょうか? CPUによります。 また、内部データバスと外部データバスでは、アクセスの単位が異なる場合もあります。 例えば、外部に対しては、16ビット~64ビット程度を単位としてバーストで読み書きし、内部的には、キャッシュに対してアクセスするような場合です。この場合も、ソフト側から見ればバイト等の単位でアクセスすることになります(1バイトが8ビットかどうかはまた別の問題です)。
お礼
ご回答ありがとうございました。
お礼
詳細にご説明いただき、ありがとうございました。おかげでスッキリと理解できました。