nullnull第3章
指令系统 null3.1 指令系统的概述及符号约定µ’nSP™单片机指令按其功能可划分为: 1) 数据传送指令:包括立即数到寄存器、寄存器到寄存 器、寄存器到存储器存储器到寄存器的数据传送操作;
2) 算术运算:包括加、减、乘运算;
3) 逻辑运算:包括与、或、异或、测试、移位等操作;
4) 转移指令:包括条件转移、无条件转移、中断返回、子程序调用等操作;
5) 控制指令:如开中断、关中断、FIR滤波器的数据的自由移动等操作。 null寻址方式:1、立即数寻址: 这种寻址方式是操作数以立即数的形式出现,例如:R1 = 0x1234,是把16进制数0x1234赋给寄存器R1。
2、存储器绝对寻址: 这种寻址方式是通过存储器地址来访问存储器中的数据,例如:R1 = [0x2222],访问0x2222单元的数据。
3、寄存器寻址: 这种寻址方式是操作数在寄存器中,例如:R1 = R2,是把寄存器R2 中的数据赋给寄存器R1。
4、寄存器间接寻址: 这种寻址方式是操作数的地址由寄存器给出,例如:R1 = [BP],是把由BP指向的内存单元的数据送寄存器R1。
5、变址寻址: 这种寻址方式下,操作数的地址由基址和偏移量共同给出,例如:R1 = [BP+0x34]。 null
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
3-1 符号约定 null3.2 数据传送指令一、立即数寻址:
【影响标志】 N,Z
【格式】 Rd = IM16 //16位的立即数送入目标寄存器Rd
Rd = IM6 //6位的立即数扩展成16位后送入目标寄存器Rd null二、寄存器寻址:
【影响标志】 N,Z
【格式】 Rd = Rs //将源寄存器Rs的数据送给目标寄存器Rd 三、直接地址寻址:
【影响标志】 N,Z
【格式】 [A6] = Rs //将源寄存器Rs中的数据送给以A6为地址的存储单元 [A16] = Rs //把Rs数据存储到A16指出的存储单元
Rd = [A6] //把A6指定的存储单元数据读到Rd寄存器
Rd = [A16] //把A16指定的存储单元数据读到Rd寄存器 四、变址寻址:
【影响标志】 N,Z
【格式】
[BP + IM6] = Rs //把Rs的值存储到基址指针BP与6位的立即/数之和指出的存储单 元。
Rd = [BP +IM6] //把基址指针BP与6位的立即数的和指定的存储单元数据读到Rd寄存器。 null五、寄存器间接寻址:
【影响标志】 N,Z
【格式】 [Rd] = Rs //把Rs的数据存储到Rd的值所指的存储单元Rd 中存放的是 操作数的地址。 [例3.1]:将R3的值保存于0x25单元
R3 = 0x5678 //把16位立即数0x5678赋给R3
方法1:
[0x25] = R3 //将R3的值存储于0x25存储单元,直接地址寻址
方法2: //0x25单元的
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
为0x5678
R2 = 0x25 //立即数0x25送入R2中
[R2] = R3 //将R3的值存储于0x25存储单元,寄存器间接寻址
方法3: //0x25单元的内容为0x5678
BP = 0x20 //立即数0x20送入BP中;
[BP + 5] = R3 //将R3的值存储于0x25存储单元,变址寻址0x25、
//单元的内容为0x5678 null表3.2 数据传送指令一览表 null堆栈操作
【格式】 PUSH Rx,Ry TO [SP]
POP Rx,Ry FROM [SP]
【说明】Rx,Ry 可以是R1~R4,BP,SP,PC中的任意两个或一个,执行后将Rx~Ry的序列寄存器压栈,或将堆栈中的数据弹入Rx~Ry序列寄存器中,压栈操作不影响标志位,出栈操作影响N,Z标志,当Rx,Ry中含有SR时,所有标志位都会改变。压栈、出栈操作的执行周期为2n + 4,若出栈操作的目的寄存器中含有PC时,执行周期为3n+6。其中n是压栈数据的个数。压栈和出栈的指令长度均为1字长 【举例】 PUSH R1,R5 to [SP] //将R5,R4,R3,R2,R1压
PUSH R2,R2 to [SP] //将R2压栈
PUSH R3 to [SP] //将R3压栈
POP R3 from [SP] //R3出栈
POP R2,R2 from [SP] //R2出栈
POP R1,R5 from [SP] //R1,R2,R3,R4,R5出栈 null 3.3 算术运算
3.3.1 加法运算
加法运算影响标志位:N,Z,S,C。
立即数寻址(不带进位):
【格式1】 Rd += IM6 或 Rd = Rd + IM6
【操作】 Rd + IM6 → Rd
【说明】 Rd的数据与6位(高位扩展成16位)立即数相加,结果送Rd;
【格式2】 Rd = Rs + IM16
【操作】 Rs + IM16 → Rd
【说明】 Rd的数据与16位的立即数相加,结果送Rd; null直接地址寻址 :
【格式1】 Rd += [A6] 或 Rd = Rd + [A6]
【操作】 Rd + [A6] → Rd
【说明】 Rd的数据与6位地址指定的存储单元中的数据相加,结果送Rd。
【格式2】 Rd = Rs + [A16]
【操作】 Rs + [A16] → Rd
【说明】 Rs的数据与16位地址指定的存储单元中数据相加,结果送Rd。 变址寻址:
【格式】 Rd += [Bp + IM6] 或 Rd = Rd + [BP + IM6]
【操作】 Rd + [Bp + IM6] → Rd
【说明】 取基址指针BP与6位的立即数的和指定的存储单元中的数据与Rd相加,结果送Rd寄存器。 寄存器寻址:
【格式】 Rd += Rs
【操作】 Rd + Rs → Rd
【说明】 Rd与Rs的数据相加,结果送Rd。 null寄存器间接寻址:
【格式1】 Rd += [Rs];
【操作】 Rd + [Rs] → Rd
【说明】 Rd的数据与Rs所指定的存储单元中的数据相加,结果送Rd
【格式2】 Rd += [Rs++]
【操作】 Rd + [Rs] → Rd, Rs + 1 → Rs
【说明】 Rd的数据与Rs所指定的存储单元中的数据相加,结果送Rd,修改Rs,Rs=Rs+1
【格式3】 Rd += [Rs--];
【操作】 Rd + [Rs] → Rd, Rs - 1 → Rs
【说明】 Rd的数据与Rs所指定的存储单元中数据相加,结果送Rd, Rs=Rs- 1
【格式4】 Rd += [++Rs];
【操作】 Rs + 1→ Rs, Rd + [Rs] → Rd
【说明】 首先修改Rs=Rs+1,Rd的数据与Rs所指定的存储单元中的数据相加,结果送Rd,
注意:有符号数的溢出只判断N和S两位:N!=S时溢出,N=S时无溢出。 null3.3.2 减法运算
减法运算影响标志位:N,Z,S,C。
立即数寻址:
【格式1】 Rd - = IM6 或 Rd = Rd – IM6
【操作】 Rd – IM6 → Rd
【说明】 Rd的数据减去6位(bit)立即数,结果送Rd。
【格式2】 Rd = Rs – IM16
【操作】 Rs – IM16 → Rd
【说明】 Rs的数据减去16位(bit)立即数,结果送Rd。
直接地址寻址:
【格式1】 Rd - = [A6] 或 Rd = Rd – [A16]
【操作】 Rd – [A6] → Rd
【说明】 Rd的数据减去[A6]存储单元中的数据,结果送Rd。
【格式2】 Rd = Rs -[A16]
【操作】 Rs – [A16] → Rd
【说明】 Rs的数据减去[A16]存储单元中的数据,结果送Rd。
变址寻址:
【格式】 Rd - = [BP + IM6] 或 Rd = Rd – [BP + IM6]
【操作】 Rd – [BP + IM6] → Rd
【说明】 Rd的值减去基址加变址指定的存储单元的值,结果送Rd null寄存器寻址:
【格式】 Rd - = Rs
【操作】 Rd – Rs → Rd
【说明】 寄存器Rd的数据减去Rs的数据,结果送Rd寄存器
寄存器间接寻址:
【格式1】 Rd - = [Rs]
【操作】 Rd -[Rs] → Rd
【说明】 Rd的数据与Rs所指定的存储单元中的数据相减,结果送Rd。
【格式2】 Rd - = [Rs++]
【操作】 Rd - [Rs] → Rd, Rs+1 → Rs
【说明】 Rd的数据与Rs所指定的存储单元中的数据相减,结果送Rd, Rs的值加1
【格式3】 Rd - = [Rs--]
【操作】 Rd - [Rs] → Rd, Rs –1 → Rs
【说明】 Rd的数据与Rs所指定的存储单元中的数据相减,结果送Rd, Rs的值减1
【格式4】 Rd - = [++Rs]
【操作】 Rs + 1 → Rs,Rd - [Rs] → Rd
【说明】 Rs 的值加1,Rd的数据与Rs所指定单元数据相减,结果送Rd null3.3.3 带进位的加减运算
带进位的加法格式 :
Rd += IM6,Carry
Rd = Rd + IM6,Carry
Rd = Rs + IM16,Carry
Rd += [BP + IM6] ,Carry
Rd = Rd + [BP + IM6] ,Carry
Rd += [A6] ,Carry
Rd = Rd + [A6] ,Carry
Rd = Rs + [A16] ,Carry
Rd += Rs,Carry
Rd += [Rs] ,Carry
Rd += [++Rs] ,Carry
Rd += [Rs--],Carry
Rd += [Rs++],Carry null带进位的减法格式 :
Rd - = IM6,Carry
Rd = Rd - IM6,Carry
Rd = Rs - IM16,Carry
Rd - = [BP + IM6] ,Carry
Rd = Rd - [BP + IM6] ,Carry
Rd - = [A6] ,Carry
Rd = Rd - [A6] ,Carry
Rd = Rs - [A16] ,Carry
Rd - = Rs,Carry
Rd - = [Rs] ,Carry
Rd - = [++Rs] ,Carry
Rd - = [Rs--],Carry
Rd - = [Rs++],Carry null3.3.4 取补运算
取一个数的补码,在计算机中表示为取其反码,再加1,SPCE061A也正是这样处理的。取补运算影响标志位N,Z。
【举例】计算数- 600与0x0040单元数据的差。
R1 = - 600
R2=0x0001
[0x0040]=R2
BP = 0x0040 //取该单元地址
R2 = -[BP] //取此数的补码,-1的补码为0xFFFF
R1 += R2 //相加,结果送R1
3.3.5 SPCE061A的乘法指令
注:Rd,Rs可用R1~R4,BP;MR由R4、R3构成,R4是高位,R3为低位
【影响标志】无
【格式1】 MR = Rd * Rs 或 MR = Rd * Rs,ss
【功能】 Rd * Rs → MR
【说明】 表示两个有符号数相乘,结果送MR寄存器
【格式2】 MR = Rd * Rs,us
【功能】 Rd * Rs → MR
【说明】 表示无符号数与有符号数相乘,结果送MR寄存器。 null3.3.6 SPCE061A的n项内积运算指令
【影响标志】无
【格式】 MR = [Rd] * [Rs] {,ss} {,n}
【功能】 指针Rd与Rs所指寄存器地址内有符号数据之间或无符号与有符号字数据之间进行n项内积运算,结果存入MR。符号的缺省选择为ss,即有符号数据之间的运算。n的取值为1~16,缺省值为1。 内积运算操作如图3-2所示。
【执行周期】10n+6
【说明】 当FIR_MOV ON时,允许FIR运算过程中数据自由移动。为新样本取代旧样本进行数据移动准备:Xn- 4=Xn- 3,Xn- 3=Xn- 2,Xn- 2=Xn- 1。如上图所示当完成一次内积运算后,X1、X2、X3自动右移,X4移出。这在数字信号处理中十分有用。比如你要计算连续4次采样值的平均值,你即可将采样值放到X1- - - -X4中,加权系数放到C中,然后完成[Rd] * [Rs] {,ss} {,4}运算,再求平均值。当FIR_MOV ON时,运算完后X1、X2、X3自动右移,X4移出,这样我们就可以把下一次的采样值X0放到原X1的位置,下一次直接[完成Rd] * [Rs] {,ss} {,4}运算,即X0-X3的运算,不必手动移动Xn。 null内积运算操作示意图示
注意: (1)Rs和 Rd其中任意一个都不能为R3或R4,否则会出错。
(2)Rs和Rd不能同为一个寄存器,否则会出错。 null3.3.7 比较运算(影响标志位N,Z,S,C)
比较运算执行两数的减法操作,不存储运算结果,只影响标志位N、Z、S、C,下面按寻址方式分别介绍比较运算的各条指令。
立即数寻址:
【格式1】 CMP Rd,IM6
【说明】 将Rd与6位(bit)立即数相减。
【格式2】 CMP Rd,IM16
【说明】 将Rd与和16位立即数相减。
直接地址寻址:
【格式1】 CMP Rd, [A6]
【说明】 此指令将Rd的值与A6指定地址单元的数据相减。
【格式2】 CMP Rd, [A16]
【说明】 此指令将Rd的值与A16指定地址单元的数据相减。
寄存器寻址:
【格式】 CMP Rd,Rs
【说明】 该指令将Rd与Rs的值相减。
变址寻址:
【格式】 CMP Rd,[BP + IM6]
【说明】 该指令将Rd与[BP + IM6] 指定地址单元数据相比较。 null寄存器间接寻址:
【格式1】 CMP Rd,[Rs]
【说明】 将Rd的值与寄存器Rs指定存储单元的数据相比较
【格式2】 CMP Rd,[Rs++]
【说明】 将Rd的值与寄存器Rs指定存储单元的数据相比较,并修改Rs的值使Rs的值加1。
【格式3】 CMP Rd,[Rs--]
【说明】 将Rd的值与寄存器Rs指定存储单元的数据相比较,并修改Rs的值,使Rs值减1。
【格式4】 CMP Rd,[++Rs]
【说明】 修改Rs的值,使Rs加1,将Rd的值与寄存器Rs指定存储单元的数据相比较,结果影响标志位。 null3.4 SPCE061A的逻辑运算
3.4.1 逻辑与
逻辑与运算影响标志位N,Z
立即数寻址:
【格式1】 Rd &= IM6 或 Rd = Rd & IM6
【功能】 Rd & IM6 → Rd
【说明】 该指令将Rd的数据与6位立即数进行逻辑与操作,结果送Rd寄存器。
【格式2】 Rd = Rs & IM16
【功能】 Rs & IM16 → Rd
【说明】 该指令将Rs的数据与16位立即数进行逻辑与操作,结果送Rd寄存器
直接地址寻址:
【格式1】 Rd &=[A6] 或 Rd = Rd & [A6]
【功能】 Rd & [A6] → Rd
【说明】 将Rd 和A6指定存储单元数据进行逻辑与操作,结果送Rd寄存器
【格式2】 Rd = Rs & [A16]
【功能】 Rs & [A16] → Rd
【说明】 Rs中的数据和A16指定存储单元中的数据进行逻辑与操作,结果送Rd寄存器。 。 null寄存器寻址:
【格式】 Rd &= Rs
【功能】 Rd & Rs → Rd
【说明】 将Rd和Rs的数据进行逻辑与操作,结果送Rd寄存器。
【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1
R1=0x00FF //R1的初值为0x00FF,Z=0,N=0
R2=0xFFFF //R1的初值为0xFFFF,Z=0,N=1
R1&=R2 //结果为0x00FF,执行后标志位N变为0,Z=0
寄存器间接寻址:
【格式1】 Rd &= [Rs]
【功能】 Rd & [Rs] → Rd
【说明】 将Rd数据与Rs指定的存储单元数据进行逻辑与操作结果送Rd寄存器。
【格式2】 Rd &= [Rs++]
【功能】 Rd & [Rs] → Rd,Rs + 1 → Rs
【说明】 将Rd的数据与Rs指定的单元的数据进行逻辑与操作,结果送Rd寄存器,修改Rs的值,使Rs加1。
【格式3】 Rd &= [Rs--]
【功能】 Rd & [Rs] → Rd,Rs 1 → Rs
【说明】 将Rd的数据与Rs指定的单元的数据进行逻辑与操作,结果送Rd寄存器,修改Rs的值,使Rs减1。
【格式4】 Rd &= [++Rs]
【功能】 Rs + 1 → Rs,Rd & [Rs] → Rd
【说明】 修改Rs的值,Rs加1,将Rd的数据与Rs指定的单元的数据进行逻辑与操作,结果送Rd寄存器 null3.4.2 逻辑或
逻辑或影响标志位N,Z
立即数寻址:
【格式1】 Rd |= IM6 或 Rd = Rd | IM6
【功能】 Rd | IM6 → Rd
【说明】 该指令将Rd的数据与6位立即数进行逻辑或操作,结果送Rd寄存器。
【格式2】 Rd = Rs | IM16
【功能】 Rs | IM16 → Rd
【说明】 该指令将Rs的数据与16位立即数进行逻辑或操作,结果送Rd寄存器。
直接地址寻址:
【格式1】 Rd |=[A6] 或 Rd = Rd | [A6]
【功能】 Rd | [A6] → Rd
【说明】 将Rd 和A6指定单元数据进行逻辑或操作,结果送Rd寄存器
【格式2】 Rd = Rs | [A16]
【功能】 Rs | [A16] → Rd
【说明】 Rs的数据和A16指定单元数据进行逻辑或操作,结果送Rd寄存器。
null寄存器寻址:
【格式】 Rd |= Rs
【功能】 Rd | Rs → Rd
【说明】 将Rd和Rs的数据进行逻辑或操作,结果送Rd寄存器。
寄存器间接寻址:
【格式1】 Rd |= [Rs]
【功能】 Rd | [Rs] → Rd
【说明】 将Rd的数据与Rs指定的单元的数据进行逻辑或操作,结果送Rd寄存器。
【格式2】 Rd |= [Rs++]
【功能】 Rd | [Rs] → Rd,Rs + 1 → Rs
【说明】 将Rd的数据与Rs指定的单元的数据进行逻辑或操作,结果送Rd寄存器,修改Rs的值,使Rs加1。
【格式3】 Rd |= [Rs--]
【功能】 Rd | [Rs] → Rd,Rs 1 → Rs
【说明】 将Rd的数据与Rs指定的单元的数据进行逻辑或操作,结果送Rd寄存器,修改Rs的值,使Rs减1。
【格式4】 Rd |= [++Rs]
【功能】 Rs + 1 → Rs,Rd | [Rs] → Rd
【说明】 首先,Rs的值将加1,Rd与Rs指定的单元的数据进行逻辑或操作,结果送Rd寄存器。 null3.4.3 逻辑异或
逻辑异或影响标志位:N, Z
立即数寻址:
【格式1】 Rd ^= IM6 或 Rd = Rd ^ IM6
【功能】 Rd ^ IM6 → Rd
【说明】 指令将Rd的数据与6位立即数进行逻辑异或操作,结果送Rd寄存器。
【格式2】 Rd = Rs ^ IM16
【功能】 Rs ^ IM16 → Rd
【说明】 该指令将Rs的数据与16位立即数进行逻辑异或操作,结果送Rd寄存器。
【举例】 假设开始时的标志位为:N=0,Z=1,S=0,C=1
R1=0x0F00 //R1的初值为0x0F00,Z=0,N=0
R1^=0x0FFF //R1的值变为0x00FF, Z=0,N=0
直接地址寻址:
【格式1】 Rd ^=[A6] 或 Rd = Rd ^ [A6]
【功能】 Rd ^ [A6] → Rd
【说明】 将Rd 和A6指定存储单元中数据进行逻辑异或操作,结果送Rd寄存器
【格式2】 Rd = Rs ^ [A16]
【功能】 Rs ^ [A16] → Rd
【说明】 Rs的数据和A16指定存储单元中的数据进行逻辑异或操作,结果送Rd寄存器。 null寄存器寻址:
【格式】 Rd ^= Rs
【功能】 Rd ^ Rs → Rd
【说明】 将Rd和Rs的数据进行逻辑异或操作,结果送Rd寄存器。
寄存器间接寻址:
【格式1】 Rd ^= [Rs]
【功能】 Rd ^ [Rs]→ Rd
【说明】 将Rd的数据与Rs指定的存储单元中的数据进行逻辑异或操作,结果送Rd寄存器。
【格式2】 Rd ^= [Rs++]
【功能】 Rd ^ [Rs] → Rd,Rs + 1 → Rs
【说明】 将Rd的数据与Rs指定的存储单元中的数据进行逻辑异或操作,结果送Rd寄存器,修改Rs,使Rs加1。
【格式3】 Rd ^= [Rs--]
【功能】 Rd ^ [Rs] → Rd,Rs 1 → Rs
【说明】 将Rd的数据与Rs指定的存储单元中的数据进行逻辑异或操作,结果送Rd寄存器,修改Rs,使Rs减1
【格式4】 Rd ^= [++Rs]
【功能】 Rs + 1→ Rs ,Rd ^ [Rs] → Rd
【说明】 修改Rs,使Rs加1,Rd的数据与Rs指定的存储单元中的数据进行逻辑异或操作,结果送Rd寄存器 null3.4.4 测试(TEST)
测试指令执行指定两个数的逻辑与操作,但不写入寄存器,结果影响N,Z标志。
立即数寻址 :
【格式】 TEST Rd,IM6
【说明】 该指令将Rd与IM6进行逻辑与操作,不存储结果
【格式】 TEST Rd,IM16
【说明】 将Rd与IM16进行逻辑与操作,不存储结果,只影响N,Z标志
直接地址寻址:
【格式1】 TEST Rd, [A6]
【说明】 该指令将Rd与A6指定存储单元中的数据进行逻辑与操作,不存储结果,只影响标志 N,Z
【格式2】 TEST Rd, [A16]
【说明】 该指令将Rd与A16指定存储单元中的数据进行逻辑与操作,不存储 结果,只影响N,Z标志
变址寻址:
【格式】 TEST Rd,[BP+IM6]
【说明】 该指令将Rd与BP+IM6指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N,Z标志。 null寄存器寻址:
【格式】 TEST Rd,Rs
【说明】 该指令将Rd与Rs的数据进行逻辑与操作,不存储结果,只影响N,Z标志位。
寄存器间接寻址:
【格式1】 TEST Rd,[Rs]
【说明】 该指令将Rd与[Rs] 指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N,Z标志位
【格式2】 TEST Rd,[Rs++]
【说明】 该指令将Rd与[Rs] 指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N,Z标志位,并且使Rs值加1。
【格式3】 TEST Rd,[Rs--]
【说明】 该指令将Rd与Rs指定存储单元中的数据进行逻辑与操作,不存储结果,只影响N,Z标志位,并且使Rs值减1。
【格式4】 TEST Rd,[++Rs]
【说明】 该指令首先使Rs值加1,而后Rd与Rs指定存储单元中的数据进行逻辑 与操作,不存储结果,只影响N,Z标志位。 null3.4.5 SPCE061A的移位操作
SPCE061A的移位运算包括逻辑左移、逻辑右移、循环左移、循环右移、算术右移等操作,移位的同时还可进行其他运算,如加、减、比较、取负、与、或、异或、测试等。指令长度1,指令周期3/8,影响N,Z标志。由于硬件原因对于移位操作,每条指令可以移1~4位。
逻辑左移(LSL):
【格式】 Rd = Rs LSL n
【说明】 该指令对Rs进行n(可设为1~4)位逻辑左移,将Rs高n位移入SB寄存器,同时Rs的低n(1~4)位用0补足,结果送Rd寄存器。
【举例】 逻辑左移3位。
存器移位前的状态为:
SB: S3 S2 S1 S0 RS:B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0
存器移位后的状态为:
SB: S0 B15 B14 B13 RD:B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 0 0 0
程序:
R1=0xF00F //R1的初值为0xF00F
R1=R1 LSL 3 //R1左移3位后的值变为0x8078 null 逻辑右移(LSR):
【格式】 Rd = Rs LSR n
【说明】 该指令对Rs进行n(可设为1~4)位逻辑右移,将Rs低n位移入SB寄存器同时Rs的高n(1~4)位用0补足,结果送Rd寄存器。
【举例】 逻辑右移3位。
存器移位前的状态为:
RS: B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 SB: S3 S2 S1 S0
存器移位后的状态为:
RD: 0 0 0 B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 SB: B2 B1 B0 S3
程序:
R1=0xF00F //R1的初值为0xF00F
R1=R1 LSR 3 //R1右移3位后的值变为0x1E01 null循环左移(ROL):
【格式】 Rd = Rs ROL n
【说明】 该指令对Rs进行n(可设为1~4)位循环左移,将Rs的高n位移入S寄存器,同时移动SB寄存器的高n位移入Rs的低n位,结果送Rd寄存器。
【举例】 循环左移1位。
移位前的各位状态如下:
SB: S3 S2 S1 S0 RS: B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0
移位后的各位状态如下:
SB: S2 S1 S0 B15 RS: B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 S3
循环右移(ROR):
【格式】 Rd = Rs ROR n
【说明】 该指令对Rs进行n(可设为1~4)位循环右移,将Rs的低n位移入SB寄存器,同时移动SB寄存器的低n位移入Rs的高n位,结果送Rd寄存器。
【举例】 循环右移3位。
移位前的各位状态为:
RS: B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 SB: S3 S2 S1 S0
移位后的各位状态为:
RD: S2 S1 S0 B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 SB: B2 B1 B0 S3 null算术右移(ASR):
【格式】 Rd = Rs ASR n
【说明】该指令将Rs算术右移n(可设为1~4)位,将Rs的低n位移入SB寄存器,并对最高有效位进行符号扩展,结果送Rd寄存器。该指令适合有符号数的移位操作。
【举例】 算术右移3位。
移位前的各位状态为:
RS: B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 SB: S3 S2 S1 S0
移位后的各位状态为:
RD: E2 E1 E0 B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 SB: B2 B1 B0 S3
其中E2,E1,E0是Rs中最高有效位的符号扩展位。
SPCE061A在进行移位的同时,还可进行其它运算 null3.5 SPCE061A的控制转移类指令
SPCE061A的控制转移类指令主要有中断,中断返回,子程序调用,子程序返回,跳转等指令null判C的转移指令有JB和JNB (a)JB的执行过程 (b)JNB的执行过程null判S跳转指令JGE和JNGE
JGE表示大于等于通过对标志位S的判断来决定程序走向。S为0则产生跳转,若S为1则继续执行下一语句。JNGE表示小于,当S为1时产生跳转,S为0时则继续执行下一语句 (a)JGE的执行过程 (b)JNGE的执行过程 null判C跳转指令JCC和JCS
JCC是以C=0作为判断的标准决定程序的跳转。JCS是以 C=1作为判断的标准决定程序的跳转 (a)JCC的执行过程 (b)JCS的执行过程 null3.6 伪指令
nSP™汇编伪指令与汇编指令不同,它不会被编译,而仅被用来控制汇编器的操作。伪指令的作用有点像语言中的标点符号,它能使语言中的句子所表达意思的结构更加清晰而成为语言中不可缺少的一部分。在汇编语言中正确使用伪指令,不仅能使程序的可读性增强,且使汇编器的编译效率倍增。
伪指令的语法格式及特点
伪指令可以写在程序文件中的任意位置,但在其前面必须用一个小圆点引导,以便与汇编指令区分开。伪指令行中方括弧里的参量是任选项,即不是必须带有的参量。如果某一个参量使用双重方括弧括起来,则说明这个任选项参量本身就必须带着方括弧。例如[[count]]表示引用该任选参量时必须写出[count]才可。
nSP™的汇编器规定的标准伪指令不必区分字母的大小写,亦即
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
写伪指令时既可全用大写,也可全用小写,甚至可以大小写混用。但所有定义的标号包括宏名、结构名、结构变量名、段名及程序名则一律区分其字母的大小写。 null伪指令符号约定
bank 存储器的页单元
ROM 程序存储器
RAM 随机数据存储器
label 程序标号
value 常量数值
IEEE 一种标准的指数格式的实数表达方式
variable 变量名
number 数据的数目
ASCII 数值或符号的ASCII代码
argument# 参量表中的参量序号
filename 文件名
[] 任选项 伪指令一览表null定义类伪指令:
DEFINE
【类 别】定义类
【功能描述】定义常量符号
【语法格式】.DEFINE variable [value][,…]
【应用解释】给常量符号所赋之值既可是一已定义过的常量符号,亦可是一表达式。切忌符号超前引用,即如果赋值引用的符号不是在引用前定义的,则会出现非法超前引用的错误。
PUBLIC
【类 别】定义类
【功能描述】声明将被引用在其它文件中的全局标号
【语法格式】.PUBLIC label[,label][,…]
【应用解释】本伪指令用来在文件中声明将被引用在外部文件中的全局标号。故在外部文件中用伪指令EXTERNAL所声明的标号必须是用PUBLIC伪指令声明过的。类似地,当要声明多个全局标号时,要用逗号(,)将每一标号分开。
EXTERNAL
【类 别】定义类
【功能描述】在某文件中声明已在其它文件里定义过的标号、变量或函数
【语法格式】.EXTERNAL label[,label][,...]
【应用解释】这是在已定义过某些标号、变量或函数的文件之外的文件里,要引用这些标号、变量或函数之前需对其进行声明时所要用到的伪指令。以此避免标号、变量或函数在不同的文件里被引用时容易发生的重复定义错误。如果同时要声明多个这样的外部标号,需用逗号(,)将每一个标号分开。本伪指令后禁止将两个或多个标号进行算术或逻辑操作。 nullRAM
【类 别】定义类
【功能描述】切换定义预定义段RAM
【语法格式】.RAM
【应用解释】RAM段用来存放无初始值的变量。RAM段不能跨bank链接,且在链接时所有与其同名或同属性的各段都会被合并在一起而被定位在RAM中.。(参见后面「段的定义与使用」内容)。
SRAM
【类 别】定义类
【功能描述】切换定义预定义段SRAM
【语法格式】.SRAM
【应用解释】SRAM段的性质基本与RAM段相同。区别在于链接时它只能在RAM中占有前面64(0~63)个字的数据单元(参见后面「段的定义与使用」内容)。
IRAM
【类 别】定义类
【功能描述】切换定义预定义段IRAM
【语法格式】.IRAM
【应用解释】IRAM段用来存放具有初始值的变量。此段亦不可跨bank链接,且在链接时所有与其同名或同属性的各段都会被合并在一起,将会同时被分配空间于ROM及RAM中(参见后面「段的定义与使用」内容)。 nullISRAM
【类 别】定义类
【功能描述】切换定义预定义段ISRAM
【语法格式】.ISRAM
【应用解释】ISRAM段与IRAM段的性质基本相同。区别是ISRAM段在RAM中只能被分配在前面64(0~63)个字的数据单元
ORAM
【类 别】定义类
【功能描述】切换定义预定义段ORAM
【语法格式】.ORAM
【应用解释】ORAM段用来存放无初始值的变量。ORAM段也不能跨bank链接,且在链接时同一目标文件中所有与其同名或同属性的各段都会被合并在一起而被定位在RAM中。但在一个项目里的不同目标文件中所有与ORAM段同名或同属性的各段会被重叠在一起。当编程者需要在不同的文件里使用相同的变量空间时,适合用本伪指令
OSRAM
【类 别】定义类
【功能描述】切换定义预定义段OSRAM
【语法格式】.OSRAM
【应用解释】OSRAM段与ORAM段的性质基本相同。区别在于链接时OSRAM段只能在RAM中被分配在前面64(0~63)个字的数据单元nullVAR
【类 别】定义类
【功能描述】定义变量并为变量置初始值
【语法格式】.VAR variable[=value]
【应用解释】在程序的任何部位都可用本伪指令定义变量并为变量置初始值。若定义多个具有初始值的变量,需用逗号(,)将每一个变量赋值分开(若要为变量赋初始值,则必须声明在IRAM或ISRAM段中,若在其它段中申明将无效,它将被初始化为0;同样要申请具有初值的单元也必须在IRAM或在ISRAM中申请,若在其它段中申请也将无效,它将被初始化为0)。
DATA
【类 别】定义类
【功能描述】切换定义预定义段DATA
【语法格式】.DATA
【应用解释】程序中所有数据都可以存放在DATA段的位置上。DATA段可以跨bank链接。链接时,不同文件中所有与其同名或同属性的各段会被分开置入ROM地址中,而同一文件中所有与DATA同名或同属性的各段会被合并在一起置入ROM地址中。
nullCODE
【类 别】定义类
【功能描述】切换定义预定义段CODE
【语法格式】.CODE
【应用解释】所有程序指令和数据都可以存放在CODE段下。汇编器对程序指令进行汇编时,遇到各类预定义段会采取相应的方式进行处理。换言之,预定义段的段名是汇编器进行汇编操作的一种地址分类标签。CODE段不能跨bank链接。不同文件中所有与其同名的预定义段或同属性的用户定义段会被分开地定位在ROM地址中,而同一文件中所有与CODE同名或同属性的各段则会被合并在一起置入在ROM地址中。
TEXT
【类 别】定义类
【功能描述】切换定义预定义段TEXT
【语法格式】.TEXT
【应用解释】TEXT段与CODE段的性质基本相同。唯一的区别是它只能被链接到第一个单元即零页ROM中,且所有与其同名或同属性的各段均会被合并在一起而被定位到此。该段主要用来写中断程序代码
PROC
【类 别】 定义类
【功能描述】 开始程序的定义
【语法格式】 label: .PROC
【应用解释】 本伪指令用于起始程序的定义,应与结束程序定义的伪指令ENDP成对使用nullENDP
【类 别】定义类
【功能描述】结束程序的定义
【语法格式】ENDP
【应用解释】程序定义的起始要用伪指令PROC,终止则用本伪指令。两条伪指令应成对使用(参见后面「过程的定义与调用」内容)。
STRUCT
【类 别】定义类
【功能描述】起始结构的定义
【语法格式】label: .STRUCT
【应用解释】本伪指令用于起始结构的定义,应与结束结构定义的伪指令ENDS成对使用
ENDS
【类 别】定义类
【功能描述】结束结构的定义
【语法格式】.ENDS
【应用解释】本伪指令用来终止结构的定义。起始结构的定义是由伪指令STRUCT给出的。二者须成对使用 nullMACRO
【类 别】定义类
【功能描述】起始宏的定义
【语法格式】label: .MACRO args
【应用解释】本伪指令用来起始宏定义。结束宏定义则用ENDM伪指令,二者应成对使用
ENDM
【类 别】定义类
【功能描述】结束宏的定义
【语法格式】.ENDM
【应用解释】本伪指令用来结束宏定义。它应与起始宏定义的伪指令MACRO成对使用
MACEXIT
【类 别】定义类
【功能描述】退出宏定义
【语法格式】.MACEXIT
【应用解释】从宏定义里退出是立即且无条件的。本伪指令并非用来终止宏定义。它常与条件汇编用在一起,意指条件满足时从宏定义里退出,对ENDM伪指令后面的指令进行汇编;条件不满足时,继续汇编MACEXIT伪指令后的宏定义内的其它指令。不必担心从宏里退出时条件会失衡,因为MACEXIT伪指令会自动将条件恢复到原来的均衡状态。 nullEQU
【类 别】定义类
【功能描述】为标号赋值
【语法格式】label: .EQU value
【应用解释】给标号所赋之值可为在此标号之前已定义过的某一符号常量或为一表达式。同样要注意符号不能超前引用。所有通过EQU定义的标号及值将会输出至 Linker 的符号文件。
VDEF
【类 别】定义类
【功能描述】为标号赋值
【语法格式】lable: .VDEF value
【应用解释】可以在程序的任何部位用本伪指令为标号重复赋值。
DW
【类 别】存储类
【功能描述】以16位整型数据的形式来存储常量或变量
【语法格式】[label:] .DW [value][,value][,...]
【应用解释】本伪指令是把一系列16位整型常量或变量值存入连续的整型数据单元中。整型常量或变量值可以是多种类型的操作数。需用逗号(,)将多个数值分开;特别地,若定义的数值较多,需多行书写时,在一行当中最后一个数值输毕,用回车键结束此行输入之前切莫丢掉逗号。若存储的常量中含有ASCII 字符串,则必须用引号( )将其括起来。如果.DW后面未输入任何数值,则会自动存入一个整型零常量。 nullDD
【类 别】存储类
【功能描述】以32位长整型数据的形式存储双字常量或变量
【语法格式】label:.DD [value][,value][,…]
【应用解释】申请若干连续的32位长整型数据单元来存放双字常量或变量序列。常量(变量值)与常量(或变量值)之间应当用逗号(,)隔开。存放的常量可以任何一种数制格式输入,但最终由汇编器将其转换成十六进制格式存放。
DOUBLE
【类 别】存储类
【功能描述】以双精度浮点型实数数据的形式存储实数常量或变量
【语法格式】label:.DOUBLE value[,value][,…]
【应用解释】把实数常量或变量的值转换成以IEEE格式表示的双精度浮点型数据并存储。存储多个这类常量或变量的值时需用逗号(,)将其分开。以本伪指令存储的常量必须是实数。
FLOAT
【类 别】存储类
【功能描述】以单精度浮点型实数数据单元来存储实数常量或变量
【语法格式】label: .FLOAT value[,value][,...]
【应用解释】本伪指令用来把实数常量或变量值转换成以IEEE格式表示的单精度浮点型数据并存储。当要存储多个这类常量或变量值时需用逗号(,)将其分开。所谓单精度浮点型实数是指数的精度保证6位有效位。若超过6位,则对第七位进行入舍处理后,其后所有位均会被舍去。 nullEND
【类 别】存储类
【功能描述】用来结束程序文件或结束包含文件
【语法格式】.END
【应用解释】本伪指令用在程序文件中意味该文件结束(不可再包含其它文件)
DUP
【类 别】存储定义类
【功能描述】本伪指令与DW、FLOAT、DD、DOUBLE存储类伪指令组合在一起用于存放若干个具有相同数值的常量;或者申请若干个备用的整型、单精度浮点型、长整型以及双精度浮点型数据单元。
【语法格式1】[label:] .DW number DUP(value)
【说 明1】存储若干具有相同数值的16位的整型数据。
【语法格式2】[label:] .FLOAT number DUP(value)
【说 明2】存储若干具有相同数值的32位的单精度浮点型实数数据。
【语法格式3】[label:] .DD number DUP(value)
【说 明3】存储若干具有相同数值的32位的长整型数据。
【语法格式4】[label:] .DOUBLE number DUP(value) nullIF
【类 别】条件类
【功能描述】引出在条件汇编结果为真时所要汇编的程序指令
【语法格式】.IF value
【应用解释】所谓条件汇编结果为真是指参量value的值不为零。value既可为在此之前已定义过的某一符号常量或一字符串常量,亦可为一算术表达式。
ELSE
【类 别】条件类
【功能描述】引出IF伪指令设置的条件汇编结果为假时所要汇编的程序指令。
【语法格式】.ELSE
【应用解释】 若本伪指令前面的IF伪指令设置的条件汇编结果为假时引出另一部分汇编程序指令。本伪指令必须与IF伪指令结合使用。
ENDIF
【类 别】条件类
【功能描述】用来结束条件汇编组合的定义
【语法格式】.ENDIF
【应用解释】本伪指令用来结束条件汇编组合定义。它必须与IF伪指令成对使用,否则会产生条件不匹配的错误。
IFDEF
【类 别】条件类
【功能描述】引出若某变量已被赋过值时所要汇编的程序指令
【语法格式】.IFDEF variable
【应用解释】根据本伪指令后面的变量名,汇编器会搜索符号表。若搜索到说明该变量已被赋过值,则会对本伪指令下面的程序指令进行汇编;否则会跳过该段程序指令而直接对ELSE或ENDIF伪指令后面的程序指令进行汇编。 nullIFNDEF
【类 别】条件类
【功能描述】引出某变量还未被赋值时所要汇编的程序指令
【语法格式】.IFNDEF variable
【应用解释】根据本伪指令后面的变量名,汇编器首先搜索符号表。若在符号表中未查到有该变量名存在,则会对本伪指令下面的汇编指令进行汇编;否则,便会对ELSE或ENDIF伪指令后面的汇编语句进行汇编。显然,本伪指令与IFDEF伪指令的作用相反。
IFMA
【类 别】条件类
【功能描述】引出若指定的宏参量存在时所要汇编的程序指令
【语法格式】.IFMA argument#
【应用解释】本伪指令必须用在宏内。参量argument#是指宏定义参量表中的参量序号。汇编器据此序号查找宏调用行上的参量值表,如果在该表内与序号对应的参量值存在,就对本伪指令下面的汇编指令进行汇编;否则便会对ELSE 或ENDIF伪指令后的汇编指令进行汇编。特例情况是当argument#为零,则汇编器只有在宏调用里不含有参量值时认为条件为真而进行相应的操作。
nullINCLUDE
【类 别】汇编方式类
【功能描述】在汇编文件里包含某个文件
【语法格式】.INCLUDE filename
【应用解释】本伪指令用来通知汇编器把指定的文件包含在文件中一起进行汇编。其中参量filename包括文件的扩展名,且可指明搜索文件所需的路径。注意,每一条INCLUDE伪指令只能包含一个文件。已包含某些文件的文件可再被包含在其它文件中。
SECTION
【类 别】汇编方式类
【功能描述】创建用户定义段
【语法格式】label: .SECTION .attribute
【应用解释】除了上面提到的一些预定义段用于存放指令代码或数据以外,编程者还可以根据需要用本伪指令定义某些段。其中属性参量attribute可以是以下预定义段名当中的任意一个:CODE,DATA,TEXT,RAM,SRAM,IRAM,ISRAM,ORAM,OSRAM null3.6.4 宏定义与调用
宏定义 :
所谓宏(Macro)是指在源程序里将一序列的源指令行用一个简单的宏名(Macro Name)所取代。这样做的好处是使程序的可读性增强。
宏在使用之前一定要先经过定义。可分别用伪指令.MACRO和.ENDM来起始和结束宏定义;定义的宏名将被存入标号域。在汇编器首次编译通过汇编指令时,先将宏定义存储起来,待指令中遇有被调用的宏名则会用同名宏定义里的序列源指令行取代此宏名。宏定义里可以包括宏参数,这些参数可被代入除注释域之外的任何域内。虚参数不能含有空格。
宏标号:
宏定义里可以用显式标号(由用户定义),亦可用隐含标号(由汇