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

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第4章MSP430单片机指令系统与程序设计主要内容4.1寻址方式4.2指令系统4.3汇编语言程序设计4.4C语言程序设计4.5在C语言和汇编语言混合编程4.6MSP430开发工具简介24.1寻址方式寻址方式是指在指令执行过程中找到操作数地址的方法。MSP430一共有7种寻址方式,源操作数可以使用全部的7种寻址方式,而目的操作数只能使用其中的4种寻址方式,31.寄存器寻址操作数就在寄存器中,由寄存器直接给出,可以是源操作数,也可以是目的操作数。适用于源操作数和目的操作数举例:操作:将R10的内容移动到R11中。4汇编源程序ROM中的内容MOVR10,R11MOVR10,R11执行前执行后R10123HR10123HR110FA00HR11123HPCPC_oldPCPC_old+2举例:操作:将R10的内容移动到R11中。2.变址寻址操作数在内存中,操作数的地址为寄存器内容加上前面的偏移量。适用于源操作数和目的操作数举例:操作:将地址为(R5)+2的存储单元内容移动到地址为(R6)+3的存储单元中5汇编源程序ROM中的内容MOV2(R5),3(R6)MOVX(R5),Y(R6)X=2Y=3执行前执行后R501080HR501080HR60108CHR60108CH内存单元01082H1234H内存单元01082H1234H内存单元01090H5678H内存单元01090H1234H3.符号寻址操作数在内存中,操作数的地址在指令中直接给出。适用于源操作数和目的操作数。举例:操作:将地址为EDE的单元内容移动到地址为TON1的单元中。其中EDE=PC+X,TON1=PC+Y。6汇编源程序ROM中的内容MOVEDE,TON1MOVX(PC),Y(PC)X=EDE-PCY=TON1-PC执行前执行后内存单元01234H67H内存单元01234H67H内存单元02345H8BC0H内存单元02345H67H4.绝对寻址操作数在内存中,操作数的地址在指令中直接给出。绝对寻址可以看作当PC=0时的符号寻址。适用于源操作数和目的操作数。举例:操作:将地址为EDE的内容移动到地址为TON1中。如果EDE=1234H,TON1=2345H,则:7汇编源程序ROM中的内容MOV&EDE,&TON1MOVX(0),Y(0)X=EDEY=TON1执行前执行后内存单元01234H67H内存单元01234H67H内存单元02345H8BC0H内存单元02345H67H5.间接寻址操作数在内存中,操作数的地址在寄存器中。适用于源操作数。举例:操作:将地址为R10的单元中内容移动到地址为R11的单元中。R10和R11本身的值在执行前后不变。8汇编源程序ROM中的内容MOV@R10,0(R11)MOV@(R10),0(R11)执行前执行后R10123HR10123HR110FA00HR110FA00H内存单元123H1234H内存单元123H1234H内存单元0FA00H5678H内存单元0FA00H1234H6.间接增量寻址这种寻址方式的操作数在内存中,操作数的地址在寄存器中。源寄存器的内容在执行后自动加2(字操作)或加1(字节操作),目的寄存器内容不变。这种寻址方式适合于对表进行随机访问,目的寄存器内容需要手动改变。只适用于源操作数。举例:操作:将地址为R10的单元中内容移动到地址为R11的单元中。执行后R10内容变为R10+2,R11本身的值在执行前后不变。9汇编源程序ROM中的内容MOV@R10+,0(R11)MOV@(R10)+,0(R11)执行前执行后R10123HR10125HR110FA00HR110FA00H内存单元123H1234H内存单元123H1234H内存单元0FA00H5678H内存单元0FA00H1234H7.立即寻址操作数在指令中由源操作数直接指出。适用于源操作数。举例:MOV#23H,TON1;将常数23移动到目的地址TON1中。104.2指令系统4.2.1指令系统概述MSP430单片机的内核CPU结构是按照精简指令集和高透明指令的宗旨来设计的,共有51条指令,其中包含27条硬件执行的内核指令和24条基于现有硬件结构的高效率的仿真指令,使用起来非常方便。MSP430单片机指令格式如下:[标号](伪)指令助记符[操作数1],[操作数2][;注释]114.2.2数据传送类指令数据传送是单片机最基本、最重要的一种操作,在一个实际程序中,数据传送指令使用的比例是最高的。所以,数据传送是否方便、灵活,速度是否快,是指令系统要考虑的重要问题。MSP430具有丰富的数据传送指令,能够实现多种数据传送操作。121.MOV作用:将原操作数移至目的操作数,目的操作数以前的数据被覆盖,原操作数保持不变。语法:MOV.Bsrc,dst/MOV[.W]src.dst操作:src-dst状态位:不影响状态位方式位:OscOff、CPUOff和GIE不受影响例子:MOV#234H,R5;将立即数234H传送到R5寄存器MOV&234H,R5;将内存地址为234H里的数据传送到寄存器R5MOV&234H,&200H;将内存地址为234H里的数据传送到内存地址200H中说明:MOV指令使用灵活、功能强大,是单片机指令系统中使用最为频繁的指令。它可以实现多种方向的数据传送。132.CLR作用:清除目的操作数语法:CLR.Bdst/CLR[.W]dst操作数:0-dst状态位:不影响状态位例子:CLRTON1;将RAM字TON1清零CLRR5;将R5寄存器清零143.PUSH作用:将字节压进堆栈,堆栈指针减2,然后源操作数移至由此指针寻址的RAM字。语法:PUSH.Bsrc/PUSH[.W]src操作数:SP-2–SPSrc-@SP状态位:不影响状态位方式位:OscOff、CPUOff和GIE不受影响例子:PUSHSR;保存状态寄存器PUSHR8;将寄存器R8的值保存到堆栈中说明:对于PUSH指令,系统堆栈指针减2,并与字节后缀无关,这是强制性的,因为系统堆栈指针不止用于PUSH指令,还用于中断服务程序。154.POP作用:将堆栈栈顶所指向的字从堆栈弹出至目的操作数,然后堆栈的指针增2语法:POP.Bdst/POP[.W]dst操作数:@SP-dstSP+2–SP状态位:不影响状态位方式位:OscOff、CPUOff和GIE不受影响例子:POPSR;从堆栈恢复状态寄存器POP.BR7;从堆栈恢复R7的值,堆栈的低位字节移至R7,R7的高位字节为00H说明:对于POP指令,系统堆栈指针增2,并与字节后缀无关。这是强制性的,因为系统堆栈指针不止用于POP指针,还用于中断服务指令。165.SWPB作用:交换字节指令,将目的操作数的高位字节和低位字节互换(只能是字操作)语法:SWPBdst操作数:位15~8–位7~0状态位:不影响状态位方式位:OscOff、CPUOff和GIE不受影响举例:MOV#2345H,R5;寄存器R5中的值为2345HSWPBR5;执行后R5的内容为4523H176.SXT作用:扩展符号位,低位字节的符号扩展到高位字节(字操作指令)语法:SXTdst操作数:位7-位8-……-位15状态位:N:结果为负时置位,否则复位Z:结果为0时置位,否则复位C:结果为非0时置位,否则复位V:复位方式位:OscOff、CPUOff和GIE不受影响举例:MOV#2345H,R5;寄存器R5中的值为2345HSXTR5;执行后R5的内容为0045H,因为低字节符号位为0MOV#2388H,R5;寄存器R5中的值为2388HSXTR5;执行后R5的内容为FF88H,因为低字节符号位为1184.2.3数据运算指令MSP430系列单片机指令系统主要有两类数据运算指令:加法运算和减法指令。使用数据运算类指令时,要特别注意这些指令对标志位的影响。191.加法指令助记符语法格式操作ADDADD[.W]/ADD.BSRC,DSTSRC+DST-DSTADCADC[.W]/ADC.BDSTDST+C-DSTADDCADDC[.W]/ADDC.BSRC,DSTSRC+DST+C-DSTDADCDADC[.W]/DADC.BDSTDST+C-DST(十进制)DADDDADD[.W]/DADD.BDSTSRC+DST+C-DST(十进制)INCINC[.W]/INC.BDST+1-DSTINCDINCD[.W]/INCD.BDST+2-DST20(1)ADD作用:将源操作数加至目的操作数,源操作数不受影响,目的操作数以前的数据丢失。语法:ADDsrc,dst/ADD[.W]src,dst操作数:src+dst-dst状态位:N:结果为负时置位,否则复位Z:结果为0时置位,否则复位C:结果产生进位时置位,否则复位V:发生算术溢出时置位,否则复位方式位:OscOff、CPUOff和GIE不受影响举例:ADD#10,R5;将10加至R5的低位字节JCTON1;若(R5)≥65526[0AH+0F6H],则产生进位……;不产生进位21(2)ADDC作用:将源操作数和进位位C加至目的操作数,源操作数不受影响,目地操作数以前的数据丢失。语法:ADDC.Bsrc,dst/ADDC[.W]src,dst操作数:src+dst+C–dst状态位:N:结果为负时置位,否则复位Z:结果为0时置位,否则复位C:结果产生进位时置位,否则复位V:发生算术溢出时置位,否则复位方式位:OscOff、CPUOff和GIE不受影响22举例:ADDC指令主要用于多字节加法运算。在MSP430中,可以进行8位的字节运算和16位的字运算。在某些场合需要扩大数的运算范围,需要进行多字节运算。例如,有两个32位数相加,加法要分两次进行,对应的先进行低字节相加,然后再进行高字节相加。在两个高字节相加的时候,要把前面两个字相加的进位考虑进去,这就要用到带进位的加法指令。如两个字存放的起始地址为220H和230H,相加后和存放在240H开始的地址。实现这两个32位数相加的程序段如下:ADD&220H,&230H;对应低位字相加MOV&230H,&240H;保存低位和ADDC&222H,&232H;高位相加的时候要加上低位的进位。MOV&232H,&242H;保存高位和MOV#0,&244H;清除&244H单元,为保存高位进位做准备ADDC#0,&244H;保存高位进位23(3)ADC作用:将进位位加到目的操作数,操作数以前的数据丢失语法:ADC.Bdst/ADC[.W]dst操作数:dst+C–dst状态位:N:结果为负时置位,否则复位Z:结果为0时置位,否则复位C:结果产生进位时置位,否则复位V:发生算术溢出时置位,否则复位方式位:OscOff、CPUOff和GIE不受影响举例:在前一个例子中,两个32位数相加程序段中最后一条指令的功能可由ADC&244H实现。24(4)DADD作用:将十进制的进位位和源操作数加至目的操作数。源操作数和目的操作数均被当做4个带有正负号的十进制BCD数。十进制的源操作数和进位位C被加至目的操作数。源操作数不受影响,目的操作数以前的数据丢失。该操作对与非BCD数是不确定的。DADD指令类似于ADDC指令,只是操作数的性质不一样,前者为BCD数,后者为二进制数。DADD指令进行加法运算时,由于不需要进行二进制到BCD数的转换,会节省时间和ROM空间。状态位:N:MSB为1时置位Z:结果为0时置位,否则置1C:结果大于9999时置位V:不变方式位:OscOff、CPUOff和GIE不受影响举例:R5和R6中的8位BCD数加至R3和R4中的8位BCD数。CLRC;清楚进位位DADDR5,R3;加LSDsDADDR6,R4;带进位位加MSDsJCOVERFLOW;若产生进位,转移至错误处理子程序。25(5)DADC作用:加上十进制的进位位,进位位C作为十进制加至目的操作数。DADC指令类似AD

1 / 81
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功