指令系统.docx
《指令系统.docx》由会员分享,可在线阅读,更多相关《指令系统.docx(21页珍藏版)》请在冰豆网上搜索。
指令系统
指令系统
•寻址方式
•指令概述(分类、符号、指令格式)
•C24xDSP汇编指令
•简单程序举例
三种基本寻址方式:
立即寻址、直接寻址、间接寻址
C24XDSP寻址方式:
立即寻址
指令中包含一个立即数。
立即数可分为短立即数(8,9,13位)和短立即数(16位)
例子:
RPT#k;下面的指令重复执行k+1次,#k为8位
LDP#k;DP=k,#k为9位
MPY#k;P=T*k,#k为13位
ADD#lk,shift;ACC=ACC+lk左移shift次#lk为16位
LACC#10h;ACC=#10H,“#”号表示立即数
(LACC10h;直接寻址,当前DP的第10h单元数据送累加器ACC中)
寻址方式:
直接寻址
数据存储器(DM:
DataMemory)直接地址由高9位DP(DataPagePointer数据页面指针)和低7位地址共同组成。
数据页面指针DP的范围:
0-511页,dma=0-127
即DP指向512页中的一页,dma表示该页128单元之一。
512*128W=64KW
机器码格式:
D15-8为操作码,D7=0,
D6-0页内地址(dma)
例.LDP#4;DP=#4=000000100,
ADD9h;ACC=ACC+(209h),9=0001001
高9位DP低7位dma:
0000001000001001=209h
寻址方式:
间接寻址
间接寻址:
数据存储单元可以通过当前辅助寄存器内容所代表的16位地址进行访问。
8个16位辅助寄存器AR0-AR7
当前辅助寄存器由ARP(ST0:
D15-13=000-111)指定
例MAR*,AR1;选择AR1为当前辅助寄存器,ARP=1
LARAR1,#208h;AR1=#208h
ADD*,8;ACC=ACC+(208h)*28间接寻址
间接寻址类型:
*地址不变
*+AR=AR+1当前AR中的地址加1
*-AR=AR-1
*0+AR=AR+AR0
*0-AR=AR-AR0
*BR0+AR=B(AR+AR0)地址反向进位加,用于FFT
*BR0-AR=B(AR-AR0)
下一个辅助寄存器:
许多指令除了可以修改当前辅助寄存器的数值外,还可以指定下一个辅助寄存器,作为下一条指令的当前辅助寄存器。
例.MAR*,AR1;AR1为当前AR,即ARP=1
LT*+,AR2;T=(AR1),AR1=AR1+1,ARP=2
MPY*;P=T*(AR2)=(AR1)*(AR2)
间接寻址举例
ADD*,8
ADD*+,8,AR4
ADD*-,8
ADD*0+,8
ADD*0-,8
ADD*BR0+,8
ADD*BR0-,8
指令概述
C24X指令分类表:
86条
传送指令,算术操作,逻辑运算指令,分支转移指令
1)累加器、算术和逻辑操作指令,26条
2)辅助寄存器和DP操作指令,7条
3)T寄存器、P寄存器和乘操作指令,20条
4)跳转指令,12条
5)控制指令,13条
6)I/O及数据存储器操作指令,8条
7)
汇编指令格式:
[标号]指令(操作码)[操作数][;注释]
1、累加器、算术、逻辑指令
2、辅助寄存器指令
3、T,P寄存器与乘法指令
4、分支转移指令
5、控制指令
6、I/O即存储器指令
指令中常用符号表
AR:
辅助寄存器ACC:
累加器
dma:
DM地址低7位DP:
9位数据页面指针
ind:
间接寻址方式#:
立即数
shift:
左移位数0-15PA:
16位口地址
shift2:
左移位数0-7pma:
16位程序地址
ARn:
指定的辅助寄存器cond:
条件指令的条件
():
存储单元内容[]:
可选项
汇编语言指令举例:
加法指令
例如,加法指令:
ADDdma[,shift];直接寻址
ADDdma,16;左移16位直接寻址
ADDind[,shift[,ARn]];间接寻址
ADDind,16[,ARn];左移16位间接寻址
ADD#k;短立即寻址
ADD#lk[,shift];长立即寻址
例.指令ADD*+,0,AR0
功能:
ACC=ACC+(AR),ARP=0
执行前
ARP=4
AR4=302H
DM:
(302H)=2
ACC=2
C=X
执行后
ARP=0
AR4=303H
DM:
(302H)=2
ACC=4
C=0
汇编语言指令
(1)
(1)ABS累加器取绝对值
(2)ADD累加器加
(3)ADDC带进位累加器加
(4)ADDS抑制符号扩展的累加器加
(5)ADDT:
T寄存器指定移位次数的累加器加
(6)ADRK辅助寄存器加短立即数
(7)AND和累加器进行与操作
(8)APAC:
P加到ACC
(9)B无条件跳转
(10)BACC跳转到ACCL确定的地址
(11)BANZ辅助寄存器非0跳转
语法:
BANZpma[,ind[,ARn]]
例BANZPGM191,*-,AR0
汇编语言编程例1
将数据存储器60H-69H单元内容求和。
MAR*,AR0;设AR0为当前AR
LARAR1,#09H;10个单元,计数器
LARAR0,#60H;初始单元AR0=#60H,地址指针
LACC#0;和初值ACC=0
PGM191:
ADD*+,AR1;累加,AR0+1,下一当前AR为AR1
BANZPGM191,AR0;AR1≠0则循环,且AR1=AR1-1
;下一当前AR为AR0
;ACC=0+(60H)+(61H)+…+(69H)
汇编语言指令
(2)
(12)BCND无条件跳转
(13)BIT位测试
(14)BITT:
T寄存器指定测试
(15)BLDD数据块移动
(16)BLPD程序区到数据区的块移动
(17)CALA:
调用ACC指定的子程序
(18)CALL:
无条件调用子程序
(19)CC条件调用
(20)CLRC控制位清0
(21)CMPL:
ACC取反
(22)CMPR辅助寄存器AR与AR0比较
(23)DMOV数据移动
(24)IDLE等待中断
(25)IN从端口读入数据
BITT指令:
T寄存器指定位测试
语法:
1)BITTdma
2)BITTind[,ARn]
功能:
将DM单元中指定的位复制到状态寄存器ST1的TC位。
指定的位对应于15-T(3:
0)。
例BITT00H;(DP=6)
执行后
DM:
(300H)=4DC8H0100DC8
T=1D(15-1)=D14=1
TC=1
执行前
DM:
(300H)=4DC8H
T=1
TC=0
BLDD指令:
数据块移动
语法:
1)BLDD#lk,dma
2)BLDD#lk,ind[,ARn]
3)BLDDdma,#lk
4)BLDDind,#lk[,Arn]
说明:
该指令实现DM到DM的块移动,第一个数指定源地址,第二个数指定目的地址。
一旦启动了流水线,它就成为单周期指令。
例子BLDD#300h,20h;(DP=6)
执行前:
DM:
(300h)=0h(320h)=0fh
执行后:
DM:
(300h)=0h(320h)=0h
汇编语言指令(3)
(26)INTR软件中断
(27)LACC带移位的ACC装载
(28)LACL装载ACCL,ACCH=0
(29)LACT由T指定移位次数的ACC装载
(30)LAR:
LoadAR装载辅助寄存器
(31)LDP:
LoadDP装载DP
(32)LPH:
LoadPH
(33)LST:
LoadST
(34)LT:
LoadT
(35)LTA:
LoadTandAdd
(36)LTD装载T寄存器、累加前次乘积并移动
(37)LTP装载T寄存器并将P送到ACC
(38)LTS:
LoadTandSubtract
(39)MAC:
乘累加
MAC指令:
乘累加
语法1)MACpma,dma
2)MACpma,ind[,ARn]
功能:
ACC=ACC+P,T=(DM),P=(PM)*(DM)=(PM)*T
例MAC0FF00H,08;(DP=6,PM=00)
执行后
DM:
(308h)=23h
PM:
(FF00H)=4
T=23h
P=8CH
ACC=76975b3h
执行前
DM:
(308h)=23h
PM:
(FF00H)=4
T=45h
P=458972h
ACC=723EC41h
MACD指令:
乘累加并移动数据
语法1)MACDpma,dma
2)MACDpma,ind[,ARn]
例MACD0FF00H,08;(DP=6,PM=00)
功能:
ACC=ACC+P,T=(DM),P=(PM)*(DM),(DM+1)=(DM)
执行前执行后
DM:
(308h)=23hDM:
(308h)=23h
DM:
(309h)=18hDM:
(309h)=23h
PM:
(FF00H)=4PM:
(FF00H)=4
T=45hT=23h
P=458972hP=8CH
ACC=723EC41hACC=76975b3h
汇编语言指令(4)
(40)MACD乘累加并移动数据
(41)MAR:
ModifyAR修改辅助寄存器
(42)MPY:
Multiply乘
(43)MPYA:
乘且累加前次积
(44)MPYS:
乘且减去前次积
(45)MPYU:
无符号乘
(46)NEG:
ACC取补码
(47)NMI:
NonMaskableInterrupt非屏蔽中断
(48)NOP:
NoOperation空操作
(49)NORM:
ACC规格化
(50)OR:
与ACC或运算
(51)OUT:
输出数据到端口
(52)PAC:
P送到ACC
(53)POP栈定内容弹出到ACCL
汇编语言指令(5)
(54)POPD:
POPtoDatamemory栈定内容弹出到数据存储器单元
(55)PSHD:
数据存储器单元压入堆栈
(56)PUSH:
ACCL压入堆栈
(57)RET:
子程序返回
(58)RETC:
条件返回
(59)ROL:
A循环左移
(60)ROR:
A循环右移
(61)RPT:
重复执行下一条指令
(62)SACH:
StoreACCH
(63)SACL:
StoreACCL
(64)SAR:
StoreAR
(65)SBRK:
AR减去短立即数
PSHD指令:
数据存储器单元压入堆栈
语法:
1)PSHDdma
2)PSHDind[,ARn]
说明:
堆栈依次向下移动一级,指定存储器单元的内容复制到栈顶。
堆栈底部的值丢失。
例子PSHD*,AR1
执行后
ARP=1
AR0=1FFH
DM:
(1FFH)=12H
硬件堆栈
12h
2h
33h
78h
99h
42h
50h
0h
执行前
ARP=0
AR0=1FFH
DM:
(1FFH)=12H
硬件堆栈
2h
33h
78h
99h
42h
50h
0h
0h
POPD指令:
栈定内容弹出到存储器单元
语法:
1)POPDdma
2)POPDind[,ARn]
说明:
栈顶的内容复制到DM单元中。
堆栈值依次向上复制一级。
例子POPD20h;(DP=6)
执行前
DM:
(320H)=45H
硬件堆栈
16h
7h
33h
42h
56h
37h
61h
61h
执行前
DM:
(320H)=82H
硬件堆栈
45h
16h
7h
33h
42h
56h
37h
61h
汇编语言指令(6)
(66)SETC控制位置位
(67)SFL:
A左移
(68)SFR:
A右移
(69)SPAC:
A减P
(70)SPH:
StorePH
(71)SPL:
StorePL
(72)SPLK:
长立即数送到DM单元
(73)SPM:
设置移位模式PM
(74)SQRA:
乘方并累加前一次乘积
(75)SQRS:
乘方并减去前一次乘积
(76)SST:
StoreST
(77)SUB:
ACC减
(78)SUBB:
带借位的:
ACC减
(79)SUBC条件减
SPLK指令:
长立即数送到DM单元
语法:
1)SPLK#lk,dma
2)SPLK#lk,ind[,ARn]
例子SPLK#1111H,*+,AR4
执行后
ARP=4
AR0=301H
DM:
(300H)=1111H
执行前
ARP=0
AR0=300H
DM:
(300H)=07H
条件减指令用于除法运算
语法格式:
SUBCdma
SUBCind[,ARn]
移位相减实现除法:
ACCL/(DM)=ACCL余数ACCH
例.RPT#15
SUBC*;执行情况16次
A执行后
ARP=3
AR3=1000H
DM:
(1000H)=7
ACCH=2,ACCL=0009H
A执行前
ARP=3
AR3=1000H
DM:
(1000H)=7
ACCH=0,ACCL=41H
65/7=9余数2
汇编语言指令(7)
(80)SUBS:
抑制符号扩展的累加器减
(81)SUBT:
T确定移位的累加器减
(82)TBLR:
TableRead表读1)TBLRdma;2)TBLRind[,ARN]说明:
将PM单元中的内容复制到指定的DM单元。
(83)TBLW:
TableWrite表写
(84)TRAP软件中断
(85)XOR与累加器进行异或操作
(86)ZALR:
ACCL=0,ACCH=8000H累加器低位字清0,高位字带舍入装载
汇编语言编程例2
查表程序
0≤x≤9,求y=x1/5,x=0,1,2,…,9,y值用Q14格式。
设x值在402H单元,查表y值送404H单元
LDP#8
LACC2;(402H)→ACCx
ADD#TAB;表首地址#TAB
TBLR4;ACC→(404H)y
思考题与习题
1.C24xDSP有哪些寻址方式?
2.直接寻址方式中,数据存储单元的地址是如何形成的?
3.间接寻址方式中,数据存储单元的地址是如何形成的?
间接寻址方式有哪些类型?
4.C24xDSP有哪几种类型的指令?
5.编程将数据存储器300H-30AH单元内容求和。
6.试编写一简单查表程序。