MSP430汇编语言介绍伺服驱动部何国松2011.4.15一、单片机基本结构CPU:由运算器,控制器和寄存器组成,精简指令集(RISC);存储器:存储程序,数据以及外围模块的运行控制信息(PR和DR);外围模块:经过数据总线、地址总线、中断服务及请求线与CPU相连(时钟模块,看门狗,定时器,串口,ADC等)。二、总线(bus)1.数据总线(DB):用于CPU和存储器之间,以及CPU和接口电路之间传送数据,双向、位数相同;2.地址总线(AB):用于计算机访问存储器和外部设备,传输CPU发出的地址信息单向、总线位数决定可访问单元容量;3.控制总线(CB):传送CPU发出的控制信号,传送外部设备输入到CPU的信号。三、指令系统机器码(二进制编码),只有0,1串组成,不易理解记忆,单片机用一些助记符(如MOV,ADD等)代替操作码,用符号代替操作数编写源程序,形成汇编语言;MSP430的内核结构采用精简指令集(RISC)设计,指令分为硬件实现的内核指令和基于现有硬件结构的具有更高效率的模拟指令。四、CPU的结构和功能ALURIRIDPLAPCARDR存储器内部总线ABDB运算器(ALU):对二进制数进行加、减、乘、除等算数运算和与、或、非等逻辑运算;寄存器:一般包括通用寄存器(暂存数据,中间结果和地址)和特殊功能寄存器(PC、SP、AR、DR和SR等);控制器:主要由指令寄存器IR,译码器ID和操作控制器PLA等组成,在PC、AR和DR的配合下控制各部件协调工作。五、CISC和RISC的区别CISC:具有单一处理单元,外部存储器,一个相对较小的寄存器集以及几百条不同的指令。编程容易代码量少;处理器本身结构复杂,解码单元迟缓,硅片面积大耗电;RISC:具有较大的寄存器组,减少处理器访问主存储器的次数。更小更简单的指令解码单元,具有较高的指令执行速度,把硅片的复杂性转移到语言编译器里,简化硬件,降低处理单元的尺寸和功耗。六、存储器地址译码器。。。1100单元11FF单元1103单元1102单元1101单元。。。。。。110011011102110311FF地址内容DB控制CPU来的控制信号CBABMSP430存储空间结构MSP430的存储器结构采用了统一编址方式,可以使对外围模块寄存器的操作象普通的RAM单元一样方便、灵活。MSP430F169系列的存储空间为64KB,具有很强的系统外围模块扩展能力。七、寻址方式例:间接增量寻址汇编源程序ROM中的内容MOV@R10+,0(R11)MOV@(R10)+,0(R11)将地址为R10的单元中的内容移动到地址为R11的单元中,执行后R10内容变为R10+2,R11本身在执行前后不变。执行前执行后R100A123HR100A125HR110FA00HR110FA00H内存单元0A123H1234H内存单元0A123H1234H内存单元0FA00H5678H内存单元0FA00H1234H汇编指令集中常用符号和缩写八、MSP430指令系统精简指令集(RISC)设计;共有51条指令,包含27条硬件执行的内核指令和24条基于现有硬件结构的高效率的仿真指令;数据传送类指令1.MOV#234H,R5;将立即数234H传送到R5寄存器2.CLRR5;将R5寄存器清零3.PUSHSR;保存状态寄存器,堆栈指针-24.POPSR;从堆栈中恢复状态寄存器,堆栈指针+25.MOV#2345H,R5;寄存器中的值为2345HSWPBR5;执行后R5的内容为4523H6.MOV#2345H,R5;寄存器中的值为2345HSXTR5;执行后R5的内容为0045H,因为低字节符号位为0MOV#2388H,R5;寄存器中的值为2388HSXTR5;执行后R5的内容为FF88H,因为低字节符号位为1(SXT:扩展符号位,低位字节符号扩展到高位字节)数据运算指令加法指令1.ADD#10,R5;将10加至R5低位字节2.ADDC;带进位C的加法,主要用于多字节运算3.ADC&246H;将进位C加至绝对地址246H上的内容4.DADD;将十进制的进位位和源操作数加至目的操作数5.DADC;加上十进制的进位位6.INC;目的操作数+17.INCD;目的操作数+2减法指令1.SUB#1234H,R5;将R5中数据减去立即数1234H2.SUBC;从目的操作数中减去源操作数和借位;用于多字节运算3.SBC;从目的操作数中减去借位4.DEC;目的操作数-1,多用于修改地址指针和循环计数5.DECD;目的操作数-26.CMPR5,R6;R5和R6是否相等JEQLABEL1;如果是,程序跳转7.TST;测试目的操作数,比较目的操作数与0,根据结果设置状态位逻辑操作指令1.ANDR5,~0x01;将R5最低位置02.BIC#0FC00H,LEO;清LEO的高6位(将源操作数求反后和目的操作数逻辑与)3.BIS#0F000H,R5;R5的高4位置1(源操作数和目的操作数逻辑或)4.BIT#0100H,R7;测试R7的第8位是否为15.XORR5,R5;将R5清零XOR#0100H,R5;将R5的第8位取反6.INV;目的操作数求反7.RLA;算数左移,低位补08.RLC;通过进位位左移,标志位C送到操作数最低位9.RRA;算数右移,符号位不变10.RRC;通过进位位右移,标志位C移入MSB,LSB移入C位操作指令1.CLRC;清除进位位,字指令2.CLRN;清除负位3.CLRZ;清除零位4.SETC;设置进位位,置15.SETN;设置负位6.SETZ;设置零位7.DINT;禁止可屏蔽中断将状态寄存器GIE置08.EINT;使能可屏蔽中断跳转与程序流程的控制类指令1.BRR8;转移到R8中所包含的地址(无条件转移到64KB地址空间的任一地址位,可使用所有源寻址方式)2.CALL;调用子程序,返回地址存储在堆栈中3.JC;设置进位位时程序跳转JHS;大于或等于时程序跳转(用于无符号数)4.JEQ;等于时程序跳转JZ;为零时程序跳转5.JGE;大于或等于时程序跳转(有符号数)6.JL;小于时程序跳转(有符号数)7.JMP;程序无条件跳转8.JN;为负时程序跳转9.JNC;进位未设置时程序跳转JLO;小于时程序跳转(无符号数)10.JNE;不等时程序跳转JNZ;不为零时程序跳转11.RET;从子程序返回12.RETI;从中断返回13.NOP;空操作,可用于检查软件期间仿真指令或用于已确定的等待时间九、MSP430汇编语言程序设计汇编语言为我们提供了直接控制目标代码的手段,实时性好,设计流程可归纳为以下几步:1.根据任务要求,给出解决问题的思路,设计程序的整体结构,确定解决问题的算法并绘制程序流程图;2.进行资源分配;3.流程图具体化,写成汇编语言;4.对源程序进行汇编和调试。汇编语言伪指令伪指令是在机器汇编时供汇编程序识别和执行的指令,用来对汇编过程进行某种控制,或对符号、标号赋值,在汇编过程中不产生目标代码。将代码和数据汇编到规定的段中;在存储器中用未初始化的变量保存空间;控制汇编后列表文件的格式;初始化存储器;汇编条件块;定义全局变量;规定汇编器可以从中获得宏的库;产生符号化的调试信息。常用汇编伪指令模块控制:标志一个源程序的开始结束,并给模块命名和指示类型(NAME,MODULE,ENDMOD,END);段控制:说明代码和数据是怎样生成的(ASEG,RSEG,STACK,COMMON,ORG,ALIGN,EVEN);数据分配:对数据或模块赋值以及对寄存器类型定义(SET,EQU,DEFINE);数据定义与分配:(DB,DW,DL,DF,DS)。常用汇编程序结构1.顺序结构例程:32位数加法ADDR7,R5;ADDCR6,R4;RET入口R4,R5为第一个32位数,R6,R7为第二个32位数,出口为R4,R5,C为最高位。2.分支结构例程:32位二进制数求补码Bit#8000H,R6jnFUSHUjmpquitFUSHUinvR8incR8movSR,R7invR6movR7,SRadcR6NOPNOPQuitRET开始R6的最高位是否为0(判断数据正负)R8的内容取反加1,存入R8保护进位,SR送入R7R6中的内容取反取进位,加进位,存入R6结束YN3.循环结构例程:延迟程序MOV#60000,R5LOOPDECR5JNZLOOPRET每个指令为1个周期,共用60000*3个指令周期。十、汇编程序执行过程举例加法器实现6+7,将结果保存到存储器RAM区的200H地址单元。MOV#6,R4;将第一个加数6送至CPU的寄存器R4中ADD#7,R4;将第二个加数7与R4中的数相加,结果存在R4中MOVR4,&200H;将R4中的内容保存到RAM的200H单元中助记符机器码MOV#6,R440340006ADD#7,R450340007MOVR4,&200H44820200假设程序(机器码)存放在1100H开始的程序存储单元,由于MSP430是16位单片机,程序指令总是以字(16位)的形式取得,就是每次要取两个单元的内容。存储器地址编号存储器内容操作量指令1101-11004034操作码MOV#n,R41103-11020006操作数n=6H1105-11045034操作码ADD#n,R41107-11060007操作数n=7H1109-11084482操作码MOVR4,&n110B-110A0200操作数n=200HMSP430的CPU中PC被赋予第一条指令地址1100H,然后进入取第一条指令阶段ALURIR4034IDPLADR40344034PC1100AR1100344002110011001101110BABCB读DB4356712+2①PC的内容1100H传至地址寄存器AR;②PC的内容可靠送入AR后,由于程序指令以字的形式取得,一次取两个单元的内容,PC的内容+2变为1102H;③AR通过地址总线AB把地址信号1100H送至存储器,经地址译码器选中存储器1100H-1101H单元;④CPU通过控制总线CB向存储器发出读操作控制指令;⑤选中1100H-1101H存储单元的内容(4034)读至数据总线DB;⑥读出的内容(4034)经DB送至数据寄存器DR;⑦因为CPU处于取指阶段,取出为指令,故DR通过CPU内部总线把指令送入指令寄存器IR,然后经指令译码器ID译码,产生执行这条操作的各种控制指令。上一条是把立即数送至R4的指令,需要继续取操作数①PC的内容1102H传至地址寄存器AR;②PC的内容可靠送入AR后,PC的内容+2变为1102H;③AR通过地址总线AB把地址信号1102H送至存储器,经地址译码器选中存储器1102H-1103H单元;④CPU通过控制总线CB向存储器发出读操作控制指令;⑤选中1102H-1103H存储单元的内容(0006)读至数据总线DB上;⑥读出的内容(0006)经DB送至数据寄存器DR;⑦因为CPU处于取操作数阶段,取出为操作数,执行该指令,则DR通过CPU内部总线把数据(0006)送入寄存器R4。至此,第一条指令执行完毕,进入第二条指令取指阶段ALUR0006IRIDPLADR00060006PC1102AR110234060002110211001102110BABCB读DB4356712+2取第二条指令①PC的内容1104H传至地址寄存器AR;②PC的内容可靠送入AR后,PC的内容+2变为1106H;③AR通过地址总线AB把地址信号1104H送至存储器,经地址译码器选中存储器1104H-1105H单元;④CPU通过控制总线CB向存储器发出读操作控制指令;⑤选中1104H-1105H存储单元的内容(5034)读至数据总线DB;⑥读出的内容(5034)经DB送至数据寄存器DR;⑦因为CPU处于取指阶段,取出为指令,故DR通过CPU内部总线把指令送入指令寄存器IR,然后经指令译码器ID译码,产生执行这条操作的各种控制指令。ALURIR5034IDPLAD