历史上的今天
返回首页

历史上的今天

今天是:2024年11月26日(星期二)

正在发生

2019年11月26日 | PIC单片机汇编语言学习(一)

2019-11-26 来源:eefocus

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            ;子程序返回


推荐阅读

史海拾趣

Edcon Components Netherlands Cv公司的发展小趣事

为了进一步扩大市场份额,Edcon Components Netherlands Cv开始积极拓展国际市场。公司通过对不同国家和地区的市场进行深入分析,制定了精准的市场拓展策略。通过与当地经销商建立合作关系,Edcon的产品逐渐进入国际市场,并在多个国家和地区取得了成功。国际市场的拓展不仅为公司带来了更多的商机,也提升了公司的品牌影响力。

HEIMANN公司的发展小趣事

随着全球环保意识的提高,Edcon Components Netherlands Cv积极响应绿色生产的号召。公司采用环保材料和工艺进行生产,减少废弃物排放和能源消耗。同时,公司还加强了员工的环保意识培训,鼓励员工积极参与环保活动。这些举措不仅有助于提升企业的社会责任感,也为公司的可持续发展奠定了坚实基础。

Heatron LED Integration公司的发展小趣事

Heatron LED Integration深知品质对于产品的重要性,因此从原材料采购到生产制造,每一环节都严格把关。公司建立了完善的质量管理体系,确保每一款LED产品都能达到国际最高标准。同时,公司还注重产品的性能优化,通过不断的研发和技术升级,提升产品的发光效率和使用寿命。这种对品质和性能的双重追求,使得Heatron LED Integration的产品在市场上享有极高的声誉。

安谱隆(Ampleon)公司的发展小趣事

在恩智浦剥离射频业务后,安谱隆迅速吸引了资本市场的关注。建广资产成功竞标,以18亿美元(约116.82亿元人民币)的价格收购了安谱隆。这一交易不仅显示了建广资产对安谱隆技术实力和市场潜力的认可,也为安谱隆未来的发展注入了新的动力。在建广资产的支持下,安谱隆开始了其独立发展的新篇章。

GSI Technology公司的发展小趣事

从财务表现来看,GSI Technology在过去几年中取得了不俗的成绩。尽管在某些季度受到宏观经济环境和市场需求波动的影响,但公司整体营收和净利润均保持了稳定增长。特别是在2023年Q3财报中,尽管营收略低于市场预期,但公司依然展现出了强劲的发展潜力和市场竞争力。展望未来,GSI Technology将继续秉承创新、务实、高效的发展理念,不断推出更多高性能、高品质的存储器产品,为全球电子行业的发展贡献自己的力量。

Eutech公司的发展小趣事

EUtech Scientific Engineering公司起初以测量技术为核心,专注于为能源和电力系统提供高精度测量设备。随着技术的不断发展和市场需求的变化,公司意识到控制技术在电力系统中的重要性。于是,公司投入大量研发资源,成功将测量与控制技术相结合,开发出具有自主知识产权的控制系统,实现了从测量到控制的跨越。

问答坊 | AI 解惑

PWM开关调整器及其应用电路

PWM开关调整器及其应用电路…

查看全部问答>

大家遇到过"Target failed to repond"这样的问题没?

请问大家遇到过这样的问题没? 就是单片机(C8051f系列)程序与硬件connect后,然后download code出现这样的提示问题: Target failed to repond. Systerm is being disconnected. 恳请各位给予解答!不知道问题出在哪里了!…

查看全部问答>

atmega128 flash烧写问题(急急急)

请问一下: 我的开发环境是AVR STUDIO,现在可以读到mega128的签名(read signature),\"fuse\"下点击program按钮也没问题,也能正常写入;但是烧写flash时就失败,不知道是什么原因? 我用的是JTAG下载方式,使用外部16M晶振. 请帮我分析一下原因 ...…

查看全部问答>

请问如何把电路图COPY到贴子上???(有个电路想请大家分析一下)

有个AVR SPI电路想请大家分析一下,但没法COPY上来,怎么办呢???…

查看全部问答>

请教用VB.NET开发WinCE出现的问题~

各位大虾    我.NET2005下开发WinCE程序(VB.net),现在需要把按钮上的字符靠左显示,在Windows下的按钮有设置靠左的属性,但是在WinCE下没有这个属性,请问该怎么做??…

查看全部问答>

从wince看djyos的生存空间和价值——与戴先生的对话

    跟成都的戴先生认识,还得感谢QQ,通过djyos。     戴:你现在djyos发展得怎么样了?     我:正在努力.     就这样开始我我们的对话,通过QQ聊天,我知道戴先生是一个有10几年敬业的嵌入式业者,由于 ...…

查看全部问答>

场效应管的选用!

如题,主要考虑那些参数?…

查看全部问答>

关于例程中locator.c的分析

   在TI StellarisWare中关于以太网的例程中,我们几乎都可以看到这个locator的身影。它的作用是什么呢?它其实就是结合tools文件夹下的finder来发现开发板的IP地址和MAC地址以及开发板的名称等等。      并不是所有的 ...…

查看全部问答>

适合做字库的FLASH存储芯片W25X16中文手册

W25X16中文资料 [ 本帖最后由 richgood 于 2011-2-22 09:26 编辑 ]…

查看全部问答>

lpc1114的定时器问题

我用lpc1114 定时器32 计数,想随时读取当前计数值,各位大大,是读取哪个寄存器看吧!我试了都不行啊,不是读TC么? 各位大大,路过好心告诉一声,我不用中断的,就想在随便一个IO口边沿有动作时,读取当中的间隔时间…

查看全部问答>