機械語のアドレス指定方式

f:id:ryoutaku_jo:20190814003538p:plain

【結論】

・コンピュータに指示を伝える為には、コンピュータの理解できる0と1で構成された機械語(命令語)」で伝える必要がある

・命令語は、命令の内容にあたる「命令部」と、処理対象のデータの場所を示すオペランド部」で構成されている

オペランド部でのデータの場所の示し方は、「即値・直接・間接・インデックス(指標)・ベース・相対」アドレス指定方式の6パターン存在する

【目次】

【本題】

コンピュータへの命令方法

コンピュータに様々な処理を指示する為には、コンピュータが理解できる言葉で指示を行う必要があります。

そのコンピュータが理解できる言葉とは、0と1で構成された機械語(命令語)」と呼ばれるものです。

命令語は、命令の内容にあたる「命令部」と、処理対象のデータの場所を示すオペランド部」で構成されています。

オペランド部ののデータの場所の示し方には、「即値・直接・間接・インデックス(指標)・ベース・相対」アドレス指定方式の6パターン存在します。

即値アドレス指定方式

対象となるデータそのものが入っている方式です。

そのデータをそのまま利用すれば良いので、メモリへの参照は必要ありません。

・手順
1:オペランド部のデータをそのまま利用する

直接アドレス指定方式

データの入っているアドレス(実効アドレス)がそのまま記述する方式です。

そのアドレスを参照すれば、対象のデータを確認できます。

・手順
1:オペランド部のアドレスから、メモリを参照する
2:メモリのデータを利用する

間接アドレス指定方式

実効アドレスが入っているメモリのアドレスを記述する方式です。

オペランド部に記述されているアドレスを経由して、対象のデータが格納されている場所を特定します。

・手順
1:オペランド部のアドレスから、メモリ⑴を参照する
2:メモリ⑴に記述されているアドレスからメモリ⑵を参照する
3:メモリ⑵のデータを利用する

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

オペランド部の値と、インデックス(指標)レジスタの値を加算することで、実効アドレスを求める方式です。

インデックスレジスタとは、連続したアドレスを扱うときに用いるレジスタで、配列型のデータ処理などに用います。

・手順
1:オペランド部に記述されているインデックスレジスタ番号から、インデックスレジスタの値を取得する
2:オペランド部の値とインデックスレジスタの値を足した値(アドレス)から、メモリを参照する
3:メモリのデータを利用する

ベースアドレス指定方式

オペランド部の値と、ベースレジスタの値を加算することで、実効アドレスを求める方式です。

ベースレジスタとは、プログラムがメモリ上にロードされた時の先頭アドレスを記憶しているレジスタです。

プログラム先頭アドレスからオペランド部の値の差分で、実効アドレスを特定します。

プログラムがメモリ上のどこでロードされても、命令を変更する必要が無いメリットがあります。

・手順
1:ベースレジスタから、先頭アドレスの値を取得する
2:オペランド部の値と先頭アドレスの値を足した値(アドレス)から、メモリを参照する
3:メモリのデータを利用する

相対アドレス指定方式

オペランド部の値と、プログラムカウンタの値を加算することで、実効アドレスを求める方式です。

プログラムカウンタに格納されているのは、次に実効される命令へのメモリアドレスです。

命令位置を基準として、そこからの差分をオペランド部で指定します。

ベースレジスタを持たない場合でも、命令を変更する必要が無いメリットがあります。

・手順
1:プログラムカウンタから、次に実効される命令のアドレスを取得する
2:オペランド部の値と次に実効される命令のアドレスを足した値(アドレス)から、メモリを参照する
3:メモリのデータを利用する

参考情報

書籍「キタミ式イラストIT塾 基本情報技術者 平成31/01年」

《今日の学習進捗(3年以内に10000時間に向けて)》

CKEditor周りのテストコードを拡充する際に、JavaScriptのテストが正常に完了しない不具合が発生した。 原因は「yarn dev:server」がテスト環境で実行されていないことだった。

私がwebpackやYarnなどフロント周辺の知識に疎いのと、他プロジェクトでは完全にフロントとバックエンドが分離されていない様なので、「yarn dev:server」を実行しなくても正常に動作していたことで、原因特定までかなり時間を要してしまった。

フロント周りの技術が、それぞれどういった役割を持っていて、どの様に影響し合っているのかを理解する必要性を改めて感じた。

こういった過去にあった課題を解決するために作られたツールやフレームワークは、そのものの仕組みだけでなく、作られた背景なども理解しておかないと、正しく扱うのは難しいという印象を持った。

一先ずOSSのコードを参考に、JSのテスト時のみ「yarn dev:server」を実行する様にして改善したが、テストのパフォーマンスが落ちる懸念がある。

テストコードの拡充と並行して、より効果的な方法を探っていきたい。

学習開始からの期間 :249日
今日までの合計時間:2357h
一日あたりの平均学習時間:9.5h
今日までに到達すべき目標時間:2274h
目標との解離:83h
「10,000時間」まで、

残り・・・「7643時間!」