コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
アセンブリ言語とは? こういう感じのものです。 ORG 0 BSF STATUS,RP0 CLRF TRISB BCF STATUS,RP0 CLRF PORTB MOVLW 55H MOVWF PORTB ・・・・
アセンブリ言語とは? プロセッサが解釈可能な言語(機械語)を人間が理解可能な形にした低水準言語 ⇔高水準言語,高級言語 ex)C言語, Java ニーモニックともいう プロセッサごとに定義された命令を用いる プロセッサによって言語仕様が異なる Ex) PICとPentiumでは全く異なる命令 PICでは35種類の命令を使用する(実験書45~49ページ)
高級言語から機械語の流れ C言語から機械語までの流れは以下のようになる(同じ高級言語でもJavaは少し異なる) アセンブリ言語→(アセンブラ,)→機械語 (→(リンカ)→実行コード) 最近のコンパイラではC言語から機械語への変換まで全て行ってしまう コンパイルオプションでアセンブリ言語のコードを出力することもできる gccの場合は“-S”オプション
機械語とは? プロセッサが解釈可能な言語 ディジタル回路では0と1で表現される 下記の0と1の羅列がプロセッサでのなんらかの動作を示す 11000000000100 00000010001100 11000000010001 00011100001100 ・・・
機械語とアセンブリ言語 機械語を人間が理解可能な形にしたもの 命令を見れば大体の動作の予想がつく 機械語 11000000000100 00000010001100 11000000010001 00011100001100 ・・・ アセンブリ言語 MOVLW 04H MOVWF 0CH MOVLW 11H ADDWF 0CH,W ・・・
用語① アセンブル:アセンブリ言語で書かれたプログラムを機械語に変換すること アセンブラ:アセンブリ言語を機械語に変換するプログラム MOVLW 04H MOVWF 0CH MOVLW 11H ADDWF 0CH,W 機械語 11000000000100 00000010001100 11000000010001 00011100001100 アセンブル
用語② アセンブリ言語の動作を示す部分をオペコード、引数を示す部分をオペランドという ADDWF 0CH,W オペコード オペランド
アセンブリ言語の特徴 メモリやレジスタなど、計算資源を直接扱う プロセッサの構造(レジスタの数や用途など)を知らないとプログラミングできない C言語のような変数は存在しない C言語などのように変数に対してコンパイラがメモリを割り当てたり、計算に使用するレジスタを決めてくれたりはしない プロセッサの構造(レジスタの数や用途など)を知らないとプログラミングできない 一般に高級言語で書いたプログラムよりも高速に動作する
アセンブリ言語の用途 デバイスドライバやOSの一部 組み込み機器向けのソフトウェア プロセッサのレジスタを直接操作する必要があるため メモリサイズの節約 高速化のためのチューニング
PICの構造 演算処理部 プログラムメモリ (EEPROM) メモリ (レジスタ ファイル) 入出力ポート
PICの構造 プログラム メモリ プログラム カウンタ 命令 レジスタ レジスタ ファイル MUX 入出力ポート W レジスタ ALU RA0~RA7 W レジスタ ALU RB0~RB7
PIC(PIC16F84)上の資源 PIC上でプログラミングする際に使用する資源は以下の通りである(実験書7~8ページ) プログラムメモリ:プログラムを格納するメモリ レジスタファイル:動作設定やデータ格納用メモリ STATUSレジスタ ポートの入出力設定、入出力 汎用レジスタ など Wレジスタ(Working Register): 演算する際に一時保存用に使用するレジスタ
レジスタファイル アドレスを指定することで、データの読み書きができる 読み出し、書き込みのいずれであるかは命令によって決定される 0番地 アドレスを指定することで、データの読み書きができる 読み出し、書き込みのいずれであるかは命令によって決定される 実験書13ページ参照 1番地 2番地 ・・・ ・・・ 0B番地 0C番地 0D番地 ・・・ 4E番地 4F番地
レジスタファイル 0番地から0B番地まではSpecial Function Register(SFR)と呼ばれ、用途が決まっている 0番地 PICの動作設定 ステータス 外部との入出力 1番地 2番地 ・・・ ・・・ 0B番地 0C番地 0D番地 ・・・ 4E番地 4F番地
レジスタファイル 0C番地から4F番地までは汎用レジスタであり、プログラム実行中の一時データなどの保存に使用する 0番地 1番地 2番地 ・・・ ・・・ 0B番地 0C番地 0D番地 ・・・ 4E番地 4F番地
PICでのプログラミング Wレジスタにレジスタファイルの値を読み出す(または直値をロード) その値とレジスタファイルの値(または直値)で演算 ALU:Arithmetic Logic Unit 各種演算をするブロック レジスタ ファイル Wレジスタ ALU
PICの命令① MOVE系 -MOVLW オペコードが”MOV”で始まるものはデータ転送命令(データコピー含む) MOVLW (MOVe Literal to W) リテラル(literal,定数)をWレジスタに書き込む 例)MOVLW 04H 04HをWレジスタに書き込む(Hは16進数を示す) 新たに定数を読み込むときに用いる命令
PICの命令① MOVE系 -MOVF MOVF (MOVe File register) ファイルレジスタの内容を指定した書き込み先に書き込む 例)MOVF 0CH,W 0CH番地(ファイルレジスタのアドレス)の内容をWレジスタに書き込む 例)MOVF 0CH,F 0CH番地に0CH番地の内容を書き込む(つまり何も変わらない) ファイルレジスタの内容をWレジスタに読み出すときに用いる命令
PICの命令① MOVE系 -MOVWF MOVWF (MOVe W to File register) 例)MOVWF 0CH Wレジスタの内容を0CH番地に書き込む Wレジスタの内容をファイルレジスタに格納するときに用いる命令 計算結果の格納 データの一時退避
PICの命令① MOVE系 まとめ MOVE系の命令をまとめると、以下のようになる 定数の 読み込み MOVLW MOVF レジスタ ファイル Wレジスタ MOVWF
PICの命令② 演算命令 ALUで実行する各種演算のための命令 足し算、引き算 論理演算(AND, OR, NOT) シフト
PICの命令② 加算命令系 -ADDLW ADDLW (ADD Literal and W) Wレジスタにリテラルを加算して計算結果をWレジスタに格納する 例) ADDLW 11H 11HとWレジスタの値を加算してWレジスタに格納
PICの命令② 演算命令 –ADD系 ADDWF (ADD W and File register) 例) ADDWF 0CH, W 0CH番地の値とWレジスタの値を加算してWレジスタに格納 例) ADDWF 0CH, F 0CH番地の値とWレジスタの値を加算して0CH番地(ファイルレジスタ)に格納 加算命令にはADDだけでなく、1だけ増やすインクリメント命令も存在する 他の演算命令の使い方もほぼ同じなので、説明は略
例) 04H 11H 04Hを0CH番地にロードし、その値と11Hを加算する MOVLW 04H MOVWF 0CH MOVLW 11H レジスタ ファイル プログラム MOVLW 04H MOVWF 0CH MOVLW 11H ADDWF 0CH,W 04H Wレジスタ 15H 04H 11H ALU 11H 04H 15H
実験書の訂正 実験書45ページ、ANDWF命令の説明 実験書47ページ、IORLW命令の説明 1行目:ADD W with F → AND W with F 例:ADDWF REG0, F → ANDWF REG0, F 例のコメント:W+REG0 → REG0 AND REG0 実験書47ページ、IORLW命令の説明 1行目:Wレジスタとファイルレジスタの論理和 → Wレジスタとリテラルの論理和