打印
[其他产品]

PIC单片机汇编语言学习

[复制链接]
1478|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1、汇编语言的语句格式:
标号 操作码(指令助记符) 操作数 ;注释
(label)        (opcode)        (operand)        (comment)
2、常用伪指令

a.EQU——符号名赋值伪指令
格式:符号名        EQU        nn
b.ORG——程序起始地址定义伪指令
格式:ORG        nnnn
c.END——程序结束伪指令
格式:END
d.LIST——列表选项伪指令
格式:LIST [可选项,可选项,......]
e.INCLUDE:调入外部程序文件伪指令
格式:INCLUDE "文件名"

使用特权

评论回复
沙发
deadtime|  楼主 | 2019-5-6 20:30 | 只看该作者
2、分支程序结构

——对于程序中的指令运用作几点说明:
(1)凡是需要2个数参与的逻辑运算(与、或、异或)和算术运算(加、减),都需要事先将其中一个操作数放入W中。对于在此使用的减法指令更要格外关注,应预先把减数放人W中,或者说,预先放入W中的数,在运算中是当做减数,而寄存器中的数当做了被减数。
(2)一条条件跳转指令往往需要跟随一条无条件跳转指令,才能实现长距离的转移和程序的分支。
(3)PIC单片机的指令系统中没有设置专用的停机指令,可以用一条跳转到自身的无条件跳转指令GOTO来实现。

使用特权

评论回复
板凳
deadtime|  楼主 | 2019-5-6 20:30 | 只看该作者
3、PIC单片机指令

由3种基本类型指令组成:
a.字节操作类指令
b.位操作类指令
c.立即数和控制操作类指令

对于字节操作指令,f——>文件寄存器标识符,d——>目标寄存器标识符

说明:目标标识符指定了操作结果的存放位置:
d=0 操作结果存入W寄存器
d=1 操作结果存入指定的文件寄存器,d默认值为1

使用特权

评论回复
地板
deadtime|  楼主 | 2019-5-6 20:31 | 只看该作者
4、指令集



使用特权

评论回复
5
deadtime|  楼主 | 2019-5-6 20:32 | 只看该作者
5、例子
;--------------------------------------------------------

;顺序程序结构
;将20H单元低4位取出存入21H,高四位取出存入22H
;要点:ANDLW和SWAPF

;---------------------------------------------------------
    MOVF    20H,0    ;将20H单元的内容送人W
    ANDLW    0FH        ;W高四位清零低4位保持不变
    MOVWF    21H        ;将拆分后的低4位送21H
    SWAPF    20H,0    ;将20H单元内容高、低半字节换位后送W

    ANDLW    0FH        ;再将W高四位清0低四位保持不变
    MOVWF    22H        ;将拆分后的高四位送22H单元


;--------------------------------------------------------

;分支程序结构
;RAM中20H和21H单元存放2个数,找出大着存入22H单元
;要点:两数做减法,判断标志位C的值

;---------------------------------------------------------
STATUS    EQU    03H    ;定义STATUS寄存器地址为03H
C        EQU    0    ;定义进位/借位标志C在STATUS中得地址为0
        MOVF    20H 0    ;将20H单元的内容送人W
        SUBWF    21H 0    ;用21H单元的内容减去W中的内容,结果存在W中
        BTFSS    STATUS,C;若C=1,没借位,则21H单元中的数大,跳到F21BIG
        GOTO    F20BIG    ;若C=0,有借位,20H单元中得数较大,则跳至F20BIG
   
F21BIG    MOVF    21H,0    ;将21H中的内容存入W寄存器
        MOVWF     22H        ;再将它转存到22H单元
        GOTO    STOP    ;跳过下面两条指令到程序末尾
        
F20BIG    MOVF    20H,0    ;将20H中的内容存入W寄存器
        MOVWF     22H        ;再将它转存到22H单元

STOP    GOTO    STOP    ;任务完成,停机,原地踏步


;--------------------------------------------------------

;循环程序结构
;数据存储器中,从地址30H开始的50个单元全部写入00H
;要点:间接寻址寄存器FSR当做地址指针

;---------------------------------------------------------
COUNT    EQU        20H        ;指定20H单元作为循坏次数计数器(即循环变量)
FSR        EQU     04H        ;定义FSR寄存器地址为04H
INDF    EQU        00H        ;设定INDF寄存器地址为00H
        MOVLW    D50        ;把计数器初值50送入W
        MOVWF    COUNT    ;再把50转入计数器(作为循环变量的操作值)
        MOVLW    30H        ;把30H(起始地址)送入W
        MOVWF    FSR     ;再把30H转入寄存器FSR(用作地址指针)
        
NEXT    CLRF    INDF    ;把以FSR内容为地址所指定的单元清0
        INCF    FSR,1    ;地址指针内容加1,指向下一单元
        DECFSZ    COUNT,1    ;计数值减1,结果为0就跳过到下一条指令到STOP处
        GOTO    NEXT    ;跳转回去并执行下一次循环
STOP    GOTO    STOP     ;循环结束之后执行该语句,实现停机

;--------------------------------------------------------

;子程序结构
;3个数最大者放入40H单元

;---------------------------------------------------------
STATUS    EQU        03H
C        EQU        00H
X        EQU        20H
Y        EQU        21H
Z        EQU        22H
;--------------------------------------------------------

;主程序

;---------------------------------------------------------

MAIN    MOVF    30H,0
        MOVWF    X
        MOVF    21H,0
        MOVWF    Y
        CALL    SUB
        MOVF    Z,0
        MOVWF    X
        MOVF    32H,0
        MOVWF    Y
        CALL SUB
        MOVF    Z,0
        MOVWF    40H
STOP    GOTO    STOP
;--------------------------------------------------------

;子程序:(入口参数:X和Y,出口参数:Z)

;---------------------------------------------------------
SUB        MOVF    X,0        ;将X内容送人W
        SUBWF    Y,0        ;Y内容减去W内容,结果存入W
        BTFSS    STATUS,C;若C=1,没有发生借位,执行下一条,否则跳转
        GOTO X_BIG        
        
Y_BIG    MOVF    Y,0        ;将Y中的数据送入W
        MOVWF    Z        ;再将它转存到Z
        GOTO    THEEND    ;跳过下面两条到末尾
        
X_BIG    MOVF    X,0        ;将X中的数据送入W
        MOVWF    Z        ;再将它转存到Z
THEEND    RETURN            ;子程序返回

使用特权

评论回复
6
oxygenzz| | 2019-5-8 17:37 | 只看该作者
楼主的总结很好,赞!

这颗料号有点久了,可以考虑从一些新的型号入手。

使用特权

评论回复
7
xuanhuanzi| | 2019-5-8 23:53 | 只看该作者
当年汇编开发很火

使用特权

评论回复
8
小灵通2018| | 2019-5-9 23:45 | 只看该作者
存储空间小的用汇编非常方便。

使用特权

评论回复
9
yzq13246068880| | 2019-5-10 08:18 | 只看该作者
好多年没用过汇编了。。。。。。

使用特权

评论回复
10
z_jzhao| | 2019-5-28 14:00 | 只看该作者
我给一个完整PIC的汇编例程吗,学习一下

使用特权

评论回复
11
parameters| | 2019-5-29 21:15 | 只看该作者
现在一般都是用C了吧,毕竟好上手的多

使用特权

评论回复
12
comparison| | 2019-5-31 16:20 | 只看该作者
现在能用汇编的都是牛人啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

470

帖子

2

粉丝