3. 演算命令を学ぼう 本稿の Web ページ http://www.mybook-pub-site.sakura.ne.jp/pic/index.html 1
; ADD このソースファイルを各自打ち込んで下さい. EQU 0x0C ; at 0C 足し算を実行するプログラムの例です. MOVLW B 00000001 ; Load 0x01 to W ADDLW B'00000011' ; W + 0x03 ->W MOVWF ; Move w to MOVLW B'00000010' ; Load 0x02 to W ADDWF, 0 ; W + -> W ADDWF, 1 ; W + -> GOTO END 2
8 デ制御 信号RA4~RA0 RB7~RB0 1024 14 ビット プログラムメモリ ( フラッシュメモリ ) 13 プログラムカウンタ (PC) 14 命令レジスタ 8レベルスタック 13ビット 5 直接アドレス ファイルレジスタ 8 ビット 7 MUX 68 7 間接アドレス FSR レジスタ STATUS レジスタ 8 MUX 命令デコーダコントローラ ALU 8 ータバスPIC16F84A の構成 W レジスタ 入出力ポート 3
; ADD 電源を入れると の次から始まる. EQU 0x0C ; at 0C へジャンプする. MOVLW B 00000001 ; Load 0x01 to W ADDLW B'00000011' ; W + 0x03 ->W MOVWF ; Move w to MOVLW B'00000010' ; Load 0x02 to W ADDWF, 0 ; W + -> W ADDWF, 1 ; W + -> GOTO END 4
; ADD EQU 0x0C w レジスタに 00000001 という数を転送せよという命令 MOVLW B 00000001 ADDLW B'00000011 W レジスタ MOVWF MOVLW B'00000010 00000001 ADDWF, 0 ADDWF, 1 GOTO END 5
; ADD EQU 0x0C MOVLW B 00000001 ADDLW B'00000011 w レジスタの内容に 00000011 という数を足してその結果を w レジスタに転送せよという命令です. Add Literal to W の略です. W レジスタ MOVWF MOVLW B'00000010 ADDWF, 0 ADDWF, 1 END 00000001 + 00000011 00000100 6
; ADD EQU 0x0C ファイルレジスタ 00000100 MOVLW B 00000001 ADDLW B'00000011 W レジスタ MOVWF MOVLW B'00000010 ADDWF, 0 ADDWF, 1 w レジスタの内容をファイルレジスタの に転送せよという命令 00000100 END 7
; ADD EQU 0x0C ファイルレジスタ 00000100 MOVLW B 00000001 ADDLW B'00000011 W レジスタ MOVWF MOVLW B'00000010 00000010 ADDWF, 0 ADDWF, 1 GOTO wレジスタに00000010 という数をロードせよという命令 END 8
; ADD EQU 0x0C ファイルレジスタ 00000100 MOVLW B 00000001 ADDLW B'00000011 + = 00000110 W レジスタ MOVWF MOVLW B'00000010 00000010 ADDWF, 0 ADDWF, 1 GOTO wレジスタの内容とファイルレジスタの内容を足してその結果をw レジスタに転送せよという命令 END 9
; ADD EQU 0x0C ファイルレジスタ 00000100 MOVLW B 00000001 ADDLW B'00000011 + = 00000110 W レジスタ MOVWF MOVLW B'00000010 00000110 ADDWF, 0 ADDWF, 1 GOTO 0 は行き先が w レジスタであることを示す. END 10
; ADD CONFIG _HS_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF EQU 0x0C ファイルレジスタ 00000100 MOVLW B 00000001 ADDLW B'00000011 + = 00001010 W レジスタ MOVWF MOVLW B'00000010 00000110 ADDWF, 0 ADDWF, 1 GOTO wレジスタの内容とファイルレジスタの内容を足してその結果をファイルレジスタに転送せよという命令 END 11
; ADD EQU 0x0C ファイルレジスタ 00001010 MOVLW B 00000001 ADDLW B'00000011 + = 00001010 W レジスタ MOVWF MOVLW B'00000010 00000110 ADDWF, 0 ADDWF, 1 1は行き先がファイルレジスタ ( この場合は) であることを示す. END 12
; ADD EQU 0x0C ファイルレジスタ 00001010 MOVLW B 00000001 ADDLW B'00000011 へジャンプする. W レジスタ MOVWF MOVLW B'00000010 00000110 ADDWF, 0 ADDWF, 1 GOTO END 13
演習問題 2. に 0xFF を転送し, これに 0x01 を足し, 結果を MEM2 に転送するプログラムを作成せよ. 演習問題 3.W に 0x01 を転送し,0x02 から W の内容を引いて (SUBLW 命令 ), 結果を に転送せよ. SUBLW 0x02 0x02 から w レジスタの内容を引いてその結果を w レジスタに転送せよという命令です. Sub W from Literal の略です. 14
演習問題 4. に 0x01 を転送し, これから 0x02 を引いて, 結果を に転送せよ. また, 結果が 2 の補数表現の -1 となっていることを確認せよ. 2 の補数表現とは 10 進数 2 進数 (2 の補数表現 ) 3 00000011 2 00000010 1 00000001 0 00000000-1 11111111-2 11111110-3 11111101 15
10 進数において 2 の符号を反転させて -2 とすることは,2 の補数表現では 00000010 11111101 + 1 11111110 とすることで得られる. 10 進数における 2 と -1 の足し算は 2 + (-1) = 1 となる.2 の補数表現では 00000010 +11111111 00000001 となる. 1/0 を反転させる 1 を足す 16
10 進数における 1 から 3 を引く計算は, まず 00000011 11111100 + 1 11111101 と,-3 に対応する 2 の補数表現を求める. つぎに 1 と -3 を足して 00000001 + 11111101 11111110 と実行されます. 1/0 を反転させる 1 を足す 2の補数表現を用いれば, 引き算は1/0 反転と足し算により実行されます. 17
演習問題 5.Increment, Decrement 命令の動作を確認するプログラムを作成せよ. INCF f, d ファイルレジスタの f に 1 を加えた結果を d に転送する命令です.d = 0 のとき転送先は w レジスタ,d=1 のとき転送先は f レジスタです. Increment file の略です. 例 )INCF, 1 ファイルレジスタの に 1 を加えた結果を に転送する命令です. DECF,1 ファイルレジスタの から 1 を引いた結果を に転送する命令です. Decrement file の略です. 18
演習問題 6.Complement 命令を用いて,2 の補数を求めるプログラムを作成せよ. COMF f, d ファイルレジスタの f の値を 1/0 反転した結果を d に転送する命令です.d = 0 のとき転送先は w レジスタ, d=1 のとき転送先は f レジスタです. Complement file の略です. 19
演習問題 2. 解答例 に 0xFF を転送し, これに 0x01 を足し, 結果を MEM2 に転送するプログラムを作成せよ. ; Problem 2 EQU 0x0C ; at 0C MEM2 EQU 0x0C+1 ; at 0D MOVLW 0xFF ; Load 0xFF to W MOVWF ; Move W to ADDLW 0x01 ; W + 0x01 ->W MOVWF MEM2 ;Move W to MEM2 END 20
演習問題 3. 解答例 W に 0x01 をロードし,0x02 から W の内容を引いて (SUBLW 命令 ), 結果を に転送せよ. ; Problem 3 EQU 0x0C ; at 0C MOVLW 0x01 ; Load 0x01 to W SUBLW 0x02 ; 0x02 - W ->W MOVWF ; Move W to GOTO END 21
演習問題 4. 解答例 に 0x01 を転送し, これから 0x02 を引いて, 結果を に転送せよ. また, 結果が 2 の補数表現の -1 となっていることを確認せよ. ; Problem 4 EQU 0x0C ; at 0C MOVLW 0x01 ; Load 0x01 to W MOVWF ; Move W to MOVLW 0x02 ; Load 0x02 to W SUBWF, 1 ; - W -> GOTO END 22
演習問題 5. 解答例 Increment, Decrement 命令の動作を確認するプログラムを作成せよ. ; Problem 5 EQU 0x0C ; at 0C INCF,1 ; + 1 -> INCF,0 ; + 1 -> W DECF,1 ; - 1 -> DECF,0 ; -1 -> W GOTO END 23
演習問題 6. 解答例 Complement 命令を用いて,2 の補数を求めるプログラムを作成せよ. ; Problem 6 EQU 0x0C ; at 0C MOVLW 0x01 MOVWF ; Load 0x01 to W ; Move W to COMF,1 ;Complement -> INCF,1 ; + 1 -> GOTO END 2 の補数を求める計算 24
2004 年 8 月 25