# 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 ![](https://i.imgur.com/WPJPS0O.png) #### Status Register會儲存各式運算後的狀態,如運算後是否Overflow、有沒有進位、結果是否為0、為負等 ![](https://i.imgur.com/FCHMWCg.png) #### 因為除MOVFF外所有牽涉到address的指令都只能容納8 bits,但Data Memory卻有12 bits,因此會需要BSR來儲存Data Memory最左邊四個bit,若指令中不使用BSR,則視為0 ## Byte-oriented File Register Operations ![](https://i.imgur.com/eQ7m1XR.jpg) ![](https://i.imgur.com/62jlXnL.jpg) ![](https://i.imgur.com/XohCpQ7.png) ### 注意:MOVF預設為存回原REG,因此d參數需給0才能存入WREG ![](https://i.imgur.com/8LWxMBK.jpg) ![](https://i.imgur.com/G3a7Qkm.png) ## Bit-oriented File Register Operations ![](https://i.imgur.com/DzRxyZj.png) BSF BTFSS BTG 注意:此處bit的編號為由左到右7~0,因此Left most bit為第7個bit,Right most bit為第0個bit ## Control Operations 1. Conditional Branch 此部分Branch指令須滿足特定條件(紀錄於Status Register)![](https://i.imgur.com/5i9ZV7j.gif) BC BN BNC BNN BNOV BNZ BOV 2. Unconditional Branch 此部分Branch指令無須滿足任何特定條件,直接Branch BRA GOTO 注意:BRA為2 Byte指令,而GOTO為4 Byte指令 ## Literal Operations ![](https://i.imgur.com/DpzaFsT.png) 此外還有... 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 ```