1.12k likes | 1.31k Views
凌阳 16 位单片机. u ’ nSP 指令介绍. 主要内容. 16 位 u ’ nSP 内核架构 指令系统 ’ nSP ™ 汇编伪指令. 一、 16 位 u’nSP 内核架构. 16 位 u’nSP 内核架构. 16 位数据总线 / 22 位地址总线 a: 4M 字寻址空间 b: 64 页,每页 64K 字 . ’ nSP™ 存储器地址映射. 13 个 16 位寄存器 a: 4 个通用寄存器 (R1-R4) b: 4 个二级寄存器 (SR1-SR4) c: 1 个基址寄存器( BP ) d : 4 个系统寄存器
E N D
凌阳16位单片机 u’nSP指令介绍
主要内容 • 16位u’nSP 内核架构 • 指令系统 • ’nSP™汇编伪指令
16位数据总线/ 22位地址总线 a: 4M 字寻址空间 b: 64页,每页64K字 ’nSP™存储器地址映射
13个16位寄存器 • a: 4个通用寄存器(R1-R4) • b: 4个二级寄存器(SR1-SR4) • c: 1个基址寄存器(BP) • d : 4个系统寄存器 • SP:堆栈指针 • SR:状态寄存器 • PC:程序指针 • FR:标志寄存器 • SECBANK ON/OFF
状态寄存器 • CS:代码段 • DS:数据段 • 条件标志 N:负数标志 Z:零标志 S:符号位 C:进位标志
标志寄存器 • AQ:DIVS/DIVQ 执行的条件判别标志(0) • BNK:第二寄存器组使用标志(0) [Primary (0) / Secondary (1)] • FRA:FRACTION模式(0) [Off (0) / On (1)] • FIR:FIR_MOVE 模式(0) [On (0) / Off (1)] • SFT BUF:移位缓冲器或FIR运算保护位(0000)
标志寄存器(续) • F:快速中断使能标志(0) • I:普通中断使能标志(0) • INE:中断嵌套模式(0) [IRQNEST ON(1)/IRQNEST OFF(0)] • IRQ PRI:普通中断优先级寄存(1000) IRQ0>IRQ1>IRQ2>IRQ3>IRQ4>IRQ5>IRQ6>IRQ7
10个中断源 a: 1个快速中断 b: 8个一般中断 • c: 1个软件中断 支持中断嵌套模式 IRQNEST ON/OFF 在中断嵌套模式被启用时,如果在中断过程有更高优先级的中断发生,将发生中断嵌套。
符号约定 为了便于说明格式,在指令介绍前要先了解一些符号约定。 • Rd 目标寄存器或目标存储器指针 • Rs 源寄存器或源存储器指针 R1,R2,R3,R4,R5(BP) • NZSC SR寄存器中的4个标志位 • PC 程序指针 • SP 堆栈指针 • BP 基指针
SR 段寄存器 • → 数据传送符号 • MR 由R4,R3组成的32位结果寄存器 (R4为高字节,R3为低字节) • FIR 有限冲击响应(Finite Impulse Response) 指数字信号处理中的一种具有线性相位及任 意幅度特性的数字滤波器算法。 • {} 可选项 • [] 寄存器间接寻址标志
// 注释符 • RW 读等待态 • SW 存储等待态 • SRW 存储/读等待态 • ss 两个有符号数之间的操作, us 无符号数与有符号数之间的操作 • Label 程序标号
++,- - 指针单位字增量,字减量 • IM6/IM16 6位立即数/16位立即数 • A6/A16 6位地址码/16位地址码 • +,-,× 加法符号,减法符号,乘法符号 • &,|,^,~ 逻辑与符号,逻辑或符号, 逻辑异或符号,逻辑取反符号
6种寻址方式 • a: 立即数寻址:操作数以立即数的形式出现 • 例:R1 = 0x28; • b:存储器直接寻址:通过存储器地址来访问存储器中的数据 • 例:[0x30] = R4; • R4 = [0X30]; • c: 寄存器寻址:操作数在寄存器中 • 例: R3 = R1 • d: 寄存器间接寻址:操作数的地址由寄存器给出 • 例: R2 = [R3];
6种寻址方式 • e: 变址寻址:操作数的地址由基址和偏移量(6位)共同给出 • 例: R3 = [BP + 0x08]; • f: 多重间接寻址(入栈/出栈):可以将多个寄存器的值一次压入堆栈,或从堆栈中弹出 • 例:PUSH R1,R3 TO [SP]
指令分类 • 数据传送类 • 算逻运算类 • 程序转移控制类 • 其它控制类 • 位操作指令
一、数据传送类指令 • 立即数寻址/寄存器寻址/直接地址寻址 • 变址寻址/寄存器间接寻址 • 压栈 • 出栈
1、立即数寻址/寄存器寻址/直接地址寻址 这组指令会执行Rd = X的数据传送操作,即将源操作数X或源操作单元X中的字数据存入目标寄存器Rd。依据寻址方式的不同,X将有不同的意义。
应用举例 • R1=0x28 //IM6 R2=0x2400 //IM16R3=[BP + 0x08] //[BP+IM6]R4=[0x30] //A6R5=[0x2480] //A16SR=R2 //R CPU内部标志访问指令: • FR = Rs ; • Rs = FR ;
2、变址寻址/寄存器间接寻址 这组指令会执行X = Rd的数据传送操作,即将寄存器Rd的内容存入目标操作单元X。依据寻址方式的不同, X将有不同的意义;
应用举例 [BP+0x08]=R3 //写入[BP+IM6][0x30]=R4 //写入[A6][0x2480]=R5 //写入[A16][R2++] = 0x25 [R2++] = R1 //R1的值存于0x25单元 //R2=R2 +1
3、压栈 PUSH Rx, Ry to [Rs] PUSH Rx to [Rs] 将n(n=1~7,SIZE)个序列寄存器Rx~Ry(Rx~Ry≠SP)中的数据压入Rs指出地址偏移量初值的存储器中,且总是将序号高的寄存器内容先压入
4、出栈 POP Rx, Ry from [Rs] POP Rx from [Rs] 将一组由Rs指出地址偏移量初值的存储器中的数据拷贝到n(n = 1~7,SIZE)个序列寄存器Rx~Ry(Rx~Ry≠SP)中,且总是先拷贝数据到序号低的寄存器内。
二、算逻运算类指令 顾名思义这类指令就是用来完成一些算术逻辑运算的,基本是执行Rd = X # Y的算术逻辑运算。依据寻址方式的不同,X、Y将有不同的意义。
1、加法运算 这组指令会执行Rd = X+Y的算术运算,即将源操作数X、Y或源操作单元X、Y中的字数据进行不带进位的加法运算,结果存入Rd寄存器。
应用举例 R1+=0x28 //IM6R2=R1+0x2400 //IM16R3+=[BP + 0x08] //[BP+IM6]R4+=[0x30] //[A6]BP=R4+[0x2480] //[A16]SR+=R2 //R
2、带进位的加法运算 这组指令会执行Rd = X+Y+C的算术运算,即将源操作数X、Y或源操作单元X、Y中的字数据进行带进位的加法运算,结果存入Rd寄存器。
应用举例 R1=0x28,Carry // R1 = R1 +IM6 + 进位CR2=R1+0x2400,Carry // R2 = R1 +IM16 + 进位CR3+=[BP + 0x08],Carry // R3 = R3 +[BP+IM6] + 进位CR4+=[0x30] // R4 = R4 +[A6] + 进位CBP=R4+[0x2480],Carry // BP = R4 +[A16] + 进位CSR+=R2,Carry // SR=SR+R2+ 进位CPC+=D:[BP++],Carry // 写入PC,
3、减法运算 这组指令会执行Rd = X - Y的算术运算,即将源操作数X、Y或源操作单元X、Y中的字数据进行不带借位的减法运算,结果存入Rd寄存器。
应用举例 R1-=0x28 // R1 = R1 - IM6R2=R1-0x2400 // R2 = R1 - IM16R3-=[BP + 0x08] // R3 = R1 - [BP+IM6]R4-=[0x30] // R4 = R4 - [A6]BP=R4-[0x2480] // BP = R4 - [A16]SR-=R2 // SR = SR - R2PC-=D:[R5++] // 写入PC,
4、不带借位的减法运算 这组指令会执行Rd = X - Y - C = X + (~Y) + C的算术运算,即将源操作数X、Y或源操作单元X、Y中的字数据进行带借位的减法运算,结果存入Rd寄存器。
应用举例 R1-=0x20,Carry // R1 = R1 -IM6 -进位CR2-=R1+0x2400+ Carry // R2 = R1 -IM16 -进位CR3-=[BP + 0x08],Carry // R3 = R3 -[BP+IM6] -进位CR4-=[0x30] // R4 = R4 -[A6] -进位CBP=R4-[0x2480], Carry // BP = R4 -[A16] -进位CSR-=R2,Carry // SR = SR - R2 - 进位CPC-=D:[BP++],Carry // 写入PC,
5、取补运算 这组指令会执行Rd = -X = (~X) + 1的算术运算,结果存入Rd寄存器。
应用举例 R1=-0x27 // R1 = R1 -IM6R3=-[BP+0x08] // R3 = R3 -[BP+IM6]R4=-[0x30] // R4 = R4 -[A6]BP=-[0x2480] // BP = BP - [A16]SR=-R2 // SR = SR - R2PC=-D:[R5++] // 写入PC
6、比较运算 这组指令会执行X-Y的算术运算,但只影响NZSC标志,而不将结果存储。
应用举例 CMP R1,0x27 // 比较 R1,IM6CMP R3,[BP+0x08] // 比较 R3,[BP+IM6]CMP R4,[0x30] // 比较 R4,[A6]CMP BP,[0x2480] // 比较 BP,[A16]CMP SR,R2 // 比较SR,R
7、乘法运算指令 Rd中字数据与Rs中字数据相乘,积存入MR(R4,R3)。如果 Fraction mode 是使能的,这个结果会向左移一位 。 ss表示为两个有符号数相乘, us则表示无符号数与有符号数相乘; 缺省表示为两个有符号数相乘。
MR = Rd * Rs; // 默认情况为有符号乘有符号 • MR = Rd * Rs,uu; // 无符号乘无符号 • MR = Rd * Rs, ss; // 有符号乘有符号 • MR = Rd * Rs, us;// Rd为无符号数 , Rs 为有符号 • //数. 第一个寄存器总是无符号 • //的,第二个寄存器是有符号的
应用举例: MR=R2*R1; //两个有符号数相乘 MR=R1*R2, us; // R1中是无符号数, // R2中为有符号数,
8、n项内积运算指令 指针Rd与Rs所指存储器地址内有符号字数据之间或无符号与有符号字数据之间进行n项内积运算,结果存入MR。
应用举例 MR=[R2]*[R1], 8; //两个有符号数之内积运算 MR=[R1]*[R2], us, 2; //R1中是无符号数,R2中为有符号数
9、除法( DIVS、DIVQ) 除法运算可以是有符号或者是无符号的,但分子分母必需是同类型的数据。请将32位的被除数放到MR(R4,R3)中,16位的除数放到R2中,并清掉AQ标志,然后就可以进行除法运算。 对于有符号除法,首先应执行DIVS一次,从而得到商的符号位,然后多次执行DIVQ得到商; 对于无符号除法,通过多次执行DIVQ得到商。 运算结果的商在R3中。
10、逻辑与 这组指令会执行Rd = X & Y的逻辑与操作,结果存入Rd寄存器。
11、逻辑或 这组指令会执行Rd = X | Y的逻辑或操作,结果存入Rd寄存器。