# Lab3-Instruction Set
Instruction set:http://technology.niagarac.on.ca/staff/mboldin/18F_Instruction_Set/
Datasheet:https://pdf1.alldatasheet.com/datasheet-pdf/view/112665/MICROCHIP/PIC18F4520.html
# 大綱
- 指令種類
- 指令的構成要素
- 指令的參數、行為介紹
# 指令種類
指令種類共分為5類
1. Byte-oriented File Register Operations
: 操作的基本單元為1個Byte,為針對一整個Byte的操作,包含算術運算、邏輯運算以及簡單的比較、算術後Skip等,並有部分指令會額外使用到BSR、Status register的內容
2. Bit-oriented File Register Operations
: 操作的基本單元為1個Bit,為單獨對一個Byte的特定Bit做操作,包含歸零、設1、檢查0(or 1)後Branch,以及Toggle
3. Control Operations
: 此類指令用於流程控制,主要為各式Branch指令
4. Literal Operations
: 此類指令參數完全由常數構成,用於直接以常數對Register操作(絕大部分對WREG操作,僅有兩個指令對另外兩個Register操作)
5. Data Memory & Program Memory Operations
: 此類指令為Data Memory及Program Memory間之互動、映射等(此學期Lab用不太到,因此不會深入解說)
# 指令的構成要素
在PIC18F4520中指令大多由2個Byte構成,少數指令(如MOVFF、GOTO、LFSR等)為4Byte
其中包含OPCode及指令所需的Operand
較為常見的Byte-oriented類指令通常由
1、 6bit OPCode + 1bit參數 + 1bit參數 + 8bit address
2、 7bit OPCode + 1bit參數 + 8bit address
這兩類構成
Bit-oriented類指令則由
4bit OPCode + 3bit定位欲操作的bit + 1bit參數 +8bit address構成
Control Operations、Literal Operations這兩類指令則多由
8bit OPCode + 8bit address or literal構成
當然,也有一些構成特殊的指令如BRA為5bit OPCode + 11 bit address或者如前面提到的4Byte指令,但上四種構成占絕大多數
# 指令的參數、行為介紹
#### 在正式介紹指令之前我們先來了解一下BSR與Status register

#### Status Register會儲存各式運算後的狀態,如運算後是否Overflow、有沒有進位、結果是否為0、為負等

#### 因為除MOVFF外所有牽涉到address的指令都只能容納8 bits,但Data Memory卻有12 bits,因此會需要BSR來儲存Data Memory最左邊四個bit,若指令中不使用BSR,則視為0
## Byte-oriented File Register Operations



### 注意:MOVF預設為存回原REG,因此d參數需給0才能存入WREG


## Bit-oriented File Register Operations

BSF
BTFSS
BTG
注意:此處bit的編號為由左到右7~0,因此Left most bit為第7個bit,Right most bit為第0個bit
## Control Operations
1. Conditional Branch
此部分Branch指令須滿足特定條件(紀錄於Status Register)
BC
BN
BNC
BNN
BNOV
BNZ
BOV
2. Unconditional Branch
此部分Branch指令無須滿足任何特定條件,直接Branch
BRA
GOTO
注意:BRA為2 Byte指令,而GOTO為4 Byte指令
## Literal Operations

此外還有...
MOVLB
ANDLW
IORLW
ADDLW
MULLW
RETLW
SUBLW
XORLW
## 下面附上解說影片程式碼
```程式類型=C
List p=18f4520
#include<p18f4520.inc>
CONFIG OSC = INTIO67
CONFIG WDT = OFF
org 0x00
start:
MOVLW 0x02
MOVWF 0x00
ADDWF 0x00,0 ;d = 0,放回WREG
ADDWF 0x00,1 ;d = 0,放回原F
ADDWF 0x00,W
ADDWF 0x00,F
BSF STATUS,0
BCF STATUS,0
BSF STATUS,C
ADDWFC 0x01 ;default,放回原F
MOVLW 0x02
DECFSZ_TEST:
DECFSZ WREG
GOTO DECFSZ_TEST
MOVLW 0x04
MOVWF 0x02
CLRF WREG
MOVF 0x00
MOVF 0x00,W
MOVFF 0x02,0x03
BSF STATUS,C
MOVLW 0x81
RLNCF WREG
MOVLW 0x01
RLNCF WREG
MOVLW 0x81
RLCF WREG
MOVLW 0x01
RLCF WREG
CLRF WREG
BTFSS_TEST:
BTFSS WREG,0
GOTO func1
GOTO func2
func1:
BSF WREG,0
GOTO BTFSS_TEST
func2:
MOVLW 0x01
SUBLW 0x02
BZ Zero
Nzero:
SUBLW 0x01
BZ Zero
GOTO BSR_TEST
Zero:
GOTO BSR_TEST
BSR_TEST:
MOVLW 0x10
MOVWF 0x100
MOVLB 0x01
MOVWF 0x00,1
MOVFF 0x100,0x101
CLRF WREG
MOVFF 0x000,0xFE8
Done:
end
```