标签:
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 ;子程序返回
标签:
原文地址:http://www.cnblogs.com/loves6036/p/5369684.html