查看: 546|回复: 0
打印 上一主题 下一主题

MSP430指令介绍

[复制链接] qrcode

31

主题

44

帖子

126

积分

注册会员

Rank: 2

积分
126
楼主
跳转到指定楼层
发表于 2015-12-15 05:49 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MSP430指令介绍
MSP430有自身语言,汇编语言也不同于其他类型的单片机,伪指令也是变幻魔测,但又很重要,下面是我毕业设计的一些尝试、出问题的地方.也可参见资料。
1.“#include” 不能大写。
2.程序段前的伪指令可以套用下列模板,在以后的几章中的程序都采用此模板,只是中间的主程序变化而已:
#include "MSP430x14x.h" /*把库文件包括进来 ,这个库文件是必须的,其他的库文件视需要而定*/
RSEG UDATA0 /*定义数据段一般默认数据段段地址是从0200H开始的也可以自己定义数据段开始地址,但必须在0200H到09FFH*/
DS 0 /*表示数据段从默认的段开始,偏移地址为0,若为DS N,表示数据段的偏移地址从N开始,此时的物理地址为(0200+N)H*/
ADINPUT EQU 00200H /*将0200H地址命名为ADINPUT,此后程序中的地址0200H 可以用ADINPUT表示,便于程序的可读性,注意:标号必须顶格写*/
A DW 5H /*定义A字变量的值为5H,此时将会将5H写到数据段的当前偏移地址上,便于后面使用,变量也得顶格写*/
RSEG CSTACK /*定义堆栈段*/
DS 0 /*段偏移值为0H,物理地址为默认开始地址值*/
RSEG CODE /*定义代码段1*/
DS 0 /*代码段1*/
RESET /*标号,表示程序段的开始地址,将被写入复位向量中*/
MOV #SFE(CSTACK),SP /*初始化堆栈指针*/
MOV #(WDTHOLD+WDTPW),&WDTCTL /*停止看门狗定时器*/
…… (程序段的内容)
COMMON INTVEC /*表示中断向量定义*/ /*下面的伪指令都不顶格*/
ORG XXX 1 / *XXX1表示中断向量表中的具体的中断向量1*/
DW YYY1 /*YYY是中断程序入口标号,表示中断程序首地址*/
ORG XXX2 /* XXX2 表示中断向量表中的具体的中断向量2/
DW YYY2 /*YYY2是中断程序入口标号,表示中断程序首地址*/
ORG RESET_VECTOR /*复位向量,每个程序中都必须的,可以放在段开始前的伪指令中*/
DW RESET /*程序开始的地址标号*/
END /*程序结束*/

3.几个规定:所有的标号都要顶格写,所有的变量都要顶格写,所有的伪指令和指令都不能顶格写,CALL调用子程序是在标号前用“#”,而其他的转移指令中的标号前不用“#”,对外设的寄存器,当程序开始时,许多是复位为零的,如果要置位为1,可以直接将每一位的名称作立即数写入,

例如:指令

MOV #(WDTHOLD+WDTPW),&WDTCTL 就是将WDTCTL寄存器中的WDTHOLD和WDTPW位置位为高,很容易读程序内容。
4.关于几类定义的区别:EQU、=、SET、VAR、ASSIGN都是给标号变量定义地址值的伪指令,都可以出现在程序中的任何位置,但用法不一样,= 、EQU 是定义一个永久地址标号变量,一旦定义,在程序中的这个标号将固定在定义的地址上,不能改动。而SET、VAR、
ASSIGN是暂时的地址标号变量,可以在程序中改动,一旦定义了一个标号地址,就可以对这个标号作地址访问,但必须是在数据段。另外,DB 、DW是定义变量在数据段当前的偏移位置,是作为数据定义的,不是作为地址定义的,例如:
AA DB 2H /*此时在数据段的当前位置写入了2H到存储器,以后用AA时就是用数据2H,注:AA顶格写*/可以在以后的程序中看到这些区别。



其他的指令和伪指令都可以在相关资料上查找到,以上是经常出现的问题,一般核心程序中的指令在语法上都不会有太大的问题,在此不再列举。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表