dポイントプレゼントキャンペーン実施中!

ファイルレジスタf1が定義されていて
ADDWF f1,f ;f1=W+f1(=は代入演算子)を実行するとき,
(1) W+f1を行なうには,f1のメモリにアクセスする必要があります。
(2)f1=W+f1を行なうには,再度f1のメモリにアクセスする必要があると思いますが,
この命令は1命令サイクルで実行されます。
ところで,
MOVWF f ; W->f
も1命令サイクルで実行されます。
しかし,この命令はメモリに一度アクセスするだけです。

ADDWF f1,f
は1命令サイクルで本当に2度メモリアクセスしているのでしょうか?
それとも,また違った方法で実行されているのでしょうか?
(出典付き,でお教えていただけるとありがたいですが)

A 回答 (3件)

PIC16F193Xのデーターシートで説明します


http://www.microchip.jp/docs/41364B_JP.pdf
「26.1 Read-Modify-Write 操作」で説明されていますが、ADDWF Freg ,d (F or W)格納先指定により演算結果をF=ファイルレジスタかW=Wレジスタに格納するかの違いです
「図 1-1: PIC16F193X/LF193X のブロック図」により演算はALUで行われWregとFreg(RAM)は同じバス上にあり同じ扱いです、(ALUからFregへデータを直接転送可能)


PICはシステムクロックの1/4が命令実行サイクスになります。
(20MHz動作時は命令サイクル5MHz,1命令実行時間200nS)
    • good
    • 0
この回答へのお礼

ありがとうございます。
read-modify-writeを読んだ記憶だけありましたが理解せずにおりました。
今回,意味がわかりました。
回答No.2 さんで気付いたのですが,回答No.3さんで,よりはっきりしました。

お礼日時:2014/07/09 18:14

http://www.piclist.com/images/www/hobby_elec/pic …
http://www.piclist.com/images/www/hobby_elec/pic …

f1(f)はファイルレジスタ:0-127とされていますが、他のCPUのメインメモリ相当では無く、レジスタ相当となっています。
レジスタ数が8,16,32等のCPUがありますが、それが128個まで増やされており、CPU内蔵で1クロックアクセス(リード、ライト同時アクセス)が可能な構成になっていると考える事が出来ます。

レジスタ、或はフリップフロップは読み出しパスと書き込みパスが別々に設けられており、命令クロックの立ち上がりサイクルでそれまでのデータを読み出しが行われ、1クロックの間その値を読み出し続けます。
一方同一サイクル内の先頭のクロック立ち上がり時点で、(前サイクルのCPU演算結果の)書き込みパスのデータ取り込みもパラに可能です。

但し、書き込まれたデータが安定して読みだされるまでには時間が掛かるので、書き込まれたデータを次のサイクルで使用しようとした場合には、CPU内部でチェックしてダミーサイクルの挿入が行われます。

(最近のインテルCPU等では、このような場合もダミーサイクル無しで実行出来るようにCPU内蔵のテンポラリレジスタが追加される等の強化が行われているようです)

前サイクルでの書き込みfレジスタ番号と、次のサイクルの読み出しfレジスタ番号が別番号の場合には、1命令1サイクルで命令の実行が続けられます。

http://www.microchip.jp/docs/DS39703A_JP.pdf
第2章CPU 2.11.1
書き込み後読み取り従属関係ルール

一方通常のメインメモリでは読み出しパスと書き込みパスとして同一のパスが使われており、メインメモリに同一サイクルで読み出しと書き込みをパラに実行する事は不可能で、ロード関係命令とストア命令とは別サイクルで実行されます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
read-modify-writeを読んだ記憶だけありましたが,今回,わかりました。

お礼日時:2014/07/09 18:11

調べていませんが、


PCIではパイプライン処理してませんか?
次の命令実行中に、2度目のメモリアクセスをしているのだと思いますよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!