« MIDIのページを変更しました。 | トップページ | サクラ・おふかい »

2006/06/01

アセンブリ言語 パイプラインについて

ユーザー様からフィードバックがあって、wonder Swanの開発環境と、Microsoft Macro Assemblerを取り出して、久々にアセンブリ言語を触りました。
命令の機能や、フラグの変化などは覚えていましたが…パイプラインの最適化の方法を忘れて居るではありませんか!!

ということで、V30Mzのアプリケーション・マニュアルを探して読んでみました。
ついでに、パイプラインというのを、アセンブリ言語レベルで解説しようと思います。

CPUの回路動作としては、大まかには、
 (1) プリ・フェッチ (メモリからコードを読む)
 (2) デコード (どんな命令なのか解釈する)
 (3) 実行
の順番に実行されます。この(1)と(2)は、それぞれ1クロック要し、(3)は命令によって異なります。
即ち1命令実行するには最低でも3クロックを要するのですが、V30MZというCPUは上記の(1), (2), (3)を並列して実行出来るように設計されています。

なので、もし、以下の命令を実行するとしたら、
 mov si,01000h …(1)
 mov ax,[si]  …(2)

1.メモリから、(1)の命令をフェッチする。
2.(1)の命令をデコードすると同時に、
  (2)の命令をプリ・フェッチする。
3.siに0x1000を入れる。(2)の命令デコードを試みるが
  siレジスタが使用中なにで、デコードできない。
  (この命令のデコード=実効アドレスの計算。)
  ↑パイプラインの無駄になる。
4.再度、(2)の命令をデコードする。
5.axレジスタに、si番地の内容を入れる。

※実効アドレスとは、セグメントアドレスと、オフセットアドレスから計算できる、論理回路上のメモリアドレスです。


と、本来なら6クロックかかるものが、5クロックで実行出来るわけです。ただし、上のソースはパイプライン処理の観点からは命令の並び方が宜しくありません。
実効アドレスの計算にレジスタを使用する場合、デコード・サイクルにて実効アドレスが計算される為、それまでにレジスタを更新しておく必要があります。
すなわち、(2)の命令の後ろに、
 mov dx,01c00h  …(3)
等の命令があった場合は、この1クロックの無駄を無くすために、(1)と(2)の間に入れておけば、1クロック短くなります。

まとめると、

 mov si,01000h ;(1)
 mov ax,[si]  ;(2)
 mov dx,01c00h ;(3)
上は、合計で6クロックかかるが、

 mov si,01000h ;(1)
 mov dx,01c00h ;(3)
 mov ax,[si]  ;(2)
この様に実行する順番を変えるだけで、5クロックに減らせるのです。

パイプラインが無い場合、この3命令だけで9クロック掛かるわけです。

|

« MIDIのページを変更しました。 | トップページ | サクラ・おふかい »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/36969/10353622

この記事へのトラックバック一覧です: アセンブリ言語 パイプラインについて:

« MIDIのページを変更しました。 | トップページ | サクラ・おふかい »