1、匯編語言的語句格式:
標號 操作碼(指令助記符) 操作數 ;注釋
(label) (opcode) (operand) (comment)
2、常用偽指令
a.EQU——符號名賦值偽指令
格式:符號名 EQU nn
b.ORG——程序起始地址定義偽指令
格式:ORG nnnn
c.END——程序結束偽指令
格式:END
d.LIST——列表選項偽指令
格式:LIST [可選項,可選項,......]
e.INCLUDE:調入外部程序文件偽指令
格式:INCLUDE "文件名"
2、分支程序結構
——對於程序中的指令運用作幾點說明:
(1)凡是需要2個數參與的邏輯運算(與、或、異或)和算術運算(加、減),都需要事先將其中一個操作數放入W中。對於在此使用的減法指令更要格外關注,應預先把減數放人W中,或者說,預先放入W中的數,在運算中是當做減數,而寄存器中的數當做了被減數。
(2)一條條件跳轉指令往往需要跟隨一條無條件跳轉指令,才能實現長距離的轉移和程序的分支。
(3)PIC單片機的指令系統中沒有設置專用的停機指令,可以用一條跳轉到自身的無條件跳轉指令GOTO來實現。
3、PIC單片機指令
由3種基本類型指令組成:
a.字節操作類指令
b.位操作類指令
c.立即數和控制操作類指令
對於字節操作指令,f——>文件寄存器標識符,d——>目標寄存器標識符
說明:目標標識符指定了操作結果的存放位置:
d=0 操作結果存入W寄存器
d=1 操作結果存入指定的文件寄存器,d默認值為1
4、指令集
5、例子
1 ;-------------------------------------------------------- 2 3 ;順序程序結構 4 ;將20H單元低4位取出存入21H,高四位取出存入22H 5 ;要點:ANDLW和SWAPF 6 7 ;--------------------------------------------------------- 8 MOVF 20H,0 ;將20H單元的內容送人W 9 ANDLW 0FH ;W高四位清零低4位保持不變 10 MOVWF 21H ;將拆分后的低4位送21H 11 SWAPF 20H,0 ;將20H單元內容高、低半字節換位后送W 12 13 ANDLW 0FH ;再將W高四位清0低四位保持不變 14 MOVWF 22H ;將拆分后的高四位送22H單元 15 16 17 ;-------------------------------------------------------- 18 19 ;分支程序結構 20 ;RAM中20H和21H單元存放2個數,找出大着存入22H單元 21 ;要點:兩數做減法,判斷標志位C的值 22 23 ;--------------------------------------------------------- 24 STATUS EQU 03H ;定義STATUS寄存器地址為03H 25 C EQU 0 ;定義進位/借位標志C在STATUS中得地址為0 26 MOVF 20H 0 ;將20H單元的內容送人W 27 SUBWF 21H 0 ;用21H單元的內容減去W中的內容,結果存在W中 28 BTFSS STATUS,C;若C=1,沒借位,則21H單元中的數大,跳到F21BIG 29 GOTO F20BIG ;若C=0,有借位,20H單元中得數較大,則跳至F20BIG 30 31 F21BIG MOVF 21H,0 ;將21H中的內容存入W寄存器 32 MOVWF 22H ;再將它轉存到22H單元 33 GOTO STOP ;跳過下面兩條指令到程序末尾 34 35 F20BIG MOVF 20H,0 ;將20H中的內容存入W寄存器 36 MOVWF 22H ;再將它轉存到22H單元 37 38 STOP GOTO STOP ;任務完成,停機,原地踏步 39 40 41 ;-------------------------------------------------------- 42 43 ;循環程序結構 44 ;數據存儲器中,從地址30H開始的50個單元全部寫入00H 45 ;要點:間接尋址寄存器FSR當做地址指針 46 47 ;--------------------------------------------------------- 48 COUNT EQU 20H ;指定20H單元作為循壞次數計數器(即循環變量) 49 FSR EQU 04H ;定義FSR寄存器地址為04H 50 INDF EQU 00H ;設定INDF寄存器地址為00H 51 MOVLW D50 ;把計數器初值50送入W 52 MOVWF COUNT ;再把50轉入計數器(作為循環變量的操作值) 53 MOVLW 30H ;把30H(起始地址)送入W 54 MOVWF FSR ;再把30H轉入寄存器FSR(用作地址指針) 55 56 NEXT CLRF INDF ;把以FSR內容為地址所指定的單元清0 57 INCF FSR,1 ;地址指針內容加1,指向下一單元 58 DECFSZ COUNT,1 ;計數值減1,結果為0就跳過到下一條指令到STOP處 59 GOTO NEXT ;跳轉回去並執行下一次循環 60 STOP GOTO STOP ;循環結束之后執行該語句,實現停機 61 62 ;-------------------------------------------------------- 63 64 ;子程序結構 65 ;3個數最大者放入40H單元 66 67 ;--------------------------------------------------------- 68 STATUS EQU 03H 69 C EQU 00H 70 X EQU 20H 71 Y EQU 21H 72 Z EQU 22H 73 ;-------------------------------------------------------- 74 75 ;主程序 76 77 ;--------------------------------------------------------- 78 79 MAIN MOVF 30H,0 80 MOVWF X 81 MOVF 21H,0 82 MOVWF Y 83 CALL SUB 84 MOVF Z,0 85 MOVWF X 86 MOVF 32H,0 87 MOVWF Y 88 CALL SUB 89 MOVF Z,0 90 MOVWF 40H 91 STOP GOTO STOP 92 ;-------------------------------------------------------- 93 94 ;子程序:(入口參數:X和Y,出口參數:Z) 95 96 ;--------------------------------------------------------- 97 SUB MOVF X,0 ;將X內容送人W 98 SUBWF Y,0 ;Y內容減去W內容,結果存入W 99 BTFSS STATUS,C;若C=1,沒有發生借位,執行下一條,否則跳轉 100 GOTO X_BIG 101 102 Y_BIG MOVF Y,0 ;將Y中的數據送入W 103 MOVWF Z ;再將它轉存到Z 104 GOTO THEEND ;跳過下面兩條到末尾 105 106 X_BIG MOVF X,0 ;將X中的數據送入W 107 MOVWF Z ;再將它轉存到Z 108 THEEND RETURN ;子程序返回