基本情報技術者〜CPU[3]〜



f:id:potato_head0809:20210116010233p:plain




こんにちは!ポテトヘッド(@potato_head0809)です!



前回の記事を読んでいない方はぜひこちらをご覧ください。


 

potato-head0809.hatenablog.com

 


今回は命令レジスタがメモリアドレスを指定する様々な方法について触れていきます。



では早速始めていきましょう!



アドレス指定方式



コンピュータに指示を与えるときには、



コンピュータが理解できる言葉で指示を出さなくてはいけません。



日本語の離せない外国の方に日本語で指示を出していてもダメですよね?



その、コンピュータが理解できる言葉というのが「機械語」になります。



さて、今回の話に入りますが、まず「命令」が何で構成されていたか



覚えていますでしょうか。



それは「命令部」と「オペランド部」でしたね!



もう一度、簡単に説明しておきますと...。



   

「命令部」

   
   

実行させたい命令の種類を示すコードが入っているところ



   

オペランド部」

   
   

処理対象のデータを収めたメモリアドレスなどが入っているところ



どうでしょうか。思い出しましたか??



なので、命令は「何を(オペランド部)どうしろ(命令部)」ということになります。



この「何を」の部分が、命令の種類によっては、



必ずしもメモリのアドレスが入っているとは限りません。



そこで、様々な指定の方式が出てくるので、その内容を見ていきたいと思います。



f:id:potato_head0809:20200708142647p:plain




即値アドレス指定方式



即値アドレス指定方式とは、



オペランド部に対象のデータそのものが入っていることを言います。



f:id:potato_head0809:20200708142610p:plain



直接アドレス指定方式



直接アドレス指定方式とは、

オペランド部に記載しているアドレスが、そのまま



実効アドレスとして使用できるもののことを言います。



f:id:potato_head0809:20200708142903p:plain



間接アドレス指定方式



f:id:potato_head0809:20200708143253p:plain


ここからは少し複雑になります。



間接アドレス指定方式とは、



オペランド部に記載しているアドレスの中に、



「対象となるデータが入っている箇所を示すメモリアドレス」が書かれています。



言葉では分かりづらいかもしれないので、図で見てみましょう。



f:id:potato_head0809:20200708143227p:plain




どうでしょうか。イメージが持てましたか?



簡単に言うと、直接ではなく、間接的に取得しに行っているのです。



インデックスアドレス指定方式



f:id:potato_head0809:20200708143521p:plain



インデックスアドレス指定方式とは、



オペランド部の値に、インデックスレジスタの値を



足し算することで実効アドレスを取得しています。



f:id:potato_head0809:20200708143649p:plain




図でも説明していますが、インデックスレジスタとは



連続した値を扱うときに用いられるレジスタです。



ベースアドレス指定方式



f:id:potato_head0809:20200708144223p:plain




ベースアドレス指定方式とは、



オペランド部の値に、ベースレジスタの値を



足し算することで実効アドレスを取得しています。



「足し算」??



先程のインデックスアドレス指定方式と同じだと思うかもしれませんが



使用しているレジスタが異なるので、全く違うものになります。



では、図で見てみましょう。



f:id:potato_head0809:20200708144159p:plain




このように少し複雑にすることで、



メモリ上のどこにプログラムがロードされても



命令を変えなくて良いというメリットがあります。



相対アドレス指定方式



f:id:potato_head0809:20200708144510p:plain




相対アドレス指定方式とは、



オペランド部の値と、



プログラムカウンタの値を



足し算することで、実行アドレスを求めています。



先程は、「インデックスレジスタ」や「ベースレジスタ」でしたが、



今回は「プログラムレジスタ」です!



f:id:potato_head0809:20200708144708p:plain




これは、ベースアドレス指定方式と似ています。



では、どういう時に使うのか。



それは、「ベースレジスタは持たないが、こうしたい!」というときです。



最後に。



どうだったでしょうか。



実行アドレスを求めるだけで、こんなにも



様々な方法があって覚えられないって思ってしまいそうですよね。笑



ですが、大体のイメージを持っていれば、似ているものもあるので



覚えられるのではないかと思っています!



最後までご覧頂きありがとうございました。



また、次回もよろしくお願い致します!