《MSP430系列超低功耗单片机原理与系统设计》课件第4章_第1页
《MSP430系列超低功耗单片机原理与系统设计》课件第4章_第2页
《MSP430系列超低功耗单片机原理与系统设计》课件第4章_第3页
《MSP430系列超低功耗单片机原理与系统设计》课件第4章_第4页
《MSP430系列超低功耗单片机原理与系统设计》课件第4章_第5页
已阅读5页,还剩240页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章MSP430系列单片机的指令系统与程序设计

4.1MSP430指令系统概述

4.2寻址方式

4.3指令系统介绍

4.4汇编语言程序设计

4.5C语言程序设计基础

4.6MSP430的开发环境

习题

4.1MSP430指令系统概述

4.1.1汇编语言语句格式程序设计语言是实现人机交换信息的重要工具。一般来说高级语言、汇编语言和机器语言都可以用程序编制。机器语言是用二进制数表示的机器指令,能被计算机直接识别并执行,但机器语言不便记忆和理解,书写时也容易出错。汇编语言是用助记符来表示机器指令的,与机器码一一对应,便于记忆和理解,易于掌握和使用,与高级语言相比程序结构紧凑,节省存储空间,执行效率高。对于适用于实时测控系统的单片机来说,采用汇编语言编程最为方便。

汇编语言(AssemblyLanguage)是用助记符和标号地址来编写程序语言的,直接面向机器,因机器而异。汇编语言的语句由四部分组成:标号、操作码、操作数和注释。MSP430单片机的指令格式如下:

【标号】操作码,【操作数】【;注释】

标号:用户设定的符号,表示该指令所在的地址。由汇编器将标号翻译成该行语句的物理地址。标号并非每一个语句都有,只有在需要时才使用。书写时最左边对齐,后面不必用冒号。

操作码:指令的操作功能,是任何一个语句都不可缺少的。

操作数:规定数据的类型和所用的寻址方式。如果有两个操作数,则第一个为源操作数,第二个为目的操作数,源操作数和目的操作数之间用逗号分隔;如果只有一个操作数,该操作数既是源操作数,又是目的操作数。有的指令也可以没有操作数,如NOP指令。

注释:语句的说明部分,它必须用分号“;”和指令隔开,注解该指令具体完成了什么操作,它是为了方便人们阅读程序而设定的。计算机在汇编时对注释部分不作处理。

4.1.2指令系统中的符号说明

指令系统中各符号的含义介绍如下:

(1)前面带有标志“*”的指令是仿真指令,仿真指令的使用结合了CPU结构和执行方便的内核指令,使得代码效率更高,速度更快;

(2)“→”表示“写内容到”;

(3)“src”和“dst”分别表示源操作数和目的操作数;

(4)状态位中“*”表示影响,“-”表示不影响,“0”和“1”表示清零和置位;

(5)“@”表示寄存器间接寻址,“direct”代表直接地址;

(6)指令助记符的后缀“.W”或无后缀表示其为字操作指令,在字操作指令中,存储器地址一定要对准偶数地址,指令助记符的后缀“.B”表示其为字节操作指令;

(7)Rn表示R0~R15;

(8)PC/R0为程序计数器;

(9)SP/R1为堆栈指针;

(10)TOS为堆栈顶;

(11)&后面的数据为具体的地址;

(12)#是立即数的前缀,后面的数为立即数;

(13) MSB为最高有效位;

(14)LSB为最低有效位;

(15)+表示内容增加;

(16)-内容减少;

(17)V为溢出标志,N为负标志,Z为零标志,C为进位标志;

(18)(×)表示某寄存器或某单元中的内容;

(19)((×))表示间接寻址单元中的内容;

(20) EDE、TONI、TOM和LEO是一般的符号,它们没有特殊的含义。

4.1.3指令的代码格式

MSP430单片机指令系统的代码格式有双操作数指令(内核指令)代码格式、单操作数指令(内核指令)代码格式、条件和无条件转移指令代码格式,下面分别进行介绍。

1.双操作数指令(内核指令)

双操作数指令由4个域组成,共16位代码。

操作码域,4位[操作码]。

源域,6位[源寄存器+As]。

字节操作识别符,1位[B/W]。

目的域,5位[目的寄存器+Ad]。

2.单操作数指令(内核指令)

单操作数指令是由2个主域组成的,共16位代码。

3.条件和无条件转移指令(内核指令)

该类指令包括2个主域,共16位代码。

操作码域,6位。

跳转偏移域,10位。

转移指令可跳转到相对于当前地址范围在-511~+512字之间的地址。汇编器计算出有符号的偏移,并把它们插入操作码。

转移类指令不影响状态位,当发生转移时,可通过偏移量改变PC值,公式为

PCnew = Pcold + 2 + 2 × 偏移量

4.1.4无需ROM补偿的仿真指令

无需ROM补偿的仿真指令可用精简指令集仿真,汇编器接收仿真指令,并能够插入适当的内核指令。MSP430指令系统中无需ROM补偿的仿真指令如表4-1所示。

表4-1无需ROM补偿的仿真指令

4.1.5指令的时钟周期与指令长度

MSP430的指令执行速度(指令所用的时钟周期数,这里时钟周期指MCLK的周期)和指令长度(所占用存储空间)与指令的格式和寻址模式密切相关。在不同的寻址模式下,CPU寻找操作数的路径不一样,当然要占用不同的时间与不同的存储空间。表4-2和4-4给出了MSP430指令的时钟周期数和指令长度,表4-3和表4-5给出了简单判定双操作数和单操作数的CPU指令周期方式。

表4-2双操作数指令的时钟周期数与指令长度

表4-3双操作数指令执行周期

表4-4单操作数指令的时钟周期数与指令长度

表4-5单操作数指令执行周期

例如:PUSH#500H;需要4个时钟周期。

对于跳转类指令,它们的时钟周期数与指令长度是固定的。条件跳转指令无论跳转与否都要占用2个时钟周期,指令长度为1个字长。RETI要占用5个时钟周期,指令长度也是1个字长。除了CPU的指令外,CPU还有一些操作也将占用时间,但不占用存储空间(因为不是程序指令)。它们是以下一些操作:

中断响应,占用6个时钟周期;

WDT复位,占用4个时钟周期;

系统复位,占用4个时钟周期。

4.2寻

单片机执行程序的过程是不断地寻找操作数并进行操作的过程,寻址方式是指CPU寻找操作数或操作数地址的方法。寻址方式是计算机的重要性能指标之一,也是汇编程序设计中最基本的内容。寻址方式越多,单片机指令功能越强,灵活性越大。MSP430共有7种寻址方式。其中,源操作数可用全部的7种方式寻址,目的操作数有4种寻址方式,它们可以访问整个地址空间,如表4-6所示。

表4-6寻址方式

4.2.1寄存器寻址

操作数的地址由寄存器直接给出,寄存器的内容就是指令中的操作数,这种寻址方式称为寄存器寻址。寄存器寻址方式是将源操作数中的内容移到目的操作数,而源操作数内容不变,通常占1到2个字。源操作数和目的操作数都可以用于寄存器寻址。寄存器寻址一般用于对时间要求比较严的操作。汇编源程序:

MOVR10,

R11;

设指令执行前:

(R10)=0A022H,(R11)=0FA00H,(PC)=Pcold;

指令执行后:

(R10)=0A022H,(R11)=0A022H,(PC)=PCold+2。

4.2.2变址寻址

变址寻址方式的操作数在内存中,操作数的地址为寄存器内容加上前面的偏移量,一般占2~3个字,格式如下:

图4-1变址指令执行过程

变址寻址中源操作数或目的操作数中涉及的寄存器内容在执行前后不变。这种寻址方式对源操作数和目的操作数都有效,例如:

MOVR6,3(R8);

MOV5(R6),R7

4.2.3符号寻址

这种寻址方式的操作数在内存中,操作数的地址在指令中直接给出,格式如下:

其中,操作数的地址为EDE和TONI。(EDE)=PC+X,(TONI)=PC+Y。X,Y存在指令的后续中,汇编程序能自动计算并插入偏移量X和Y。

例如:MOVEDE,TONI;(EDE)=0F016H,(TONI)=01114H

解释:将地址EDE单元中的内容移到地址为TONI的单元中(见图4-2)。

图4-2符号指令执行过程

例如:

MOVTAB,R5;

TABDW13F2H,2213H,3ED4H ;将符号TAB所表示的数据作为地址,再将该地址中的

;数据送达R5

执行前:R5=43F2H,TAB标号所指示的地址处的数据为字13F2H;

执行后:R5=13F2H;

这种寻址模式既可用于源操作数,也可用于目的操作数。下面的语句都属于符号寻址模式:

MOV.BR6,LOOP; ;目的操作数符号寻址

MOVTAB,&0316H ;源操作数符号寻址

MOVR5,TAB ;源操作数符号寻址

4.2.4绝对寻址

这种寻址方式的操作数在内存中,操作数的地址在指令中直接给出,主要用于定位绝对的、固定地址的硬件外围模块,对它们绝对寻址可保证软件的透明度。绝对寻址可以看做是当PC=0时的符号寻址,格式如下:

其中,EDE和TONI为操作数地址。将地址EDE的内容移到地址TON1中,指令后续字中给出操作数的地址。

例如:MOV&EDE,&TONI;(EDE)=0F016H,(TONI)=01114H

图4-3绝对寻址指令执行过程

例如:

ResetMOV#2345H,R6;

AAAMOVR6,R7;

SUB&AAA,&Reset ;将地址Reset中的数据减去地址AAA中的数据,再将结果

;送达地址Reset中

执行前:Reset=0E000H,(0E000H)=4036H

AAA=0E004H,(0E004H)=4607H

执行后:(0E000H)=4036H-4607H=FA2FH

这种寻址模式既可用于源操作数,又可用于目的操作数。下面的语句都属于绝对寻址模式:

MOV#2345H,&Reset ;目的操作数绝对寻址

MOV&Reset,R5 ;源操作数绝对寻址

MOV&AA,&234H ;源操作数绝对寻址

MOVR9,&AA ;目的操作数绝对寻址

4.2.5间接寻址

这种寻址方式的操作数在内存中,操作数的地址在寄存器中,格式如下:

解释:将地址R10单元中的内容移动到R11中的内容为地址的单元中。R10和R11中的内容在执行前后不变(见图4-4)。

图4-4间接寻址指令执行过程

间接寻址中源操作数或目的操作数涉及的寄存器内容在执行前后不变。这种寻址方式只适用于源操作数,对于目的操作数用变址寻址操作0(Rd)代替,例如:

MOV@R5,R6;

MOV@R6,4(R7);

4.2.6间接增量寻址

这种寻址方式的操作数在内存中,操作数的地址在寄存器中,格式如下:

解释:以R10里的内容为地址,将该地址单元中的内容送到以R11里的内容为地址的地址单元中。然后将R10中的内容加2,R11中的内容不变(见图4-5)。

图4-5间接增量寻址指令执行过程

在间接增量寻址方式中,源寄存器的内容在执行后自动加2(字操作)或1(字节操作),目的寄存器内容不变,如图4-6所示。

图4-6间接增量寻指指令执行框图

这种寻址方式适合于对表进行随机访问。间接增量寻址方式只对源操作数有效,此时目的寄存器内容需手动改变(INC/INCD),例如:

MOV@R5+,R6;

MOV@R6+,4(R7);

4.2.7立即寻址

这种寻址方式的操作数在指令中由源操作数直接指出,操作数能够立即得到,在指令代码中紧跟操作码后,格式如下:

图4-7立即寻址指令执行过程

下面的指令都使用了立即寻址模式:

MOV#1212H,R6;

MOV#1212H,2(R6)

MOV#12H,&220H;

4.3指令系统介绍

4.3.1数据传送类指令

(1)MOV:通用数据传送指令。语法:MOVsrc,dst或MOV.Wsrc,

dst/MOV.Bsrc,dst操作:src→dst说明:将源操作数移至目的操作数,源操作数不受影响。状态位:N,Z,C,V均不受影响。方式位:OSCOFF,CPUOFF和GIE不受影响。

MOV指令能实现多种数据传送的方向,但不是任何寻址方式都可以作为目的操作数的。数据传送时,可以参照图4-8,图中所示数据传送是可以实现的。

图4-8数据传送的可能方向

例如:

MOV4(R8),R10;

MOV#020H,R9;

MOV&234H,&200H;

MOV#121H,5(R5);

例如:地址表EDE(字数据)的内容被复制到表TOM,地址表的长度为020H。

MOV#EDE,R10 ;准备指针

MOV#020H,R9 ;准备计数器

LOOPMOV@R10+,TOM-EDE-2(R10) ;将R10中指针用于两个表

DECR9 ;计数器减1

JNZLOOP ;计数器≠0,继续复制

(2)*CLR:清零指令。

语法:CLRdst或CLR.Wdst/CLR.Bdst

操作:0→dst

说明:清除目的操作数。

状态位:不影响状态位。

仿真:

MOV#0,dst

CLRR6;

CLR&TONI;

CLR@R5;

CLRdirect;

(3)*POP:出栈指令。

语法:POPdst/POP.Bdst

操作:@SP→temp,SP+2→SP,temp→dst

说明:堆栈指针(TOS)指向的栈区字移至目的操作数,随后堆栈的指针增加2。

仿真:MOV@SP+,dst或MOV.W@SP+,dst或MOV.B@SP+,dst

状态位:N,Z,C,V均不受影响。

目的操作数可以有4种寻址方式。例如:

POP.BR7;

POPR12;

POP5(R9);

POP&234H;

POPSR;

(4)PUSH:入栈指令,内核指令。

语法:PUSHsrc或PUSH.Wsrc/PUSH.Bsrc

操作:SP-2→SP,src→@SP

说明:堆栈指针减2,然后操作数移至由此指针(TOS)寻址的RAM字。

状态位:N,Z,C,V均不受影响。

例如:

PUSH.B&TCDAT ;保存8位外设模块的数据

PUSHSR ;保存状态寄存器

(5)SWPB:交换字节指令,内核指令。

语法:SWPBdst

操作:位15~8↔位7~0

说明:目的操作数的高位字节和低位字节互换(字操作)。

状态位:N,Z,C,V均不受影响。

例如:

MOV#2300H,R5;

SWPBR5;

执行后:(R5)=0023H

(6)SXT:扩展符号指令。

语法:SXTdst

操作:位7→位8→…→位15

说明:低位字节的符号扩展到高位字节(字操作指令);位7的数据送到位8~位15(见图4-9)。

图4-9扩展符号指令操作示意图

状态位:N结果为负时置位,为正时复位;

Z结果位0时置位,不为0时复位;

C结果为非零时置位,其它情况时复位;

V复位。

例如:

MOV#7F45H,R5;

SXTR5;

执行结果:(R5)=0045H

4.3.2数据运算类指令

MSP430系列单片机指令系统主要有加法运算指令和减法运算指令两类数据运算指令。这两类指令一般都影响标志位。

1.加法指令

(1)ADD:源操作数和目的操作数相加,为内核指令。

语法:ADDsrc,dst或

ADD[.W]src,dst/ADD.Bsrc,dst

操作:src+dst→dst说明:源操作数和目的操作数相加,结果存入目的操作数,源操作数不受影响,目的操作数以前的数据丢失。

状态位:N结果为负时置位,为正时复位;

Z结果为0时置位,否则复位;

C结果产生进位时置位,否则复位;

V发生算术溢出时置位,否则复位。

例如:

ADD#1232H,R7;

ADDR8,R5;

目的操作数可以是任意通用寄存器和存储器(适用于目的操作数的所有寻址方式),例如:

ADD#data,Rn;

ADDRn,Rn;

ADD@Rn,direct;

ADD@Rn+,direct;

ADDdirect1,direct;

ADD#data,&TONI;

ADDX(Rn),&TONI;

ADD&EDE,&TONI;

ADD@Rn+,X(Rn);

ADDX(Rn),X(Rn);

ADDdirect1,X(Rn);

(2)ADC:将进位位加至目的操作数。

语法:ADCdst或ADC.Wdst/ADC.Bdst

操作:dst+C→dst

说明:进位C和目的操作数相加,结果存在目的操作数中,操作数以前的数据丢失。

仿真:ADDC#0,dst;

ADDC.B#0,dst;

状态位:N结果为负时置位,为正时复位;

Z结果为0时置位,否则复位;

C结果产生进位时置位,否则复位;

V发生算术溢出时置位,否则复位。

例如:

ADC.B@R10,0(R12);

ADC.B1(R12);

(3) ADDC:带进位的加法指令。

语法:ADDCsrc,dst或ADDC.Wsrc,dst/ADDC.Bsrc,dst

操作:src+dst+C→dst

说明:源操作数、进位C和目的操作数相加,结果存在目的操作数中,源操作数不受影响,目的操作数以前的数据丢失。该指令和ADD指令类似,只是在两个操作数相加时,要把进位标志C的值加上去,结果送到目的操作数中。

状态位:N结果为负时置位,为正时复位;

Z结果为0时置位,否则复位;

C结果的MSB产生进位时置位,否则复位;

V发生算术溢出时置位,否则复位。

ADDC可以实现立即数、寄存器、存储单元的内容和寄存器相加,结果存到寄存器中。ADDC还可以实现立即数、寄存器、存储单元的内容和另外的存储单元内容相加,结果保存到目的存储单元中。源操作数可用所有的7种寻址方式,目的操作数也可以应用4种寻址方式。

例:两个32位的数据分别放在起始地址220H和230H中,相加后和存放在240H开始的地址中。

ADD&220H,&230H ;对应低位字相加

MOV&230H,&240H ;保存低位和

ADDC&222H,&232H ;高位相加的时候要加上低位的进位

MOV&232H,&242H ;保存高位和

MOV#0,&244H ;清除&244H单元,为保存高位进位做准备

ADDC#0,&244H ;保存高位进位

(4)DADD:带进位的BCD数相加指令。

语法:DADDsrc,dst或DADD.Wsrc,dst/DADD.Bsrc,dst

操作:dst+src+C→dst

说明:源操作数和目的操作数被当作4个带符号的十进制(BCD)数,十进制源操作数和进位C加至目的操作数,源操作数不变,目的操作数以前的数据丢失。

状态位:NMSB为1时置位,否则复位;

Z结果为0时置位,否则复位;

C结果大于9999(或大于99)时置位;

V不变。

DADD指令类似ADDC指令,只是操作数性质不一样,前者为BCD数,后者为二进制数。DADD指令进行加法运算时,由于不需要进行二进制到BCD数的转换,因此会节省时间和ROM空间。

例:R5和R6中的8位十进制加至R3和R4中的8位十进制数(R4和R3含有MSBs)。

CLRC ;清除进位位

DADDR5,R3 ;加LSDs

DADDR6,R4 ;带进位位加MSDs

JCOVERFLOW ;若产生进位,则转移至错误处理子程序

(5)*DADC:将十进制的进位加至目的操作数。

语法:DADCdst或DADC.Wsrc,dst/DADC.Bdst

操作:dst+C→dst

说明:进位位C和目的操作数相加,结果存到目的操作数。

仿真:DADD#0,dst;

状态位:NMSB为1时置位,否则复位;

Z结果为0时置位,否则复位;

C目的操作数从9999增至0000时(或从99增至00)置位,否则复位;

V不变。

DADC指令类似ADC指令,只是操作数的性质不一样,前者为BCD数,后者为二进制数。

例:R5中的4位十进制数加至R8指向8位十进制数。

CLRC

DADDR5,0(R8);

DADC2(R8);

(6)*INC:目的操作数加1。

语法:INCdst或INC.Wdst/INC.Bdst

操作:dst+1→dst

说明:完成目的操作数加1。

仿真:ADD#1,dst

状态位:N结果为负时置位,否则复位;

Z结果包含0FFFFH(或包含0FFH)时置位,否则复位;

C结果包含0FFFFH(或包含0FFH)时置位,否则复位;

V结果包含07FFFH(或包含07FH)时置位,否则复位。

目的操作数可以采用寄存器寻址、绝对寻址和变址寻址三种方式:

INCRn;

INCX(Rn);

INC&EDE;

INCDirect;

此指令一般用在循环程序中修改地址指针和循环次数。

例:将R6指向的100个字传送到R7所指向的100个连续字地址空间。

MOV#100,R8 ;传送的字数

TRANS MOV@R6+,0(R7) ;对应单元开始传送

INCR7;

INCR7;字操作,调整R7所指向的单元

DECR8;每传送完一个字,传送字数减1

JNZTRANS;没有传送完,继续

… ;传送完毕

(7)*INCD:目的操作数增2。

语法:INCDdst或INCD.Wdst/INCD.Bdst

操作:dst+2→dst

说明:目的操作数加2送回到目的操作数。

仿真:ADD#2,dst或ADD.B#2,dst

状态位:N结果为负时置位,否则复位;

Z结果包含0FFFEH(包含0FEH)时置位,否则复位;

C结果包含0FFFEH或0FFFFH(包含0FEH或0FFH)时置位,否则复位;

V结果包含07FFEH或07FFFH(包含07EH或07FH)时置位,否则复位。

例如:

INCDSP;

INCD.B0(SP);

2.减法指令

表4-7MSP430的减法指令

(1)SUB:从目的操作数中减去源操作数。

语法:SUBsrc,dst或SUB.Wsrc,dst/SUB.Bsrc,dst

操作:dst+.NOT.src+1→dst或dst-src→dst

说明:从目的操作数中减去源操作数,结果存在目的操作数中,即将源操作数求反加上1,然后再加上目的操作数,结果送目的操作数,源操作数内容不变。

状态位:N结果为负时置位,否则复位;

Z结果为0时置位,否则复位;

C结果的MSB产生进位时置位,否则复位,即无借位时置为1,有借位时

复位。借位被视为一种非进位:

借位

进位位

0

1

V发生算术溢出时置位,否则复位。

目的操作数可以是寄存器或者存储单元,源操作数可以用所有的7种寻址方式,该指令即适用于字操作,又适用于字节操作。

例如:SUBR7,R8;

执行前:(R8)=23F6H,(R7)=4120H;

执行后:(R8)=E2D6H,(R7)=4120H,(C)=0(有借位)。

SUB@R7,R8;

执行前:(R8)=23F6H,(R7)=220H,(220H)=1112H;

执行后:(R8)=12E4H,(R7)=220H,(220H)=1112H,(C)=1(无借位)。

SUB#5FE6H,direct;

执行前:(direct)=220H,(220H)=0FFFFH;

执行后:(direct)=220H,(220H)=0AD19H,(C)=1(无借位)。

SUB2(R7),&TONI;

执行前:(R7)=230H,(232H)=0E00FH,TON1=240H,(240H)=1D57H;

执行后:(R7)=230H,(232H)=0E00FH,(240H)=03D48H,(C)=0(有借位)。

SUB@(R7)+,2(R8);

执行前:(R8)=230H,(R7)=210H,(210H)=1009H,(232H)=3FF0H;

执行后:(R8)=230H,(R7)=212H,(210H)=1009H,(232H)=2FE7H,(C)=1(无借位)。

(2)SUBC,SBB:带借位的减法指令。

语法:SUBCsrc,dst或SUBC.Wsrc,dst/SUBC.Bsrc,dst

SBBsrc,dst或SBB.Wsrc,dst/SBB.Bsrc,dst

操作:dst+.NOT.src+C→dst或(dst-src-1+C→dst)

说明:从目的操作数中减去源操作数,具体方法是将源操作数求反再加上进位C,源操作数不受影响,结果存入目的操作数。

状态位:N结果为负时置位,否则复位;

Z结果为0时置位,否则复位;

C结果的MSB产生进位时置位,否则复位,无借位时置1,有借位时为0;

V发生算术溢出时置位,否则复位。

该指令的目的操作数可以是寄存器或者存储单元。源操作数可以用所有的7种寻址方式,该指令既适用于字操作,又适用于字节操作。该指令在减法操作中的功能类似于ADDC指令在加法操作时的功能,都是用于多字节(字)的运算。进行高位运算时要考虑低位的进位(加法)或者借位(减法)。

例如:

SUB.WR13,R10;

SUBC.BR12,R9;

SUB.B@R13+,R10;

SUBC.B@R12,R11;

(3)*SBC:从目的操作数中减去借位。

语法:SBCdst或SBC.Wdst/SBC.Bdst

操作:dst+0FFFFH+C→dst

dst+0FFH+C→dst

说明:进位C加到减1后的目的操作数,结果存入目的操作数。

仿真:SUBC#0,dst或SUBC.B#0,dst

状态位:N结果为负时置位,否则复位;

Z结果为0时置位,否则复位;

Cdst从0000H减至0FFFFH(或从00减至0FFH)时复位,其它情况下置位;

V初始C=0且dst=08000H(或dst=080H)时置位,其它情况下复位。

同理,借位可视为非进位1。

例如:SUB@R13,0(R12);

SBC2(R12);

(4)

*DEC:目的操作数减1。

语法:DECdst或

DEC.Wdst/DEC.Bdst

操作:dst-1→dst

仿真:SUB#1,dst或SUB.B#1,dst

说明:目的操作数减1,结果存入目的操作数。

状态位:N结果为负时置位,否则复位;

Z目的操作数初值为1时置位,否则复位;

C目的操作数初值为0时复位,否则置位;

V产生算术溢出时置位,否则复位,目的操作数的初始值为08000H(或080H)时置位,否则复位。

例4.1

将R6指向的100个字传送到R7所指向的100个连续的字地址空间。

MOV#100,R8;传送的字的个数(循环指针)送入R8

TRANSMOV@R6+,0(R7);对应单元开始传送

INCDR7 ;字操作,调整R7所指向的单元

DECR8 ;每传送完毕一个字,传送字的个数减1(修改循环指针)

JNZTRANS ;没有传送完,继续

… ;传送完毕

例4.2

将R10减1。

DECR10 ;R10减1;

;将从EDE开始的255字节存储区块移到从TONI开始的存储区

;地址表不能重叠:目的地址TONI的起点不能位于EDE~EDE+0FEH的

;范围内

MOV#EDE,R6

MOV#255,R10

L$1MOV.B@R6+,TONI-EDE-1(R6)

DECR10

JNZL$1例4.2程序执行示意图如图4-10所示。

图4-10例4.2程序执行示意图

例4.3

将地址LEO处的存储器字节减1。

DEC.BLEO ;MEM(LEO)减1

;将从EDE开始的255字节存储区块移到从TONI开始的存储区,地址表不能

;重叠,目的地址TONI的起点不能位于EDE~EDE+0FEH的范围内

MOV#EDE,R6

MOV#255,LEO

LS2MOV.B@R6+,TONI-EDE-1(R6)

DEC.BLEO

JNZLS2

(5)

*DECD:目的操作数减2。

语法:DECDdst或DECD.Wdst/DECD.Bdst

操作:dst-2→dst

仿真:SUB#2,dst或SUB.B#2,dst

说明:目的操作数减2,结果存入目的操作数。

状态位:N结果为负时置位,否则复位;

Zdst包含2时置位,否则复位;

Cdst包含0或1时复位,否则置位;

V发生算术溢出时置位,否则复位;目的操作数的初始值为08000H或08001H时置位,否则复位;目的操作数的初始值为080H或081H时置位,否则复位。

例4.4R10减2。

DECDR10 ;R10减2

;将从EDE开始的255字节存储区块移到从TONI开始的存储区,地址表

;不能重叠,目的地址TONI的起点不能位于EDE~EDE+0FEH的范围内

MOV#EDE,R6

MOV#510,R10

LS2MOV.B@R6+,TONI-EDE-2(R6)

DECDR10

JNZLS2

例4.5

地址LEO处的存储器减2。

DECD.BLEO ;MEM(LEO)减2

DECD.BSTATUS ;状态字节STATUS减2。

(6)CMP:比较源操作数和目的操作数。

语法:CMPsrc,dst或CMP.Wsrc,dst/CMP.Bsrc,dst

操作:dst+.NOT.src+1或(dst-src)

说明:从目的操作数中减去源操作数,即将源操作数求反再加上1。源操作数和目的操作数内容不变,不保存结果,只是影响状态位。

状态位:N结果为负时置位,否则复位(src≥dst);

Z结果为0时置位,否则复位(src=dst);

C结果的MSB产生进位时置位,否则复位;

V发生算术溢出时置位,否则复位。

比较指令通常用于比较两个数之间的关系,即判断两者的大小或是否相等。在比较指令之后,零标志可判别两者是否相等,若两者不等,则可利用比较指令之后的标志位的状态来确定两者的大小。设A,B是参与比较的两个数,利用A-B进行比较操作:

若两者相等,则相减以后结果为0,Z=1,否则Z=0;

两个无符号数相比较时,用借位标志C来确定两者的大小。C=0则A>B;C=1则A<B。

两个有符号数相比较时,用溢出标志和负标志来确定两者的大小,方法如下:

在没有溢出的情况下,即V=0时,若N=0,则A>B;若N=1,则A<B。

在发生溢出的情况下,即V=1时,若N=1,则A>B;若N=0,则A<B。

例4.6

比较两个RAM块,如果不等,程序跳转到标号ERROR。

MOV#NUM,R5;被比较数据块的长度送入R5

L$1

CMP&BLOCK1,&BLOCK2 ;两数据块中的数据进行比较

JNZERROR;不等,则跳转到ERROR

DECR5 ;修改数据块长度指针

JNZL$1 ;判断比较完否,否则进行另一次比较

(1)AND:源操作数和目的操作数“与”。

语法:ANDsrc,dst或AND.Wsrc,dst/AND.Bsrc,dst

操作:src.AND.dst→dst

说明:源操作数和目的操作数逻辑与,其结果放入目的操作数。

状态位:N结果的MSB为1时置位,为0时复位;

Z结果为0时置位,否则复位;

C结果不为0时置位,其他情况时不受影响(=.NOT.Zero);

V复位。

逻辑操作指令是按位进行的,所以“AND”指令常用来屏蔽字节中的某些位,该位欲清除用“0”去“与”,该位欲保留用“1”去“与”。

例4.9ANDR7,R8

执行前:(R8)=23F6H,(R7)=0FF00H;

执行后:(R8)=2300H,(R7)=0FF00H。

AND@R7,R8

执行前:(R8)=23F6H,(R7)=220H,(220H)=1112H;

执行后:(R8)=0112H,(R7)=220H;(220H)=1112H。

AND#56FFH,direct

执行前:(direct)=210H,(210H)=132FH;

执行后:(direct)=210H,(210H)=122FH。

AND2(R7),&TONI执行前:(R7)=230H,(232H)=0E00FH,TONI=240H,(240H)=1D57H;

执行后:(R7)=230H,(232H)=0E00FH,TONI=240H,(240H)=0007H。

AND@(R7)+,2(R8)

执行前:(R7)=220H,(220H)=1009H,R8=230H,(232H)=3FF0H;

执行后:(R7)=222H,(220H)=1009H,R8=230H,(232H)=1000H。

(2)

BIC:清零目的操作数的各位。

语法:BICsrc,dst或BIC[.W]src,dst/BIC.Bsrc,dst

操作:.NOT.src.AND.dst→dst

说明:求反后的源操作数和目的操作数作逻辑相与,其结果放入目的操作数,源操作数将不受影响,只是在运算的中间过程中利用其取反的值参与运算。

状态位:N,Z,C,V均不受影响。

例4.11

BIC@R7,R8

执行前:(R8)=23F6H,(R7)=220H,(220H)=0FFFFH;

执行后:(R8)=0000H,(R7)=220H,(220H)=0FFFFH。

BIC#0F00H,direct

执行前:(direct)=220H,(220H)=0FFFFH;

执行后:(direct)=220H,(220H)=0F0FFH。

BIC2(R7),&TONI

执行前:(R7)=230H,(232H)=0E0FH,(TONI)=1D57H;

执行后:(R7)=230H,(232H)=0E0FH,(TONI)=1150H。

例4.12

将从EDE开始的255字节存储区块移到从TONI开始的存储区,地址表不能重叠。目的地址TONI的起点不能位于EDE~EDE+0FEH的范围内。

MOV #EDE,R6;

MOV.B #255,LEO;

LS4 MOV.B@R6+,TONI-EDE-1(R6);

DEC.B LEO;

JNZ

LS4;

(3)BIS:设置目的操作数的各位。

语法:BISsrc,dst或BIS[.W]src,dst/BIS.Bsrc,dst

操作:src.OR.dst→dst

说明:源操作数和目的操作数作逻辑或,结果放入目的操作数,源操作数不受影响。

状态位:N,Z,C,V均不受影响。

逻辑“或”运算可用于对某一操作数中的若干位维持不变,而另外若干位置为1的场合。欲保留(不变)的位用“0”去“或”,而要置位的用“1”去“或”。利用“或”运算,可以对两个操作数进行组合,也可以对某些位置位。

例4.13BIS#0F00FH,R7;

执行前:(R7)=1230H;

执行后:(R7)=0F23FH。

BIS@R7,R6;

执行前:(R6)=0F00AH,(R7)=220H,(220H)=1DD5H;

执行后:(R7)=220H,(220H)=1DD5H,(R6)=0FDDFH。

(4)BIT:测试目的操作数的各位。

语法:BITsrc,dst或BIT.Wsrc,dst/BIT.Bsrc,dst

操作:src.AND.dst

说明:源操作数和目的操作数作逻辑与,其结果仅影响状态位,源操作数和目的操作数不受影响。

状态位:N结果的MSB为1时置位,为0时复位;

Z结果为0时置位,否则复位;

C结果不为0时置位,否则复位;

V复位。

这条指令通常是用于检测一些条件是否满足,但又不希望改变原有的操作数的情况。通常可以在这条指令之后安排一条条件转移指令。

例4.14

如果R8中的位9被置位,程序转移到标号语句TOM处。

BIT#0200H,R8 ;R8的位9是否被置位

JNZTOM ;是,则转移到标号TOM处

;否,则继续

(5)XOR:源操作数和目的操作数“异或”。

语法:XORsrc,dst或XOR.Wsrc,dst/XOR.Bsrc,dst

操作:src.XOR.dst→dst

说明:源操作数和目的操作数“异或”,其结果放入目的操作数,源操作数不受影响。

状态位:N结果的MSB为1时置位,为0时复位;

Z结果为0时置位,否则复位;

C结果不为0时置位,否则复位;

V两个操作数均为负时置位。

“异或”运算常用于对某一操作数中的某些位取反,其它位不变。对欲保留不变的那些位是用“0”去“异或”,而对要取反的那些位用“1”去“异或”。

例4.15

XOR@R7,R8

执行前:(R8)=23F6H,(R7)=220H,(220H)=0FFFFH;

执行后:(R8)=0DC09H,(R7)=220H,(220H)=0FFFFH。

XOR#0FF22H,direct

执行前:(direct)=220H,(220H)=5F00H;

执行后:(direct)=220H,(220H)=0A022H。

XOR2(R7),&TONI

执行前:(R7)=230H,(232H)=0E0FH,(TONI)=1D57H;

执行后:(R7)=230H,(232H)=0E0FH,(TONI)=1358H。

(6)*INV:目的操作数求反。

语法:INVdst/INV.Bdst

操作:.NOT.dst→dst

说明:目的操作数取反,以前的数据丢失。

仿真:XOR#0FFFFH,dst或XOR.B#0FFH,dst

状态位:N结果为负时置位,否则复位;

Zdst包含0FFFFH(或0FFH)时置位,否则复位;

C结果不为0时置位,否则复位;

V初始目的操作数为负时置位,否则复位。

例4.16INVR8

执行前:(R8)=23F6H;

执行后:(R8)=0DC09H。

INV@R7

执行前:(R7)=220H,(220H)=5F00H;

执行后:(direct)=220H,(220H)=0A0FFH。

2.移位指令

(1)*RLA:算术循环左移。

语法:RLAdst或RLA.Wdst/RLA.Bdst

操作:C←MSB←MSB-1←…LSB+1←LSB←0

说明:目的操作数左移一位,MSB成为进位位C,LSB填0,RLA指令可将操作数左移一位,相当于将该操作数乘2。在执行该操作前,如果03FFFH<dst<0C000H(如果是字节操作,03FH<dst<0C0H),则产生溢出,结果会改变符号。

仿真:ADDdst,dst或ADD.Bdst,dst

状态位:N结果为负时置位,否则复位;

Z结果为0时置位,否则复位;

C从MSB获取;

V如产生算术溢出,则03FFFH<dst<0C000H(或03FH<dst<0C0H)时置位,否则复位。

例4.17RLAR7执行前:(R7)=0123H,C=1;执行后:(R7)=0246H,C=0。

例4.18RLCR7

执行前:(R7)=0123H,C=1;

执行后:(R7)=0247H,C=0。

(3)RRA:算术循环右移。

语法:RRAdst或RRA.Wdst/RRA.Bdst

操作:MSB→MSB,MSB→MSB-1,MSB-1→MSB-2,…,LSB+1→LSB,LSB→C

说明:目的操作数右移一位,但保持符号不变,最低位移至进位位C,MSB移入MSB,MSB移入MSB-1,MSB-1移入MSB-2,LSB+1移入LSB。

状态位:N结果为负时置位,否则为复位;

Z结果为0时置位,否则为复位;

C从LSB获取;

V复位。

例4.19

RRAR7

执行前:(R7)=8122H,C=0;执行后:(R7)=0C091H,C=0,N=1。

(4)RRC:带进位位循环右移。

语法:RRCdst或RRC.W/dstRRC.Bdst

操作:C→MSB→MSB-1→…→LSB+1→LSB→C

说明:目的操作数内容循环右移,进位位C移入MSB,目的操作数各位均右移一位,LSB移入进位位C。

状态位:N结果为负时置位,否则复位;

Z结果为0时置位,否则复位;

C从LSB获取;

V初始目的操作数为正且初始进位位被置位时置位,否则复位。

RRCR7执行前:(R7)=0BFFFH,N=0,C=1;执行后:(R7)=0DFFFH,N=1,C=1。RRC&220H执行前:(220H)=0A5A5H,N=0,C=0;

执行后:(R8)=52D2H,N=0,C=1。

4.3.4位操作类指令

MSP430指令系统的位操作指令能够完成对负标志、进位标志、零标志和中断标志位进行清零和置位操作。

(1)*CLRC:清除进位位。

语法:CLRC

操作:0→C

说明:使进位位C清零。

仿真:BIC#1,SR

状态位:N,Z,V不受影响,C=0。

(2)*CLRN:清除负位。

语法:CLRN

操作:0→N或.NOT.src.AND.dst→dst

说明:使负标志位N清零。

仿真:BIC#4,SR

状态位:Z,C,V不受影响,N=0。

(3)*CLRZ:清除零位。

语法:CLRZ

操作:0→Z或.NOT.src.AND.dst→dst

说明:使零标志位Z清零。

仿真:BIC#2,SR

状态位:N,C,V不受影响,Z=0。

(4)*SETC:置位进位位。

语法:SETC

操作:1→C

说明:使进位位C置位(常用操作)。

仿真:BIS#1,SR

状态位:N,Z,V不受影响,C=1。

(5)*SETN:置位负标志位。

语法:SETN

操作:1→N

说明:使负标志位N置位。

仿真:BIS#4,SR

状态位:Z,C,V不受影响,N=1。

(6)*SETZ:置位零标志位。

语法:SETZ

操作:1→Z

仿真:BIS#2,SR

说明:使零标志位Z置位。

状态位:N,C,V不受影响,Z=1。

(7)*DINT:禁止可屏蔽中断。

语法:DINT

操作:0→GIE或(0FFF7H.AND.SR→SR/.NOT.src.AND.dst→dst)

说明:使控制标志GIE清零,禁止所有中断。

仿真:BIC#8,SR

状态位:N,Z,C,V不受影响。

(8)*EINT:使能可屏蔽中断。

语法:EINT

操作:1→GIE或(0008H.OR.SR/.NOT.src.OR.dst→dst)

说明:使控制标志位GIE置位,使能所有中断。

仿真:BIS#8,SR

状态位:N,Z,C,V均不受影响。

注意:任何情况下都可以执行使能中断指令EINT后面的指令,甚至在中断服务请求悬而未决时也可以执行。

例4.20

状态寄存器中的一般中断使能位GIE清零,可允许非中断移动一个32位数值,这样可以保证在任何中断移动期间,该数值不会被修改。

DINT ;所有使用GIE位的中断事件被禁止

MOVCOUNTHI,R5 ;复制数值

MOVCOUNTLO,R6

EINT ;所有使用GIE位的中断事件被使能

4.3.5跳转与程序流程的控制类指令

MSP430指令系统可执行跳转与程序流程控制的指令,采用和其它指令相同的寻址方式,非常适合于计算地址以实现分支跳转和子程序调用。

(1)

*BR,BRANCH:转移至目的操作数。

语法:BRdst

操作:dst→PC

说明:无条件转移到64KB地址空间的任一地址处,可使用所有的源寻址方式。转移指令是一个字指令。

仿真:MOVdst,PC

状态位:不影响状态位。

例4.21

给出所有寻址方式的示例

BR#EXEC ;转移到标号EXEC或直接转移(例:#0A4H)

BREXEC ;转移到EXEC所包含的地址处执行

BR&EXEC ;转移到绝对地址EXEC中包含的地址

BRR5 ;转移到R5中包含的地址处开始执行

BR@R5 ;转移到R5指向的字中包含的地址

BR@R5+ ;转移到R5指向的字中包含的地址,然后R5中的指针增1下一次S/W流使用R5指针——它可通过访问R5指向的地址表中的下一个地址改变程序的执行

BRX(R5) ;转移到R5+X指向的地址中包含的地址(例:从X开始的地址表),X可以是一个地址也可以是一个标号

(2)

CALL:子程序调用指令。

语法:CALLdst

操作:dst→tmp;dst被评估和存储

SP-2→SP

PC→@SP ;将PC更新至TOS

tmp→PC ;将dst保存至PC

说明:调用64KB地址空间中任意一地址处的子程序,可使用所有的寻址方式。返回地址(后续指令的地址)存储在堆栈中,调用指令是一个字指令。

状态位:不影响状态位。

例4.22KCALL指令程序举例。

CALL#EXEC ;调用标号EXEC,直接寻址(例:#0A4H)

;SP-2→SP,PC+2→@SP,@PC+→PC

CALLEXEC ;调用EXEC中包含的地址,间接寻址

;SP-2→SP,PC+2→@SP,X(PC)→PC

CALL&EXEC;调用绝对地址EXEC中包含的地址,间接寻址

;SP-2→SP,PC+2→@SP,X(PC)→PC

CALLR5 ;调用R5中包含的地址

;SP-2→SP,PC+2→@SP,R5→PC

CALL@R5 ;调用R5指向的字中包含的地址

;SP-2→SP,PC+2→@SP,@R5→PC

CALL@R5+ ;调用R5指向的字中包含的地址,然后R5中的指针自动增2

;SP-2→SP,PC+2→@SP,@R5→PC

CALLX(R5) ;调用R5+X指向的地址中包含的地址(例如从X开始的地址表),X可以是一个地址也可以是一个标号。

;SP-2→SP,PC+2→@SP,X(R5)→PC

(3)

JC,JHS指令。

JC进位位置位时程序跳转。

JHS大于或等于时程序跳转。

语法:JC标号

JHS标号

操作:若C=1,PC+2×偏移→PC;

若C=0,顺序执行下一条指令。

说明:该指令用于测试状态寄存器的进位位。如果C被置位,则指令的LSB中包含的10位符号偏移加至程序计数器;如果C被复位,则执行该指令后面紧随其后的一条指令。JC用于比较无符号数(0~65535)(有进位/大于等于时跳转)。

状态位:N,Z,C,V均不受影响。

(4)JEQ,JZ指令。

JEQ等于时程序跳转。

JZ为零时程序跳转。

语法:JEQ标号

JZ标号

操作:若Z=1,则PC+2×偏移→PC;

若Z=0,则执行下一条指令。

说明:测试状态寄存器的零位Z。如果Z被置位,则指令的LSB中包含的10位符号偏移加至程序计数器;如果Z被复位,则顺序执行紧随其后的下一条指令。

状态位:N,Z,C,V均不受影响。

例4.25

若R5中的内容为0,则程序转移到地址TONI。

TSTR5 ;测试R5

JZTONI ;若为0,则程序跳转

例4.26

如果R6等于地址表的内容,则程序转移到地址LEO。

CMPR6,Table(R5);比较R6和MEM的内容(地址表+R5)

JEQLEO;若两数相等,则程序跳转

… ;若两数不相等,则程序继续执行

(5)JGE:大于或等于时程序跳转。

语法:JGE标号

操作:若(N.XOR.V)=0,程序跳转至标号:PC+2×偏移→PC;

若(N.XOR.V)=1,顺序执行下一条指令。

说明:测试状态寄存器的负位N和溢出位V。如果N和V均被置位或复位,则指令的LSB中包含的10位符号偏移加至程序计数器;如果N和V其中之一被复位,则顺序执行紧随其后的下一条指令。该指令允许比较符号整数。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论