110 likes | 202 Views
C=A+B. 計算機内部での処理は?. A,B,Cに相互関係はない 3つの変数 が必要. move $ A , GR0 add $ B , GR0 move GR0, $ C. なる処理で,メモリ内のデータ領域から,変数 A および B を読み出しながら加算し,再び演算装置内のレジスタ上にある計算結果をメモリ内の変数 C に書き込むことになる.. (注) $変数と表記することで,これらの変数がメモリ上のアドレスを有し,プログラム(の命令)から参照されていることを示す. 総和の計算. 次のように考えることができる.
E N D
C=A+B 計算機内部での処理は? A,B,Cに相互関係はない 3つの変数が必要 move $A, GR0 add $B, GR0 move GR0, $C なる処理で,メモリ内のデータ領域から,変数AおよびBを読み出しながら加算し,再び演算装置内のレジスタ上にある計算結果をメモリ内の変数Cに書き込むことになる. (注)$変数と表記することで,これらの変数がメモリ上のアドレスを有し,プログラム(の命令)から参照されていることを示す
総和の計算 次のように考えることができる Nまでの総和に変数がN個,2Nまでの総和に変数が2N個という状況は変数がデータ領域に格納される以上,プログラムサイズが問題に応じて変化する不定形となる とすれば, 部分和Sに関して,初期値S0を無視しても,n個のデータ領域が必要 メモリの使用効率を含めて,面白くない
固定数の変数で漸化式の表記を実現できるよう,観点を変えて考えてみる 等式(左辺と右辺が等しい)というよりも,代入式(まず右辺を計算し,それを左辺に代入する)と考えられる まず,変数I,SおよびtempSの3つを考える. Iの値を確定したとして,現在のSの値に対して, tempS=S+I を計算する.その結果,tempSを次のSの値として,S=tempS なる代入式で変数Sを更新することができる
命令部での表現: move $S, GR0 ① move $I, GR1 ② add GR1, GR0 ③ move GR0, $tempS ④ move $tempS, GR0 ⑤ move GR0, $S ⑥ ここで,④と⑤は明らかに無駄である.④⑤を省略しても,計算に支障は生じない move $S, GR0 ① move $I, GR1 ② add GR1, GR0 ③ move GR0, $S ④ 命令数で2,データ数(変数の個数)で1を低減できる
変数Iの値を更新する計算手順: I=I+1を考える(もし,代入式であると理解するのが,難しければ,tempI=I+1そしてI=tempIとしても良いが上記と同様の理由で,tempIは省略可能となるが) move $I, GR1 ① add #1, GR1 ② move GR1, $I ③ move $S, GR0 ① move $I, GR1 ② add GR1, GR0 ③ move GR0, $S ④ add #1, GR1 ⑤ move GR1, $I ⑥ S=S+I I=I+1
move #0, GR0 move GR0, $S move #0, GR1 move GR1, $I L1: move $I, GR1 sub #10, GR1 jpgt L2 move $S, GR0 move $I, GR1 add GR1, GR0 move GR0, $S add #1, GR1 move GR1, $I jump L1 L2: halt S: I: 初期化:S=0,I=0 条件分岐: if(I >10) goto L2 S=S+I I=I+1 繰返し(loop)
初期化:S=0,I=0 Flowchart 条件分岐: if(I >10) goto L2 プログラムの実現方法は千差万別である.従って,そのスタイルを図示するフローチャートもまた,同一問題に対しても複数個存在することはなんら問題ではない S=S+I I=I+1 繰返し(loop)
について考える 部分和を求める方法であれば,前回と同じような考え方が可能である 一般形 今回は,n=20の場合について複数の実現法について述べる
//n=20 move #0, GR0 move GR0 , $S add $A1, GR0 add $A2, GR0 add $A3, GR0 add $A4, GR0 add $A5, GR0 add $A6, GR0 add $A7, GR0 add $A8, GR0 add $A9, GR0 add $A10, GR0 add $A11, GR0 add $A12, GR0 add $A13, GR0 add $A14, GR0 add $A15, GR0 add $A16, GR0 add $A17, GR0 add $A18, GR0 add $A19, GR0 add $A20, GR0 halt S: A1: (data) ・・・・ A20: (data) // end of program 扱う数列の数(データ数)が増加する時,命令数も増加することである.やはりここでも条件分岐と繰返しを巧み使用することで,命令数の増加を低減する(固定する)方策を検討したい(多くの場合,計算機の命令セットorレパートリを広げることになる) 命令数: (2+n+1)個 データ数: (1+n)個
move #0, GR0 move GR0, $S move #0, GR1 move GR1, $I L1: move $I, GR1 sub #n, GR1 jpgt L2 move $S, GR0 move $I, GR1 add A1(GR1), GR0 move GR0, $S add #1, GR1 move GR1, $I jump L1 L2: halt S: I: A1: (data) ・・・ An: (data) // end of program add GR1, GR0 (旧) という表現が, add A1(GR1), GR0 (新) に修正されている(だけ!) 命令数: (4+3+6+1+1)個 データ数: (1+n)個 同じ数 データ部分はA1~Anまでのデータが新規に追加するので,明らかに増加している.これは,扱うデータ数が変化した当然の帰結である
アドレス修飾の方法について 1)直接アドレス方式(direct addressing) レジスタ間の演算 add GR1, GR0 GR0 ← GR0 + GR1 メモリ-レジスタ間の演算 add A1, GR0 GR0 ← GR0 + ContentOfMemoryAddress( A1 ) 2)間接アドレス方式(indirect addressing) インデックス修飾方式 add A1(GR1), GR0GR0 ← GR0 + ContentOfMemoryAddress( A1+(GR1) ) その特殊ケース add 0(GR1), GR0GR0 ← GR0 + ContentOfMemoryAddress( (GR1) ) レジスタの値をアドレスとして,メモリ上のデータを読出し,加算する 3)即値(イミーディエイトヴァリュ)指定(immediate value addressing) add #1, GR0 GR0 ← GR0 + 1 add #100, GR0 GR0 ← GR0 + 100