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