DSP原理与应用 第4章 TMS320C55x的指令系统 刘忠国:liuzhg@sdu.edu.cn 电话:18764171197 ; 微信: jnliuzg 山东大学生物医学工程
任课教师:刘忠国 网站: http://course.sdu.edu.cn/G2S/dsp.cc http://www.ti.com TMS320C55x DSP Mnemonic Instruction Set Reference Guide (SPRU374G, 2002年) TMS320C55x DSP CPU Reference Guide (SPRU371F, 2004年)
内容提要: 本章介绍TMS320C55x芯片的指令系统。 寻址方式 绝对寻址方式、直接寻址方式、间接寻址方式 TMS320C55x的指令系统 算术运算指令、位操作指令、 扩展辅助寄存器操作指令、 逻辑运算指令、移动指令和程序控制指令
4.1 寻址方式 C55x通过以下三种寻址方式访问数据空间、存 储器映射寄存器、寄存器位和I/O空间: 绝对寻址方式 通过在指令中指定一个常数地址完成寻址 直接寻址方式 使用地址偏移量寻址 间接寻址方式 使用指针完成寻址
表4-1 指令中用到的语法元素 语法元素 含 义 Smem 来自数据空间、I/O空间或存储器映射寄存器的16位数据 Lmem 表4-1 指令中用到的语法元素 语法元素 含 义 Smem 来自数据空间、I/O空间或存储器映射寄存器的16位数据 Lmem 来自数据空间或存储器映射寄存器的32位数据 Xmem和Ymem 同时来自数据空间的两个16位数据 Cmem 来自内部数据空间的16位数据 Baddr 累加器AC0~AC3、辅助寄存器AR0~AR7、暂存器T0~T3的位域,对位域的置1、清0、测试、求补等位运算用到该语法元素
4.1.1 绝对寻址方式 表4-2 绝对寻址方式 绝对寻址方式 含 义 k16绝对寻址方式 表4-2 绝对寻址方式 绝对寻址方式 含 义 k16绝对寻址方式 该寻址方式使用7位的DPH和16位的无符号立即数组成一个23位的数据空间地址,可用于访问存储器空间和存储器映射寄存器 k23绝对寻址方式 该寻址方式使用23位的无符号立即数作为数据空间地址,可用于访问存储器空间和存储器映射寄存器 I/O绝对寻址方式 该寻址方式使用16位无符号立即数作为I/O空间地址,可用于寻址I/O空间
1. k16绝对寻址方式 格式 *abs16(#k16) 其中:k16是一个16位无符号常数。 要点 采用这种寻址方式的指令不能与其它指令并行执行。
DPH k16 数据空间 000 0000 . 0000 0000 0000 0000 1111 1111 1111 1111 主数据页0: 00 0000h~00 FFFFh 000 0001 主数据页1: 01 0000h~01 FFFFh 000 0010 主数据页2: 02 0000h~02 FFFFh . . 111 1111 主数据页127: 7F 0000h~7F FFFFh 图4-1 k16绝对寻址方式
(见112页) 4.1.4(-7)节中各例题提到对应寻址方式来介绍。 例4-1,*abs16(#k16) 用于数据存储器寻址。设DPH=03h。 (1) MOV *abs16(#2002h), T2 ;#k16=2002h, CPU从03 2002h处读取数据装入T2 例4-8: *abs16(#k16)用于MMR寻址, DPH必须为00h。 (见114页) (4.1.5 存储器映射寄存器的寻址) MOV *abs16(#AR2), T2 ;DPH:k16=00 0012h (AR2的地址为00 0012h) ;CPU从00 0012h处读取数据装入T2
2. k23绝对寻址方试 格式 *(#k23) 其中:k23是一个无符号的23位常数。 要点 不能与其它指令并行执行; 不能用于重复指令中。
k23 数据空间 000 0000 0000 0000 0000 0000 . 000 0000 1111 1111 1111 1111 主数据页0: 00 0000h~00 FFFFh 000 0001 0000 0000 0000 0000 000 0001 1111 1111 1111 1111 主数据页1: 01 0000h~01 FFFFh 000 0010 0000 0000 0000 0000 000 0010 1111 1111 1111 1111 主数据页2: 02 0000h~02 FFFFh . . 111 1111 0000 0000 0000 0000 111 1111 1111 1111 1111 1111 主数据页127: 7F 0000h~7F FFFFh 图4-2 k23绝对寻址方式
例4-2,*(#k23) 用于数据存储器寻址。 (1) MOV *(#032002h),T2 ;k23=03 2002h,CPU从03 2002h处读取数据装入T2 例4-9,* (#k23) 用于MMR寻址。 (见114页) (4.1.5 存储器映射寄存器的寻址) MOV * (#AR2), T2 ; AR2的地址为00 0012h ;CPU从00 0012h处读取数据装入T2
3. I/O绝对寻址方式 操作数格式 port(#k16) 其中,k16是一个16位无符号立即数 图4-3 I/O绝对寻址方式
例4-14,port(#k16) 用于对I/O空间的寻址。 (1) MOV port(#2), AR2 ;CPU从I/O 地址0002h读取数据进AR2 (2) MOV AR2, port(#0F000h) ;CPU把AR2的数据输出到I/O 地址0F000h
4.1.2 直接寻址方式 表4-2 直接寻址方式 寻址方式 描 述 DP直接寻址 表4-2 直接寻址方式 数据页 寄存器 数据堆栈 寄存器 寻址方式 描 述 DP直接寻址 该方式用DPH与DP合并的扩展数据页指针寻址数据空间和存储器映射寄存器 SP直接寻址 该方式用SPH与SP合并的扩展堆栈指针寻址存储空间中堆栈 寄存器位直接寻址 该模式用偏移地址指定一个位地址,用于寻址寄存器中的一个或相邻的两个位 PDP直接寻址 该模式使用PDP和一个偏移地址寻址I/O空间
DP直接寻址方式和SP直接寻址方式相互排 斥, 在程序的任一位置只能有一种方式存在。 通过设置ST1_55的CPL位选择。 寄存器位直接寻址方式和PDP直接寻址方式不受CPL位的影响 CPL 寻址模式的选择 DP直接寻址模式 1 SP直接寻址模式
1. DP直接寻址方式 23位地址的形成: 高7位由DPH寄存器提供; 低16位由下面两个值的和组成: 7位偏移地址(Doffset): 计算方法因访问数据空间还是存储器映射寄存器而有所不同。 用限定符mmap()表示 → mmap(@AC0L), 合法的直接寻址写法@#123, @123, @#foo, @foo, @#(foo+2), @(foo+2)
DPH DP+Doffset 数据空间 000 0000 0000 0000 0000 0000 1111 1111 1111 1111 主数据页0: 00 0000h~00 FFFFh 000 0001 主数据页1: 01 0000h~01 FFFFh 000 0010 主数据页2: 02 0000h~02 FFFFh 111 1111 主数据页127: 7F 0000h~7F FFFFh 图4-4 DP直接寻址方式
Doffset=(Daddr- .dp)& 7Fh CPU连接DPH和DP成为一个扩展数据页指针XDP; 可以使用两条指令独立地装入DPH和DP; 也可以使用一条指令装入XDP; 计算偏移地址的方法: 访问空间 偏移地址(Doffset)的计算 描 述 数据空间 Doffset=(Daddr- .dp)& 7Fh Daddr是一个16 位的局部地址, .dp指DP的值, “&” 表示与操作 存储器映射寄存器 Doffset=Daddr & 7Fh Daddr是一个16 位的局部地址, “&” 表示与操作, 需要使用mmap()指令 @123, @foo, @(foo+2); mmap(@AC0L)
例4-3: @Daddr用于数据存储器寻址。 设DPH=03h, DP=0000h。 (1) MOV @0005h,T2 ;DPH: (DP+Doffset)=03: (0000h+0005h)=03 0005h ;CPU从03 0005h处读取数据装入T2 例4-10,@Daddr用于MMR寻址.DPH=DP=00h, CPL=0。 MOV mmap(@AC0L), AR2 ;DPH:(DP+Doffset)= 00:(0000h+0008h)=00 0008h ;CPU从00 0008h处读取数据装入AR2
2. SP直接寻址方式 23位地址的形成: 高7位由SPH提供; 低16位为SP和一个7 位的偏移地址(offset)的和; 0~127 SPH和SP合并后形成扩展数据堆栈指针(XSP); 可以单独向SPH和SP赋值, 也可以使用一条指令向XSP赋值。 0~127 ☼主数据页0中的堆栈只能用00 0060h~00 FFFFh中的空间。因为00 0000h~00 005Fh是保留给存储映射寄存器用的。
SPH SP+offset 数据空间 000 0000 . 0000 0000 0000 0000 1111 1111 1111 1111 主数据页 0: 0000h~00 FFFFh 000 0001 主数据页 1: 01 0000h~01 FFFFh 000 0010 主数据页2: 02 0000h~02 FFFFh . . 111 1111 主数据页127: 7F 0000h~7F FFFFh 图4-5 SP直接寻址方式
SP直接寻址方式 例4-4 *SP(offset)用于数据存储器寻址, 设 SPH=0, SP=FF00h。 (1) MOV * SP(5),T2 ; SPH: (SP+offset)=00:FF05h ; CPU从00 FF05h处读取数据装入T2
3. 寄存器位直接寻址方式 操作数中偏移@bitoffset是相对于寄存器最低位来说的; 仅有寄存器位测试/设置/清零/求补等指令支持这种寻址方式; 仅能访问下列寄存器的各位: AC0~AC3,AR0~AR7, T0~T3。
3. 寄存器位直接寻址方式 例4-12 @bitoffset用于对寄存器位的寻址。 (见114页) (4.1.6 寄存器位的寻址) (1) BSET @0, AC3 ; ;CPU将AC3的位0置为1 (2) BTSTP @30, AC3; 把AC3的位30和位31分别复制到状态寄存器ST0_55的位TC1和TC2 再如: BCLR @3, AC2 ;CPU将AC2的位3清0
4. PDP直接寻址方式 9位的外设数据页寄存器(PDP) 选取512个外设数据页(0~511)中的一页, 每页有128个字(0~127), 即指令中指定的一 个7 位的偏移(Poffset)。 使用时必须用port( )限定词; 指定要访问的是I/O空间, 而非数据存储单元; port()限定词的括号内是要读或写的操作数 (的偏移地址)。 如 port(@127)
PDP Poffset I/O space(64k) 0000 0000 0 . 000 0000 111 1111 外设数据页 0: 0000h~007Fh 0000 0000 1 外设数据页 1: 0080h~00FFh 0000 0001 0 0000 0000 外设数据页 2: 0100h~017Fh 1111 1111 1 外设数据页511: FF80h~FFFFh 图4-7 PDP直接寻址方式
例4-15, @Poffset对I/O空间的寻址, 设PDP=511。 → 1111 1111 1 F F 1 (1) MOV port(@0),T2 ;PDP:Poffset=FF80h, ;CPU从FF80h读取数据进T2 (2) MOV T2, port(@127) ;PDP:Poffset=FFFFh, ;CPU把T2的数据输出到I/O地址0FFFFh → 000 0000 → 111 1111
4.1.3 间接寻址方式 表4-3 间接寻址方式 寻址方式 描 述 AR间接寻址 使用AR0~AR7中的任一个寄存器访问数据。 表4-3 间接寻址方式 寻址方式 描 述 AR间接寻址 使用AR0~AR7中的任一个寄存器访问数据。 双AR间接寻址 与单AR间接寻址相似, 只是借助两个辅助寄存器, 可同时访问两个或更多数据 CDP间接寻址 使用系数数据指针(CDP)访问数据。 (片内外存储器, 寄存器(位), I/O空间) 系数间接寻址 与CDP间接寻址方式相似, 它可以在访问数据空间某区块的数据的同时, 借助双AR间接寻址访问其他块的两个数据 (片内外存储器, 一般是片内的第3个操作数)
1. AR间接寻址方式 使用辅助寄存器ARn(n=0~7)指向数据; CPU使用ARn产生地址的方式取决于访问的数据类型。 寻址空间 AR内容 数据空间 (存储空间或寄存器) 23位地址的低16位, 而高7位由ARnH提供 寄存器位或双位 位的相对位置 I/O空间 一个16位的I/O地址
(1)AR间接寻址数据空间 ARn提供一个16位的低字地址, 与其相关的寄存器ARnH提供高7位的地址, 它们合成为一个23位的扩展辅助寄存器XARn。 对于访问数据空间, 需使用专用指令把地址装入XARn; ARn可以单独装入; ARnH不能单独装入。
ARnH ARn 数据空间 000 0000 0000 0000 0000 0000 1111 1111 1111 1111 主数据页0: 00 0000h~00 FFFFh 000 0001 主数据页1: 01 0000h~01 FFFFh 000 0010 主数据页2: 02 0000h~02 FFFFh 111 1111 主数据页127: 7F 0000h~7F FFFFh 图4-8 AR间接寻址方式寻址数据空间
例4-6,*(ARn+T0)用于数据存储器寻址, 设ARn工作在线性寻址状态。 (ARnLC=0) (1) MOV *AR4, T2 ; AR4H:AR4 = XAR4, ;CPU从XAR4处读取数据装入T2 例4-6,*(ARn+T0)用于数据存储器寻址, 设ARn工作在线性寻址状态。 (1) MOV *(AR4+T0),T2 ;AR4H:AR4=XAR4, CPU从XAR4处读取数据装入T2, 然后AR4=AR4+T0
(2)AR间接寻址寄存器位 当AR间接寻址方式用于访问一个寄存器位时, 16位的寄存器ARn指定位的位置。 例4-13: *ARn用于对寄存器位的寻址, 设AR0=0。 (1) BSET *AR0, AC3 ; CPU 将AC3的位0置为1
(3)AR间接寻址I/O空间 访问I/O空间使用16位的地址; 当使用AR间接寻址I/O空间时, 被使用的ARn包括完整的I/O空间地址。 0000 0000 0000 0000 . 1111 1111 1111 1111 0000h~FFFFh 图4-10 AR间接寻址I/O空间
例4-16,*ARn 用于对I/O空间的寻址. 设AR4= FF80h, AR5= FFFFh。 (1) MOV port(*AR4), T2 ;CPU从FF80h读取数据进T2 (2) MOV T2, port(*AR5) ;CPU把T2的数据输出到I/O 地址0FFFFh
(4) ARMS位对AR间接操作数的影响 AR间接寻址方式的寻址操作数类型受ST2_55状态寄存器中ARMS位的影响: ARMS DSP模式和控制模式选择 DSP模式:该模式用于高效的数字信号处理 1 控制模式:该模式优化代码长度, 用于控制系统 ☼ 注意: 指针修改和地址产生即可线性也可循环, 根据ST2_55寄 存器的指针配置而定。当使用循环寻址时, 16位的缓冲区 起始地址寄存器(BSA01,BSA23,BSA45,BSA67)的内容被加 到相应的指针上; 指针间的加法和减法以64K为模,不改变XARn,则不能 跨主数据页寻址数据。
表4-9 DSP模式下的AR间接寻址模式(1)(共20种) 操作数 指针修改方式 访问数据类型 *ARn ARn值不变 Smem, Lmem, Baddr *ARn+ 地址产生后, 指针的值自增: 对于16位/1位操作数, 有ARn=ARn+1 对于32位/2位操作数, 有ARn=ARn+2 *ARn- 地址产生后, 指针的值自减: 对于16位/1位操作数, 有ARn=ARn-1 对于32位/2位操作数, 有ARn=ARn-2 *+ARn 地址产生前, 指针的值自增: *-ARn 地址产生前, 指针的值自减: *(ARn+T0/AR0) 地址产生后, 指针的值变化: 如果C54CM=0, 有ARn=ARn+T0; 如果C54CM=1, 有ARn=ARn+AR0; *(ARn-T0/AR0) 如果C54CM=0, 有ARn=ARn-T0; 如果C54CM=1, 有ARn=ARn-AR0; 特有 控制模式无
表4-9 DSP模式下的AR间接寻址模式(2)(共20种) 操作数 指针修改方式 访问数据类型 *ARn(T0/AR0) ARn作为基地址不变, T0或AR0的值作为偏移地址 Smem, Lmem, Baddr *(ARn+T0B/AR0B) 地址产生后, 指针的值变化: 若C54CM=0, 有ARn=ARn+T0; 若C54CM=1,有ARn=ARn+AR0; 上述加法按位倒序进位规律进行 *(ARn-T0B/AR0B) 若C54CM=0, 有ARn=ARn-T0; 若C54CM=1, 有ARn=ARn-AR0; 上述加法按位倒序借位规律进行 *(ARn+T1 ) 地址产生后, 指针值ARn= ARn+T1 *(ARn-T1 ) 地址产生后, 指针值ARn= ARn-T1 *ARn(T1) ARn基地址不变,T1值为偏移地址 *ARn(#K16) ARn基地址不变,K16值为偏移地址 *+ARn(#K16) 地址产生前, 指针值ARn=ARn+K16 特有 控制模式无
表4-10 控制模式下的AR间接寻址模式(共12种) 操作数 指针修改方式 访问数据类型 *ARn ARn值不变 Smem, Lmem, Baddr *ARn+ 地址产生后,指针的值自增: 对16位/1位操作数, 有ARn=ARn+1; 对32位/2位操作数, 有ARn=ARn+2; *ARn- 地址产生后,指针的值自减: 对16位/1位操作数, 有ARn=ARn-1; 对32位/2位操作数, 有ARn=ARn-2 *(ARn+T0/AR0) 地址产生后,指针的值变化: 如果C54CM=0, 有ARn=ARn+T0; 如果C54CM=1, 有ARn=ARn+AR0; *(ARn-T0/AR0) 如果C54CM=0, 有ARn=ARn-T0; 如果C54CM=1, 有ARn=ARn-AR0; *ARn(T0/AR0) ARn基地址不变, T0或AR0值为偏移地址 *ARn(#K16) ARn基地址不变, K16的值作为偏移地址 *+ARn(#K16) 地址产生前, 指针值变为ARn=ARn+K16 *ARn(short(#k3)) ARn作为基地址不变, 3 位的无符号立即数作为偏移指针(k3的值为1~7) DSP模式无
2. 双AR间接寻址方式 通过8个ARn中的2个寄存器访问2个数据存储器地址; 使用双AR间接寻址方式的情况: 执行一个指令, 同时访问两个16位数据存储器; ADD Xmem,Ymem, ACx 并行执行两个指令, 每个指令访问一个数据存储器; MOV Smem,dst‖AND Smem,src,dst ARMS位不影响双AR间接寻址方式(是子集)的操作数; 若ARn被不同的辅助寄存器修改, 则不能用于一个双 操作数指令中。 双操作数可使用同一个ARn, 其中一个为*ARn(T0)或 *ARn , 都不改变ARn。 Xmem Ymem 如AR1-T0, AR1-T1 不能用于双操作数
表4-11双AR间接寻址方式操作数 操作数 指针修改方式 访问数据类型 *ARn ARn值不变 Smem,Lmem,Xmem,Ymem *(ARn+T0/AR0) 寻址后, T0或AR0中16位有符号数加到ARn上: 若C54CM=0, 则ARn=ARn+T0; 若C54CM=1, 则ARn=ARn+AR0 *(ARn-T0/AR0) 寻址后, ARn减去T0或AR0中16位的有符号数: 若C54CM=0, 则ARn=ARn-T0; 若C54CM=1, 则ARn=ARn-AR0 *ARn(T0/AR0) ARn基地址不变, T0或AR0中16位有符号数为偏移地址: 若C54CM=0, T0值作为偏移地址; 若C54CM=1, AR0值作为偏移地址 *(ARn+T1) 地址产生后, AR1加上T1中的16位有符号常数: ARn=ARn+T1 *(ARn-T1) 地址产生后, AR1减去T1中的16位有符号常数: ARn=ARn-T1
例4-5,*ARn用于数据存储器寻址, 设ARn工作在线性寻址状态。(ARnLC=0) (1) MOV *AR4, T2 ; AR4H:AR4=XAR4, CPU从XAR4读取数据装入T2 (2) MOV dbl(*AR4), pair(T2) ;第一个地址为XAR4, ; 若XAR4为偶数, 则第二个地址XAR4+1, ;若XAR4为奇数, 则第二个地址为XAR4-1 ;CPU从XAR4和XAR4+1(或XAR4-1)处读取数据 ;并装入T2和T3
例4-6,*(ARn+T0)用于数据存储器寻址,设ARn工作在线性寻址状态。 (1) MOV *(AR4+T0),T2 ;AR4H:AR4=XAR4, ;CPU从XAR4处读取数据装入T2, ;然后AR4=AR4+T0 (2) MOV dbl(*(AR4+T0)),pair(T2) ;第一个地址为XAR4, ;如果XAR4为偶数,则第二个地址XAR4+1; ;如果XAR4为奇数,则第二个地址为XAR4-1 ;CPU从XAR4和XAR4+1(或XAR4-1)处读取数据 ;并装入T2和T3, 然后AR4=AR4+T0
例4-7,*(ARn+T0B)用于数据存储器寻址, 设ARn工作在线性寻址状态。 (程序略) MOV *(AR4+T0B),T2 ;AR4H:AR4=XAR4, ;CPU从XAR4处读取数据装入T2, ;然后AR4=AR4+T0 ;在执行加法时,采用码位倒置算法
3. CDP间接寻址方式 CPU使用CDP产生地址的方式依赖于访问类型: 表4-12 访问空间与CDP的关系 寻址空间 CDP内容 数据空间(存储空间或寄存器) 23位地址的低16位, 高7位由扩展系数数据指针的高位域部分CDPH给定 寄存器位或双位 某位的位置 I/O空间 一个16位的I/O空间
(1)CDP间接寻址数据空间 CDPH提供7位的高位域, CDP提供16位的低字, 合并为23位的扩展系数数据指针(XCDP) CDPH 000 0000 0000 0000 0000 0000 1111 1111 1111 1111 主数据页0: 00 0000h~00 FFFFh 000 0001 主数据页1: 01 0000h~01 FFFFh 000 0010 主数据页2: 02 0000h~02 FFFFh 111 1111 主数据页127: 7F 0000h~7F FFFFh
(2)CDP间接寻址寄存器位 (3)CDP间接寻址I/O空间 CDP包含位序号: 若CDP为0, 则它指向寄存器第0位; 这些寄存器仅限于:累加器(AC0~AC3) 、辅助寄存器 (AR0~AR7) 、暂存器(T0~T3) 。 (3)CDP间接寻址I/O空间 当CDP间接寻址方式用于访问I/O空间时, 16位的CDP包含了完整的I/O空间地址
(4)CDP间接寻址操作数 表4-13 CDP间接操作数 操作数 指针修改方式 访问类型 *CDP CDP值不改变 Smem,Lmem, Xmem,Ymem *CDP+ 地址产生后,CDP自增: 对于16位/1位操作数, CDP=CDP+1; 对于32位/2位操作数, CDP=CDP+2 *CDP- 地址产生后,CDP自减: 对于16位/1位操作数, CDP=CDP-1; 对于32位/2位操作数, CDP=CDP-2 *CDP(#K16) CDP作为基地址不改变, 16位的有符号常数K16作为偏移地址 *+CDP(#K16) 地址产生前, 16位的有符号常数K16加到CDP上, 即CDP=CDP+K16 ☼ 注意: 指针修改或地址产生可以是线性的, 也可是循环的, 取决于ST2_55中的指针配置。使用循环寻址时, 16位缓冲区起始地址寄存器(BSAC)的内容被加到相应指针上; CDP指针的修改以64K为模, 只有修改CDPH才能跨主数据页寻址。 CDPLC
4. 系数间接寻址方式 指令中用Cmem表示 使用与CDP间接寻址方式相同的地址产生方式; 选择存储空间数据移动/初始化以及一些算术指令支 持系数间接寻址方式; 系数间接寻址方式主要用于一个周期内对三个存储器操 作数进行操作的指令。其中, 两个操作数(Xmem和Ymem) 用双AR间接寻址, 第三个操作数(Cmem)用系数间接寻址 方式, Cmem在BB总线上传送。 如: 有限冲击响应滤波器 乘法运算 乘加运算 乘减运算 双乘加运算和双乘减运算 例如: MPY Xmem,Cmem,ACx ::MPY Ymem,Cmem,ACy 其中, Cmem位于与Xmem、Ymem不同的存储器区块上.
有些指令不使用BB总线传送Cmem操作数。 由于BB总线与外部存储器没有接口, 如果是BB总线传送数据, 则操作数必须是片内存储器的。 指令语法 Cmem访问数据类型 Cmem访问总线 MOV Cmem,Smem 从Cmem中读16位 DB MOV Smem,Cmem 向Cmem中写16位 EB MOV Cmem, dbl(Lmem) 从Cmem中读32位 CB读高字, DB读低字 MOV dbl(Lmem), Cmem 向Cmem中写32位 FB读高字, EB读低字 Cmem与Smem都是单字操作数, 其区别: Cmem只来自数据存储器, Smem除来自数据存储器, 还来自I/O空间和MMR.
CDP的修改以64K取模, 只能修改CDPH后才能跨主数据页寻址。 表4-15 系数间接寻址操作数 操作数 指针变化 类型 *CDP CDP不改变 数据 空间 *CDP+ 地址产生后,CDP自增: 对于16位操作数,CDP=CDP+1; 对于32位操作数,CDP=CDP+2 *CDP- 地址产生后,CDP自减: 对于16位操作数,CDP=CDP-1; 对于32位操作数,CDP=CDP-2 *(CDP+T0/AR0) 寻址后,16位有符号数T0或AR0加到CDP上 如果C54CM=0,CDP=CDP+T0; 如果C54CM=1,CDP=CDP+AR0 ☼ 注意: 指针修改和地址产生可以是线性的或循环的, 这取决于ST2_55的指针配置。仅当CDP循环寻址时, 16位缓冲区起始地址寄存器BSAC将被加到指针上; CDP的修改以64K取模, 只能修改CDPH后才能跨主数据页寻址。 CDPLC
指令操作码 指令 11101111 AAAAAAAI xxxx00mm MOV Cmem, Smem 11101111 AAAAAAAI xxxx01mm MOV Smem, Cmem 11101111 AAAAAAAI xxxx10mm MOV Cmem,dbl(Lmem) 11101111 AAAAAAAI xxxx11mm MOV dbl(Lmem), Cmem AAAA AAAI Smem 寻址方式: AAAA AAA0 @dma, 直接存储器(dma) 直接寻址 AAAA AAA1 Smem 间接存储器寻址: 0001 0001 ABS16(#k16) 0011 0001 *(#k23) 0101 0001 port(#k16) 0111 0001 *CDP 1001 0001 *CDP+ 1011 0001 *CDP– 1101 0001 *CDP(#K16) 1111 0001 *+CDP(#K16) PPP0 0001 *ARn PPP0 0011 *ARn+ PPP0 0101 *ARn– PPP0 0111 *(ARn+T0), when C54CM=0, *(ARn+T0), when C54CM=1 PPP0 1001 *(ARn –T0), when C54CM = 0, *(ARn –T0), when C54CM = 1 PPP0 1011 *ARn(T0), when C54CM = 0, *ARn(T0), when C54CM = 1 PPP0 1101 *ARn(#K16) PPP0 1111 *+ARn(#K16) PPP1 0011 *(ARn+T1), when ARMS=0, *ARn(short(#1)), when ARMS=1 PPP1 0101 *(ARn–T1), when ARMS=0,*ARn(short(#2)), when ARMS=1 PPP1 0111 *ARn(T1), when ARMS = 0,*ARn(short(#3)), when ARMS = 1 PPP1 1001 *+ARn, when ARMS = 0,*ARn(short(#4)), when ARMS = 1 PPP1 1011 *–ARn, when ARMS = 0,*ARn(short(#5)), when ARMS = 1 PPP1 1101 *(ARn + T0B), when ARMS = 0,*ARn(short(#6)), when ARMS = 1 PPP1 1111 *(ARn –T0B), when ARMS = 0,*ARn(short(#7)), when ARMS = 1 PPP encodes an auxiliary register (ARn) as for XXX and YYY. mm 系数间接寻址(Cmem): 00 *CDP 01 *CDP+ 10 *CDP– 11 *(CDP + T0)
4.1.4 数据存储器的寻址 上述三种寻址方式(绝对、直接、间接)都可用于对数据存储器的寻址。以下通过几个例题进行说明。 例4-1: *abs16(#k16)对数据存储器寻址,设DPH=03h. (1) MOV *abs16(#2002h),T2 (已讲) ;#k16=2002h,CPU从03 2002h处读取数据装入T2 (2) MOV dbl(*abs16(#2002h)), pair(T2) ;#k16=2002h, #k16+1=2003h ;CPU从03 2002h和03 2003h读取数据,装入T2和T3
例4-2,*(#k23) 用于数据存储器寻址。 (1) MOV *(#032002h),T2 ;k23=03 2002h, ;CPU从03 2002h处读取数据装入T2 (已讲) (2) MOV dbl(*(#032002h)),pair(T2) ;k23=03 2002h, k23+1=03 2003h ;CPU从03 2002h和03 2003h读取数据,装入T2和T3
例4-3,@Daddr用于数据存储器寻址。 设DPH=03h,DP=0000h。 (1) MOV @0005h,T2 (已讲) ;DPH:(DP+Doffset)=03:(0000h+0005h) ; =03 0005h ;CPU从03 0005h处读取数据装入T2 (2) MOV dbl(@0005h),pair(T2) ;DPH:(DP+Doffset)=03 0005h, ;DPH:(DP+Doffset–1)=03 0004h ;CPU从03 0005h和03 0004h读取数据装入T2和T3
例4-4,*SP(offset)用于数据存储器寻址。 设SPH=0,SP = FF00h。 (1) MOV *SP(5),T2 (已讲) ;SPH:(SP+offset)=00 FF05h, ;CPU从00 FF05h 处读取数据装入T2 (2) MOV dbl(*SP(5)), pair(T2) ;SPH:(SP+offset–1)=00 FF04h ;CPU从00 FF05h和00 FF04h读取数据装入T2和T3
例4-5,*ARn用于数据存储器寻址, 设ARn工作在线性寻址状态。(ARnLC=0) (1) MOV *AR4, T2 ; AR4H:AR4=XAR4, CPU从XAR4读取数据装入T2 (2) MOV dbl(*AR4), pair(T2) ;第一个地址为XAR4, ; 若XAR4为偶数, 则第二个地址XAR4+1, ;若XAR4为奇数, 则第二个地址为XAR4-1 ;CPU从XAR4和XAR4+1(或XAR4-1)处读取数据 ;并装入T2和T3 (已讲)
例4-6,*(ARn+T0)用于数据存储器寻址,设ARn工作在线性寻址状态。 (1) MOV *(AR4+T0),T2 ;AR4H:AR4=XAR4, ;CPU从XAR4处读取数据装入T2, ;然后AR4=AR4+T0 (2) MOV dbl(*(AR4+T0)),pair(T2) ;第一个地址为XAR4, ;如果XAR4为偶数,则第二个地址XAR4+1; ;如果XAR4为奇数,则第二个地址为XAR4-1 ;CPU从XAR4和XAR4+1(或XAR4-1)处读取数据 ;并装入T2和T3, 然后AR4=AR4+T0 (已讲)
例4-7,*(ARn+T0B)用于数据存储器寻址, 设ARn工作在线性寻址状态。 (程序略) MOV *(AR4+T0B),T2 ;AR4H:AR4=XAR4, ;CPU从XAR4处读取数据装入T2, ;然后AR4=AR4+T0 ;在执行加法时,采用码位倒置算法 (已讲)
4.1.5 存储器映射寄存器的寻址 上述三种寻址方式(绝对、直接、间接)都可以用于对MMR寻址。 以下通过几个例题进行说明。 例4-8: *abs16(#k16)用于MMR寻址, DPH必须为00h。 MOV *abs16(#AR2), T2 ;DPH:k16=00 0012h (AR2的地址为00 0012h) ;CPU从00 0012h处读取数据装入T2 (已讲) 例4-9: * (#k23) 用于MMR寻址。 (已讲) MOV * (#AR2), T2 ;k23=00 0012h(AR2的地址为00 0012h) ;CPU从00 0012h处读取数据装入T2
例4-10: @Daddr用于MMR寻址. DPH=DP=00h, CPL=0。 (已讲) MOV mmap(@AC0L), AR2 ;DPH:(DP+Doffset)= 00:(0000h+0008h)=00 0008h ;CPU从00 0008h处读取数据装入AR2 例4-11: *ARn用于MMR寻址,ARn 指向某寄存器。 MOV *AR6, T2 ;用AR6里内容寻址的存储单元的值装入T2
4.1.6寄存器位的寻址 直接和间接寻址方式可用于对寄存器位的寻址,见下边例题。 例4-12 @bitoffset用于对寄存器位的寻址。 (1) BSET @0, AC3 ; ;CPU将AC3的位0置为1 (已讲) (2) BTSTP @30, AC3; 把AC3的位30和位31分别复制到状态寄存器ST0_55的位TC1和TC2
例4-13,*ARn用于对寄存器位的寻址, 设AR0=0,AR5=30。 (1) BSET *AR0, AC3 ; CPU 将AC3的位0置为1 (已讲) (2) BTSTP *AR5,AC3 ;CPU测试AC3的位30和位31, ; 并分别将其测试值复制到状态寄存器ST0_55的 位TC1和TC2
4.1.7 I/O空间的寻址 绝对、直接、间接等三种寻址方式都可以用于对I/O空间的寻址,见以下例题。 例4-14,port(#k16) 用于对I/O空间的寻址。 (1) MOV port(#2), AR2 ;CPU从I/O 地址0002h读取数据, 输送到AR2 (2) MOV AR2, port(#0F000h) ;CPU把AR2的数据输出到I/O 地址0F000h (已讲)
例4-15, @Poffset对I/O空间的寻址, 设PDP=511。 → 1111 1111 1 F F 1 (1) MOV port(@0),T2 ;PDP:Poffset=FF80h, ;CPU从FF80h读取数据进T2 (2) MOV T2,port(@127) ;PDP:Poffset=FFFFh, ;CPU把T2的数据输出到I/O地址0FFFFh → 000 0000 → 111 1111 (已讲)
;CPU把T2的数据输出到I/O 地址0FFFFh 例4-16,*ARn 用于对I/O空间的寻址. 设AR4= FF80h, AR5= FFFFh。 (1) MOV port(*AR4), T2 ;CPU从FF80h读取数据进T2 (2) MOV T2, port(*AR5) ;CPU把T2的数据输出到I/O 地址0FFFFh (已讲)
4.1.8 循环寻址 任何一种间接寻址方式都可以使用循环寻址; 每个ARn(n = 0~7)和CDP都能独立地配置为线性或 循环寻址。该配置位(ARnLC, CDPLC)位于ST2_55 中,设置该位则实现循环寻址(ARnLC=CDPLC=1)。 循环缓冲区大小在寄存器BK03、BK47或BKC中定义: 对于字缓冲区则定义字的个数; 对于寄存器位缓冲区则定义位的个数;
4.1.8 循环寻址 对于数据空间的字缓冲区,必须存放在128个数据页中的一个主数据页内,不能跨主数据页存放。 缓冲区内每个地址具有23位, 高7位代表主数据页, 由CDPH或ARnH决定; CDPH可被独立地装入, ARnH则不能。要装入ARnH, 则必须通过装载XARn来实现, 即ARnH:ARn; 在主数据页内, 缓冲区的首地址由16位缓冲区首地址寄存器装入的值定义, 装入到指针ARn或CDP的值作为索引, 即相对于缓冲区首地址的偏移地址。 对于位缓冲区, 缓冲区起始地址寄存器定义参考位。 指针选择相对于参考位的位置位, 仅需装入ARn或CDP, 不必装入XARn或XCDP。
表4-16 循环寻址 指针 线性(0)/循环(1) 寻址配置位 主数据页寄存器 缓冲区首地址寄存器 缓冲区大小寄存器 AR0 表4-16 循环寻址 指针 线性(0)/循环(1) 寻址配置位 主数据页寄存器 缓冲区首地址寄存器 缓冲区大小寄存器 AR0 ST2_55(0)=AR0LC AR0H BSA01 BK03 AR1 ST2_55(1)=AR1LC AR1H AR2 ST2_55(2)=AR2LC AR2H BSA23 AR3 ST2_55(3)=AR3LC AR3H AR4 ST2_55(4)=AR4LC AR4H BSA45 BK47 AR5 ST2_55(5)=AR5LC AR5H AR6 ST2_55(6)=AR6LC AR6H BSA67 AR7 ST2_55(7)=AR7LC AR7H CDP ST2_55(8)=CDPLC CDPH BSAC BKC
1. 配置AR0~AR7和CDP进行循环寻址 表4-17 AR寄存器线性/循环寻址配置位 ARnLC (n=0~7) 用 途 线性寻址 1 用 途 线性寻址 1 循环寻址 表4-18 CDP寄存器线性/循环寻址配置位 CDPLC 用 途 线性寻址 1 循环寻址
2. 循环缓冲区的实现 在数据空间建立一个字循环缓冲区的具体操作步骤: (1) 初始化相应缓冲区大小寄存器(BK03、BK47或BKC); (2) 初始化ST2_55中相应的配置位(ARnLC, CDPLC), 使能选定指针的循环寻址; (3) 初始化相应的扩展寄存器(XARn或XCDP), 选择一个主数据页。 例如: 如果AR3是一个循环指针, 则装入XAR3; 如果CDP是循环指针,则装入XCDP。
在数据空间建立一个字循环缓冲区的具体操作步骤 (续): (4)初始化对应的缓冲区首地址寄存器(BSA01, BSA23, BSA45,BSA67或BSAC), 主数据页XAR(22~16)或 XCDP(22-16)和BSA寄存器合并形成缓冲区的23位首 地址。 (5)装入选定的指针ARn或CDP, 其值从0至缓冲区长 度减1。 例如: 如果使用AR1, 且缓冲区长度为8, 则AR1装入 的值小于或等于7。
AMOV #010000h, XAR1 ;循环缓冲区位于主数据页01 MOV #0A20h, BSA01 ;缓冲区首地址 例4-17,初始化和寻址一个循环缓冲区。 MOV #3, BK03 ;循环缓冲区大小为3个字 BSET AR1LC ;使用AR1循环寻址 AMOV #010000h, XAR1 ;循环缓冲区位于主数据页01 MOV #0A20h, BSA01 ;缓冲区首地址 MOV #0000h, AR1 ;初始化AR1 MOV *AR1+, AC0 ;AC0=(01 0A20h), AR1=0001h MOV *AR1+, AC0 ;AC0=(01 0A21h), AR1=0002h MOV *AR1+, AC0 ;AC0=(01 0A22h), AR1=0000h 首址不能为0A21h, 否则下次循环的首址就变成了0A20h, 循环的首址最低有效位必须有至少N个0, N满足2N>缓冲区长度.
4.2 TMS320C55x的指令系统 两种指令集 助记符指令集 采用助记符来表示指令 代数指令集 指令类似于代数表达式, 运算关系比较清楚明了; 助记符指令和代数指令在功能上是一一对应的,只 是表示形式不同; 在编程时只能使用一种指令集; 本节介绍助记符指令。
4.2 TMS320C55x的指令系统 指令集按操作类型可分为6种: 算术运算指令 (142条) 位操作指令(20条) 扩展辅助寄存器操作指令(7条) 逻辑运算指令(32条) 移动指令(141条) 程序控制指令(34条)
4.2 TMS320C55x的指令系统 一条指令的属性包括: 指令 执行的操作 是否有并行使能位 长度 周期 在流水线上的执行段 执行的功能单元
一条指令的属性包括: 指令 执行的操作 是否有并行使能位 长度 周期 在流水线上的执行段 执行的功能单元 4.2 TMS320C55x的指令系统 一条指令的属性包括: 指令 执行的操作 是否有并行使能位 长度 周期 在流水线上的执行段 执行的功能单元
累加器溢出状态位: ACOV0, ACOV1, ACOV2, ACOV3 表4-19 指令系统中使用的符号及其含义(1) 符 号 含 义 [ ] 可选的项 40 若选择该项, 则该指令执行时M40=1, ACOVx 累加器溢出状态位: ACOV0, ACOV1, ACOV2, ACOV3 ACx, ACy, ACz, ACw 累加器AC0~AC3 ARx, ARy 辅助寄存器:AR0, AR1, AR2, AR3, AR4, AR5, AR6, AR7 Baddr 寄存器位地址 BitIn 移进的位:TC2或CARRY BitOut 移出的位:TC2或CARRY BORROW CARRY位的补 CARRY 进位位 Cmem 系数间接寻址操作数 cond 条件表述 CSR 单指令重复计数寄存器 Cycles 指令执行的周期数 dst 目的操作数:累加器, 辅助寄存器的低16位, 临时寄存器 ST1_55(D10) T0~T3
表4-19 指令系统中使用的符号及其含义(2) 符 号 含 义 Dx 编码成x位长的数据地址标号(绝对地址) kx 编码成x位长的无符号常数 Kx 编码成x位长的带符号常数 lx 编码成x位长的程序地址标号(相对于PC的无符号偏移量) Lx 编码成x位长的程序地址标号(相对于PC的带符号偏移量) Lmem 32位数据存储值 E 表示指令是否包含并行使能位 Pipe,Pipeline 流水线执行阶段:D=译码,AD=寻址,R=读,X=执行 Pmad 程序地址值 Px 编码成x位长的程序或数据绝对地址值(标号) RELOP 关系运算符:= =等于,<小于,>=大于等于,!=不等于 R or rnd 表示要进行舍入(取整) RPTC 单循环计数寄存器 SHFT 0~15的移位值 SHIFTW -32~31的移位值
表4-19 指令系统中使用的符号及其含义(3) 符 号 含 义 S, Size 指令长度(以字节为单位) Smem 单个16位数据访问单元(可来自数据存储器,I/O, MMR) SP 数据堆栈指针 src 源操作数: 累加器, 辅助寄存器的低16位, 临时寄存器 STx 状态寄存器(ST0~ST3) Tax,TAy 辅助寄存器(ARx)或临时寄存器(Tx) TCx,TCy 测试控制标志(TC1,TC2) TRNx 转移寄存器(TRN0,TRN1) Tx,Ty 临时寄存器(T0~T3) U or uns 操作数为无符号数 XARx 23位辅助寄存器(XAR0~XAR7) xdst 累加器(AC0~AC3)或 目的扩展寄存器(XSP, XSSP, XDP, XCDP, XARx) xsrc 源扩展寄存器(XSP, XSSP, XDP, XCDP, XARx) Xmem,Ymem 双数据存储器访问(仅用于间接寻址) XAdst, XAsrc : 扩展寄存器(XSP, XSSP, XDP, XCDP, XARx)
<<< >>> 表4-20 指令系统中使用的运算符及其含义 运 算 符 定 义 计算方向 + - ~ 加,减,取反 由右到左 * / % 乘,除,取模 由左到右 + - 加,减 << >> 带符号左移, 右移 <<< >>> 逻辑左移, 逻辑右移 < <= 小于,小于或等于 > >= 大于,大于或等于 == != 等于,不等于 & 按位与 ︱ 按位或 ^ 按位异或 ! 取反
4.2.1 算术运算指令(142条) 加法指令(16条) 减法指令(18条) 条件减法指令(1条) 条件加减法指令(3条) 乘法指令(11条) 乘加指令(14条) 乘减指令(7条) 双乘加/减指令(15条) 双16位算术指令(加减-10条) 比较和选择极值指令(4条) 最大/最小值指令(2条) 存储器比较指令(1条) 寄存器比较指令(5条) 条件移位指令(1条) 带符号移位指令(6条) 修改辅助寄存器指令(8条) 修改堆栈指针指令(1条) 隐含并行指令 (8条) 绝对距离指令(1条) 绝对值指令(1条) FIR滤波指令(2条) 最小均方(LMS)指令(1条) 补码指令(1条) 归一化指令(2条) 饱和和舍入指令(2条) 平方差指令(1条)
1.加法指令(16条) 助记符指令 说 明 ADD [src,]dst 两个寄存器的内容相加:dst = dst + src 说 明 ADD [src,]dst 两个寄存器的内容相加:dst = dst + src ADD k4,dst 4位无符号立即数加到寄存器:dst = dst + k4 ADD K16,[src,]dst 16位带符号立即数和源寄存器的内容相加:dst = src + K16 ADD Smem,[src,]dst 操作数Smem和源寄存器的内容相加: dst = src + Smem ADD ACx<<Tx, ACy 累加器ACx根据Tx中内容移位后, 再和累加器ACy相加: ACy = ACy + (ACx << Tx) ADD ACx<<#SHIFTW, ACy 累加器ACx移位后与累加器ACy相加: ACy = ACy + (ACx << #SHIFTW) ADD K16<<#16,[ACx,]ACy 16位带符号立即数左移16位后加到累加器:ACy = ACx + (K16 << #16) ADD K16<<#SHFT,[ACx,]ACy 16位带符号立即数移位后加到累加器: ACy = ACx + (K16 << #SHFT) ADD Smem<<Tx,[ACx,]ACy 操作数Smem根据Tx中内容移位后, 再和累加器ACx相加: ACy = ACx + (Smem << Tx)
助记符指令 说 明 ADD Smem<<#16,[ACx,]ACy 操作数Smem左移16位后, 再与ACx累加:ACy = ACx + (Smem << #16) ADD [uns( ]Smem[ )],CARRY, [ACx,]ACy 操作数Smem带进位加到累加器: ACy = ACx + Smem + CARRY ADD [uns( ]Smem[ )],[ACx,]ACy 操作数Smem加到累加器: ACy = ACx + uns(Smem) ADD [uns( ]Smem[ )]<<#SHIFTW, [ACx,]ACy 操作数Smem移位后加到累加器: ACy = ACx + (Smem << #SHIFTW) ADD dbl(Lmem),[ACx,]ACy 32位操作数Lmem加到累加器: ACy =ACx + dbl(Lmem) ADD Xmem,Ymem, ACx 两操作数Xmem,Ymem均左移16位后加到ACx: ACx=(Xmem<<#16)+(Ymem<<#16) ADD K16, Smem 操作数Smem和16位带符号立即数相加: Smem = Smem + K16 影响指令执行的状态位:CARRY,C54CM,M40,SATA,SATD,SXMD 执行指令后会受影响的状态位: ACOVx,ACOVy,CARRY
(1) ADD *AR3+,T0,T1 ;AR3间接寻址得到的内容与T0的内容相加, ;结果装入T1, 并将AR3增1。 例4-18,加法指令举例。 (1) ADD *AR3+,T0,T1 ;AR3间接寻址得到的内容与T0的内容相加, ;结果装入T1, 并将AR3增1。 指令中是负数1100h, 所以无进位;不能用uns(*AR3+)
(2) ADD *AR1<<T0, AC1, AC0 ;将由AR1寻址得到的内容左移T0位后与AC1相加, ; 结果装入AC0 左移12位后030 0000
2.减法指令(18条) 助记符指令 说 明 SUB [src,]dst 两个寄存器的内容相减:dst = dst – src 说 明 SUB [src,]dst 两个寄存器的内容相减:dst = dst – src SUB k4,dst 寄存器内容减去4位无符号数: dst = dst – k4 SUB K16,[src,]dst 寄存器内容减去16位带符号数:dst = src – K16 SUB Smem,[src,]dst 寄存器内容减去Smem: dst = src – Smem SUB src,Smem,dst Smem减去源寄存器内容: dst=Smem–src SUB ACx<<Tx,ACy 累加器ACx根据Tx中内容移位后,作减数与ACy相减:ACy=ACy–(ACx<<Tx) SUB ACx<<#SHIFTW,ACy 累加器ACx移位后,作减数与ACy相减: ACy = ACy – (ACx << #SHIFTW) SUB K16<<#16,[ACx,]ACy 16位带符号立即数左移16位后,作减数和ACx相减:ACy = ACx – (K16 << #16) SUB K16<<#SHFT,[ACx,]ACy 16位带符号立即数移位后,作减数和ACx相减:ACy = ACx – (K16 << #SHFT) SUB Smem<<Tx,[ACx,]ACy 操作数Smem根据Tx中的内容移位后,作减数和ACx相减:ACy=ACx–(Smem<<Tx)
助记符指令 说 明 SUB Smem<<#16, [ACx,] ACy Smem左移16位后,作为减数和ACx相减: ACy = ACx – (Smem << #16) SUB ACx,Smem<<#16,ACy Smem左移16位后, 作为被减数和ACx相减: ACy = (Smem << #16) – ACx SUB [uns( ]Smem[ )], BORROW, [ACx,]ACy 从累加器中减去带借位的Smem: ACy = ACx – Smem – BORROW SUB [uns( ]Smem[ )], [ACx,] ACy 从累加数中减去操作数Smem: ACy = ACx – Smem SUB [uns( ]Smem[ )]<< #SHIFTW, [ACx,]ACy 从累加数中减去移位后的Smem: ACy = ACx – (Smem << #SHIFTW) SUB dbl(Lmem),[ACx,]ACy 从累加数中减去32位操作数Lmem: ACy = ACx – dbl(Lmem) SUB ACx,dbl(Lmem),ACy 32位操作数Lmem减去累加器: ACy = dbl(Lmem) – ACx SUB Xmem,Ymem,ACx Xmem,Ymem均左移16位后相减: ACx=(Xmem<<#16)–(Ymem<<#16) 影响指令执行的状态位: CARRY,C54CM,M40,SATA,SATD,SXMD 执行指令后会受影响的状态位: ACOVx, ACOVy, CARRY
SUB uns(*AR1),BORROW,AC0,AC1 ; AC0减去由AR1寻址的内容及CARRY位求反的值, ;并将结果装入AC1 例4-19,减法指令举例。 SUB uns(*AR1),BORROW,AC0,AC1 ; AC0减去由AR1寻址的内容及CARRY位求反的值, ;并将结果装入AC1 减法运算时, 没有借位则CARRY位为1
3. 条件减法指令(1条) 指令: SUBC Smem, [ACx,] ACy ; if ((ACx–(Smem<<#15))>=0) ; ACy=(ACx–(Smem<<#15))<<#1+1 ;else ; ACy=ACx<<#1 状态位 影响指令执行的状态位:SXMD 执行指令后会受影响的状态位:ACOVy, CARRY
例4-20, 条件减法指令举例: SUBC *AR1,AC0,AC1 ;若(AC0–(*AR1)<<#15)>=0, ;则AC1=(AC0–(*AR1)<<#15)<<#1+1, ;否则AC1=AC0<<#1 ACOV1=1 ACOV1=0 M40=0
4.条件加减法指令(3条) 助记符指令 说 明 ADDSUBCC Smem, ACx, TCx, ACy 说 明 ADDSUBCC Smem, ACx, TCx, ACy if TCx=1, ACy =ACx+(Smem<<#16) else ACy=ACx–(Smem<<#16) Smem, ACx, TC1,TC2, ACy if TC2=1, ACy=ACx if TC2=0 and TC1=1 ACy=ACx+(Smem<<#16) if TC2=0 and TC1=0 ACy=ACx–(Smem<<#16) ADDSUB2CC Smem, ACx, Tx, TC1, TC2, ACy if TC2=1and TC1=1 ACy=ACx+(Smem<<Tx) if TC2=1 and TC1=0 ACy=ACx–(Smem<<Tx) 影响指令执行的状态位:C54CM, M40, SATD, SXMD, TC1,TC2 执行指令后会受影响的状态位:ACOVy, CARRY
例4-21,条件加减法指令举例: ADDSUBCC *AR1,AC0,TC2,AC1 ;如果TC2=1,则AC1=AC0+(*AR1)<<#16 ;否则AC1=AC0–(*AR1)<<#16
5.乘法指令(11条) [T3=]: 有此选项,则将16位的Smem存到T3中 助记符指令 说 明 SQR[R] [ACx,]ACy 说 明 SQR[R] [ACx,]ACy 计算ACx高位部分(32-16位)的平方值, 结果舍入后放入ACy:ACy = ACx * ACx MPY[R] [ACx,] ACy ACx和ACy高位部分(32-16位)相乘, 结果舍入后放入ACy:ACy = ACy * ACx MPY[R] Tx,[ACx,]ACy ACx高位部分(32-16位)和Tx中内容相乘,结果舍入后放入ACy:ACy = ACx * Tx MPYK[R] K8,[ACx,] ACy ACx高位部分(32-16位)和8位带符号立即数相乘, 结果舍入后放入ACy: ACy=ACx*K8 K16,[ACx,] ACy ACx高位部分(32-16位)和16位带符号立即数相乘, 结果舍入后放入ACy: ACy=ACx*K16 MPYM[R][T3=] Smem, Cmem,ACx 两个操作数Smem、Cmem相乘, 结果舍入后放入ACx: ACx = Smem * Cmem [T3=]: 有此选项,则将16位的Smem存到T3中
助记符指令 说 明 SQRM[R][T3=] Smem,ACx Smem的平方, 结果舍入后放入ACx:ACx = Smem * Smem MPYM[R][T3=] Smem,[ACx,]ACy Smem和ACx(32–16)相乘, 结果舍入后放入ACy: ACy = Smem * ACx MPYMK[R][T3=] Smem,K8,ACx Smem和8位带符号立即相乘, 结果舍入后放入ACx:ACx = Smem * K8 MPYM[R][40][T3=] [uns( ] Xmem [ )] , [uns( ] Ymem [ )], ACx Xmem,Ymem相乘,结果舍入后放入ACx: ACx = Xmem * Ymem MPYM[R][U][T3=] Smem,Tx,ACx Tx内容和操作数Smem相乘, 结果舍入后放到ACx:ACx = Tx * Smem 影响指令执行的状态位:FRCT, SMUL, M40, RDM, SATD 执行指令后受影响的状态位:ACOVx,ACOVy
例4-22,乘法指令举例。 MPY AC10,AC01 ;AC01=AC1 * AC0 Affected by FRCT, M40, RDM, SATD, SMUL Affects ACOV1, Overflow detection depends on M40.
6.乘加指令(14条) 助记符指令 说 明 SQA[R] [ACx,]ACy 说 明 SQA[R] [ACx,]ACy ACy和ACx的乘方相加, 结果舍入后放入ACy:ACy = ACy + (ACx * ACx) SQDST Xmem, Ymem, ACx, ACy 两个并行操作, 乘累加和减法: 平方距离 ACy = ACy + (ACx * ACx) :: ACx = (Xmem << #16) – (Ymem << #16) MAC[R] ACx,Tx,ACy[,ACy] ACx和Tx的内容相乘后,再与ACy相加,结果舍入后放入ACy: ACy = ACy + (ACx*Tx) MAC[R] ACy,Tx,ACx,ACy ACy和Tx的内容相乘后,再与ACx相加,结果舍入后放ACy: ACy = (ACy * Tx) + ACx MACK[R] Tx,K8,[ACx,]ACy Tx内容和8位带符号立即数相乘后,再与ACx相加,结果舍入后放入AC: ACy=ACx+(Tx*K8) MACK[R] Tx,K16,[ACx,]ACy Tx内容和16位带符号立即数相乘后, 再与ACx相加, 结果舍入后放入ACy:ACy=ACx+(Tx*K16) MACM[R][T3=] Smem,Cmem,ACx Smem,Cmem相乘后加到ACx并做舍入: ACx = ACx + (Smem * Cmem) MACM[R]Z[T3=] Smem,Cmem,ACx 同上一条指令, 并且与delay指令并行执行: ACx=ACx+(Smem*Cmem)::delay(Smem) ACx(32–16)
SQAM[R] [T3=] Smem, [ACx,]ACy 助记符指令 说 明 SQAM[R] [T3=] Smem, [ACx,]ACy ACx和Smem的乘方相加,结果舍入后放入ACy: ACy = ACx + (Smem * Smem) MACM[R][T3=] Smem,[ACx,]ACy Smem和ACx相乘结果加到ACy并做舍入: ACy = ACy + (Smem * ACx) MACM[R][T3=] Smem,Tx,[ACx,]ACy Tx内容和Smem相乘, 再与ACx相加, 结果舍入后放入ACy: ACy=ACy[x]+(Smem*AC Tx) MACMK[R][T3=] Smem,K8,[ACx,]ACy Smem和8位带符号立即数相乘,再与ACx相加,结果舍入后放入ACy: ACy=ACx+(Smem*K8) MACM[R][40][T3=] [uns(]Xmem[)],uns(]Ymem[)], [ACx,] ACy Xmem、Ymem相乘,再与ACx相加,结果舍入后放入ACy: ACy=ACx+(Xmem*Ymem) MACM[R][40][T3=] [uns(] Xmem[)],[uns(]Ymem[)], ACx>>#16[,ACy] Xmem、Ymem相乘, 再与ACx右移16位后的值相加, 结果舍入后放入ACy: ACy = (ACx >> #16) + (Xmem * Ymem) ACx(32–16) 影响指令执行的状态位:FRCT, SMUL, M40, RDM, SATD 执行指令后会受影响的状态位: ACOVx, ACOVy
(1)MACMR *AR1,*CDP,AC2 ;AC2=AC2+(*AR1) * (*CDP) 例4-23,乘加指令举例。 (1)MACMR *AR1,*CDP,AC2 ;AC2=AC2+(*AR1) * (*CDP) 两数都符号扩展到17bit 指令没R(MACM)不舍入的结果为0x00 EBFF 8000 =EC00 0000-8000 MACMR有R需舍入, 所以执行后AC2仍然为 00 EC00 0000 00 0 这是正数 累加溢出 是负数,绝对值为 0200 乘积是负数,绝对值为 8000
(2)MACMR uns(. AR2+),uns(. AR3+),AC3 ;AC3=(. AR2). ( (2)MACMR uns(*AR2+),uns(*AR3+),AC3 ;AC3=(*AR2)*(*AR3)+AC3 ;AR2=AR2+1, AR3=AR3+1 无符号数乘积 6F20 0000
7.乘减指令(7条) 助记符指令 说 明 SQS[R] [ACx,]ACy 说 明 SQS[R] [ACx,]ACy ACy减去ACx的平方, 结果舍入后放入ACy: ACy = ACy – (ACx * ACx) MAS[R] Tx,[ACx,]ACy ACy减去ACx和Tx的内容的乘积, 结果舍入后放入ACy: ACy=ACy–(ACx*Tx) MASM[R][T3 = ] Smem, Cmem,ACx ACx减去Smem与Cmem的乘积,结果舍入后放入ACx: ACx=ACx–(Smem*Cmem) SQSM[R][T3=] Smem, [ACx,] ACy ACx减去Smem的平方, 结果舍入后放入ACy: ACy=ACx–(Smem*Smem) MASM[R][T3 =] Smem, [ ACx , ] ACy ACy减去Smem和ACx的乘积, 结果舍入后放入ACy: ACy=ACy–(Smem*ACx) MASM[R][T3 = ] Smem,Tx,[ACx,]ACy ACx减去Tx内容和Smem的乘积, 结果舍入后放入ACy: ACy=ACx–(Tx*Smem) MASM[R][40][T3= ] [uns(]Xmem[)],[uns(]Ymem [)], [ACx,] ACy ACx减去Xmem, Ymem的乘积, 结果舍入后放入ACy: ACy=ACx–(Xmem*Ymem) 影响指令执行的状态位: FRCT, SMUL, M40, RDM, SATD 执行指令后会受影响的状态位: ACOVx, ACOVy
MASR T1, AC0, AC1 ;AC1=AC1–AC0(32-16)*T1 例4-24,乘减指令举例。 MASR T1, AC0, AC1 ;AC1=AC1–AC0(32-16)*T1 就是17bit, 只有T1需符号扩展到17bit -1D80 0000h 17bit正数0EC00h与17bit正数02000h乘积1D80 0000h
8.双乘加/减指令(15条) 助记符指令 说 明 MPY[R][40] [uns(]Xmem[)], uns(]Cmem[),ACx 说 明 MPY[R][40] [uns(]Xmem[)], uns(]Cmem[),ACx ::MPY[R][40] [uns(]Ymem[)], [uns(]Cmem[)],ACy 在一个指令周期内同时完成两个操作数Xmem和Cmem、Ymem 和Cmem相乘: ACx = Xmem * Cmem:: ACy = Ymem * Cmem MAC[R][40] [uns(]Xmem)], [uns(]Cmem)],ACx ::MPY[R][40] [uns(]Ymem[)], 在一个指令周期内同时完成下列算术运算:累加器ACx与两个操作数的乘积相加,结果舍入后放入累加器ACx;两个操作数相乘,结果舍入后放入累加器ACy: ACx = ACx + (Xmem * Cmem) :: ACy = Ymem * Cmem MAS[R][40] [uns(]Xmem[)], [uns(]Cmem[)],ACx 在一个指令周期内同时完成下列算术运算:累加器ACx减去两个操作数的乘积,结果舍入后放入累加器ACx;两个操作数相乘,结果舍入后放入累加器ACy:ACx = ACx – (Xmem * Cmem) AMAR Xmem ::MPY[R][40] [uns(]Ymem[)], 在一个指令周期内同时完成下列算术运算: 修改操作数的值;两个操作数的乘法运算: mar(Xmem) :: ACx = Ymem * Cmem MAC[R][40] [uns(]Xmem[)], ::MAC[R][40] [uns(]Ymem[)], 在一个指令周期内同时完成下列算术运算:累加器和两个操作数的乘积相加:ACx = ACx + (Xmem * Cmem):: ACy = ACy + (Ymem * Cmem)
助记符指令 说 明 MAS[R][40] [uns(]Xmem[)], [uns(]Cmem[)],ACx ::MAC[R][40] [uns(]Ymem[)], [uns(]Cmem[)],ACy 在一个指令周期内同时完成下列算术运算: 累加器和两个操作数的乘积相减; 累加器和两个操作数的乘积相加: ACx = ACx – (Xmem * Cmem) :: ACy = ACy + (Ymem * Cmem) AMAR Xmem 在一个指令周期内同时完成下列算术运算: 修改操作数的值; 累加器和两个操作数的乘积相加: mar(Xmem):: ACx = ACx + (Ymem * Cmem) ::MAS[R][40] [uns(]Ymem[)], [uns(]Cmem[)]ACy 一个指令周期内同时下列算术运算: 累加器和两操作数的乘积相减: ACx = ACx – (Xmem * Cmem) :: ACy = ACy – (Ymem * Cmem) AMAR Xmem ::MAS[R][40] [uns(]Ymem[)], 在一个指令周期内同时完成下列算术运算:修改操作数的值;累加器和两个操作数的乘积相减: mar(Xmem):: ACx = ACx – (Ymem * Cmem) MAC[R][40] [uns(]Xmem[)], [uns(]Cmem[)],ACx>>#16 一个指令周期内同时完成下列算术运算: 累加器右移16位后和两操作数的乘积相加; 累加器和两操作数的乘积相加: ACx=(ACx >>#16)+(Xmem*Cmem) MPY[R][40] [uns(]Xmem[)], [uns(]Cmem[)],ACy>>#16 一个指令周期内同时完成下列算术运算: 两个操作数相乘, 累加器右移16位后和两个操作数的乘积相加: ACx = Xmem * Cmem :: ACy = (ACy >> #16) + (Ymem * Cmem)
影响指令执行的状态位: FRCT, SMUL, M40, RDM, SATD 执行指令后会受影响的状态位: ACOVx, ACOVy 助记符指令 说 明 MAC[R][40] [uns(]Xmem[)], [uns(]Cmem[)],ACx>>#16 ::MAC[R][40] [uns(]Ymem[)], [uns(]Cmem[)],ACy>>#16 在一个指令周期内同时完成下列算术运算:累加器右移16位后和两个操作数的乘积相加: ACx = (ACx >> #16) + (Xmem * Cmem) :: ACy = (ACy >> #16) + (Ymem * Cmem) MAS[R][40] [uns(]Xmem[)], [uns(]Cmem[)],ACx ::MAC[R][40] [uns(]Ymem[)], 一个指令周期内同时完成下列算术运算: 累加器和两操作数的乘积相减; 累加器右移16位后和两操作数的乘积相加: ACx=ACx– (Xmem*Cmem) AMAR Xmem [uns (]Cmem[)],ACx>>#16 一个指令周期内同时完成下列算术运算: 修改操作数的值; 累加器右移16位后和两个操作数的乘积相加: mar (Xmem) :: ACx = (ACx >> #16) + (Ymem * Cmem) AMAR Xmem, Ymem, Cmem 在一个指令周期内并行完成3次下列算术运算:修改操作数的值 影响指令执行的状态位: FRCT, SMUL, M40, RDM, SATD 执行指令后会受影响的状态位: ACOVx, ACOVy
例4-25,乘减指令举例。 MASR40 uns(*AR0), uns(*CDP), AC0 ::MACR40 uns(AR1), uns(*CDP), AC1 ;AC0=AC0-uns(*AR0)*uns(*CDP) ;AC1=AC1+uns(*AR1)*uns(*CDP) 3400h*A067h=2094 EC00, EF00h*A067h=95C0 2900
9.双16位算术指令(10条) 助记符指令 说 明 ADDSUB Tx,Smem,ACx 说 明 ADDSUB Tx,Smem,ACx 在ACx的高16位保存操作数Smem和Tx的内容相加结果;在ACx的低16位保存操作数Smem和Tx的内容相减结果: HI(ACx) = Smem + Tx :: LO(ACx) = Smem – Tx ADDSUB Tx,dual(Lmem),ACx 在ACx高16位保存32位操作数高16位和Tx内容相加结果; 在ACx低16位保存32位操作数低16位和Tx内容相减结果: HI(ACx)=HI(Lmem)+Tx :: LO(ACx)=LO(Lmem) –Tx SUBADD Tx,Smem,ACx 在ACx的高16位保存操作数Smem和Tx的内容相减结果;在ACx的低16位保存操作数Smem和Tx的内容相加结果: HI(ACx) = Smem – Tx :: LO(ACx) = Smem + Tx SUBADD Tx,dual(Lmem),ACx 在ACx高16位保存32位操作数高16位和Tx内容相减结果;在ACx低16位保存32位操作数高16位和Tx内容相加结果: HI(ACx) = HI(Lmem) – Tx :: LO(ACx) = LO(Lmem) + Tx ADD dual(Lmem),[ACx,]ACy 在ACy高16位保存32位操作数和ACx高16位的相加结果; 在ACy低16位保存32位操作数和ACx低16位的相加结果: HI(ACy) = HI(Lmem) + HI(ACx) :: LO(ACy) = LO(Lmem) + LO(ACx) ADD dual(Lmem),Tx,ACx 在ACx高16位保存32位操作数高16位和Tx内容相加结果;在ACx低16位保存32位操作数低16位和Tx内容相加结果: HI(ACx) = HI(Lmem) + Tx :: LO(ACx) = LO(Lmem) + Tx SUB dual(Lmem),[ACx,] ACy 在ACy高16位保存ACx和32位操作数高16位的相减结果;在ACy低16位保存ACx和32位操作数低16位的相减结果: HI(ACy) = HI(ACx) – HI(Lmem) :: LO(ACy) = LO(ACx) – LO(Lmem)
影响指令执行的状态位: C54CM, SATD, SXMD 执行指令后会受影响的状态位: ACOVx, ACOVy, CARRY 助记符指令 说 明 SUB ACx,dual(Lmem),ACy 在ACy高16位保存累加器32位操作数和ACx高16位的相减结果; 在ACy低16位保存累加器32位操作数和ACx低16位的相减结果: HI(ACy) = HI(Lmem) – HI(ACx) :: LO(ACy) = LO(Lmem) – LO(ACx) SUB dual(Lmem),Tx,ACx 在ACx高16位保存Tx内容和32位操作数高16位相减结果; 在ACx低16位保存Tx内容和32位操作数低16位相减结果: HI(ACx) = Tx – HI(Lmem) :: LO(ACx) = Tx – LO(Lmem) SUB Tx,dual(Lmem), ACx 在ACx高16位保存Tx内容和32位操作数高16位相减结果; 在ACx低16位保存Tx内容和32位操作数低16位相减结果: HI(ACx) = HI(Lmem) – Tx :: LO(ACx) = LO(Lmem) – Tx 影响指令执行的状态位: C54CM, SATD, SXMD 执行指令后会受影响的状态位: ACOVx, ACOVy, CARRY
ADDSUB T1, *AR1, AC1 ;AC1(39-16)=(*AR1)+T1 ‖AC1(15-0)=(*AR1)-T1 例4-26, 双16位算术指令举例。 ADDSUB T1, *AR1, AC1 ;AC1(39-16)=(*AR1)+T1 ‖AC1(15-0)=(*AR1)-T1 E300h + 4000h 00 2300h E300h - 4000h A300h FF 1 区别结果 11 不影响执行 检测31,15位,本例无影响 CARRY只检测31位
高低位两个算式分别在31位和15位进行溢出检测, 若SATD =1, 将进行溢出处理, 若是正值溢出, 溢出值ACw(39-16)=7FFFFFh或ACw(15-0)=7FFFh;若是负值溢出, 溢出值ACw(39-16)=FF 8000h或ACw(15-0)=8000h ; 都是16位的运算 助记符指令 说 明 MAXDIFF ACx, ACy, ACz,ACw TRNx=TRNx>>#1 ACw(39-16)=ACy(39-16)-ACx(39-16) ACw(15-0)=ACy(15-0)-ACx(15-0) if(ACx(31-16)>ACy(31-16)) {bit(TRN0,15)=#0;ACz(39-16)=ACx(39-16)} else {bit(TRN0,15)=#1;ACz(39-16)=ACy(39-16)} if (ACx(15-0)>ACy(15-0)) {bit(TRN1,15)=#0;ACz(15-0)=ACx(15-0)} else {bit(TRN1,15)=#1;ACz(15-0)=ACy(15-0)} DMAXDIFF ACx,ACy, ACz, ACw, TRNx If M40=0: TRNx=TRNx>>#1 ACw(39-0)=ACy(39-0)-ACx(39-0) if (ACx(31-0)>ACy(31-0)) {bit (TRNx,15)=#0;ACz(39-0)=ACx(39-0)} else {bit (TRNx,15)=#1;ACz(39-0)=ACy(39-0)} If M40=1: TRNx=TRNx>>#1 if (ACx(39-0)>ACy(39-0)) {bit(TRNx,15)=#0;ACz(39-0)=ACx(39-0)} else {bit(TRNx,15)=#1;ACz(39-0)=ACy(39-0)} 10比较和选择极值指令 (4条)
执行指令后会受影响的状态位: ACOVw,CARRY 助记符指令 说 明 MINDIFF ACx,ACy,ACz,ACw TRNx=TRNx>>#1 ACw(39-16)=ACy(39-16)-ACx(39-16) ACw(15-0)=ACy(15-0)-ACx(15-0) if (ACx(31-16)<ACy(31-16)) {bit(TRN0,15)=#0;ACz(39-16)=ACx(39-16)} else {bit(TRN0,15)=#1;ACz(39-16)=ACy(39-16)} if (ACx(15-0)<ACy(15-0)) {bit(TRN1,15)=#0;ACz(15-0)=ACx(15-0)} else {bit(TRN1,15)=#1;ACz(15-0)=ACy(15-0)} DMINDIFF ACx, ACy, ACz, ACw, TRNx If M40=0: TRNx=TRNx>>#1 ACw(39-0)=ACy(39-0)-ACx(39-0) if (ACx(31-0)<ACy(31-0)) {bit (TRNx,15)=#0;ACz(39-0)=ACx(39-0)} else {bit (TRNx,15)=#1;ACz(39-0)=ACy(39-0)} If M40=1 TRNx=TRNx>>#1 if(ACx(39-0)<ACy(39-0)) {bit(TRNx,15)=#0;ACz(39-0)=ACx(39-0)} else {bit(TRNx,15)=#1;ACz(39-0)=ACy(39-0)} 影响指令执行的状态位: C54CM,SATD 执行指令后会受影响的状态位: ACOVw,CARRY
例4-27 比较和选择极值指令举例。 MAXDIFF AC0, AC1, AC2, AC1 ;TRNx=TRNx>>#1 AC1(39-16)=AC1(39-16)-AC0(39-16), AC1(15-0)=AC1(15-0)-AC0(15-0) 高低位的运算都是16位运算(高16位运算也是,只不过扩展保护位), 因SATD=1, 将进行溢出处理; 高位运算发生负值溢出(负数900000减正数10 2400应该是负数, 但结果是正数8FDC00), 溢出处理的值AC1(39-16)=FF 8000h; AC2存最大值 最大值都在AC0 TRN0(15)=0 高16位 向右移1位 TRN1(15)=0 低16位 减法在31位有借位, 则进位位清0
11.最大/最小值指令(2条) 指令:MAX [src,]dst ;dst=max(src, dst) MIN [src,]dst ; dst=min(src, dst) 影响指令执行的状态位: C54CM, M40, SXMD。 执行指令后会受影响的状态位: CARRY If M40=0, step1: if (src(31–0) > dst(31–0)) step2: { CARRY = 0; dst(39–0) = src(39–0) } else step3: CARRY = 1 If M40 = 1, step1: if (src(39–0) > dst(39–0))
MAX AC2, AC1 ;由于(AC2)<(AC1), ;所以AC1保持不变且CARRY状态位置1 例4-28,最大/最小值指令举例。 MAX AC2, AC1 ;由于(AC2)<(AC1), ;所以AC1保持不变且CARRY状态位置1
12.存储器比较指令(1条) 指令 CMP Smem==K16, TCx ;If Smem==K16 then TCx =1 ;else TCx=0 状态位 没有影响指令执行的状态位 执行指令后会受影响的状态位:TCx
例4-29,存储器比较指令举例。 CMP *AR1+==#400h,TC1
13.寄存器比较指令(5条) RELOP Relational operators: == equal to < less than >= greater than or equal to != not equal to 13.寄存器比较指令(5条) 助记符指令 说 明 CMP[U] src RELOP dst, TCx If src RELOP dst then TCx=1 else TCx=0 CMPAND[U] src RELOP dst, TCy, TCx TCx=TCx AND TCy CMPAND[U] src RELOP dst,!TCy, TCx TCx=TCx AND !TCy CMPOR[U] src RELOP dst, TCy, TCx TCx=TCx OR TCy CMPOR[U] src RELOP dst, !TCy, TCx TCx=TCx OR !TCy 影响指令执行的状态位:C54CM,M40,TCy 执行指令后会受影响的状态位:TCx M40决定累加器间比较的长度(32or40位), C54CM = 1时就M40= 1
CMP AC1==T1, TC1 ; 由于AC1(15-0)=T1,所以将TC1置1 例4-30,寄存器比较指令举例。 CMP AC1==T1, TC1 ; 由于AC1(15-0)=T1,所以将TC1置1
14.条件移位指令(1条) 指令 SFTCC ACx,TCx ; If ACx(39-0)=0 then TCx=1 ;有两个符号位时移位 ; then ACx =ACx(31-0)<<#1 and TCx=0 ; else TCx=1 状态位 没有影响指令执行的状态位 执行指令后会受影响的状态位:TCx ;有两个符号位时移位 ;实际 ACx(39-0)<<#1
例4-31,条件移位指令举例。 SFTCC AC0,TC1 AC0(31) XOR AC0(30) =1, AC0 no shift, TC1= 1 SFTCC AC0,TC2 AC0(31) XOR AC0(30) =0, AC0 shift left by 1 bit, TC2= 0
15.带符号移位指令(6条) 助记符指令 说明 SFTS dst, #-1 寄存器内容右移1位 SFTS dst, #1 寄存器内容左移1位 SFTS ACx,Tx[,ACy] 累加器的内容根据Tx的内容左移 SFTSC ACx,Tx[,ACy] 累加器的内容根据Tx的内容左移,移出位更新进位标识 SFTS ACx,#SHIFTW[,ACy] 累加器的内容左移 SFTSC ACx,#SHIFTW[,ACy] 累加器内容左移, 移出位更新进位位 影响指令执行的状态位: C54CM, M40, SATA, SATD, SXMD 执行指令后会受到影响的状态位: ACOVx, ACOVy, CARRY
例4-32,带符号移位指令举例。 SFTS T2,#1 ;T2=T2<<#1 移位时, 没有发生溢出, 不需进行溢出处理。
16.修改辅助寄存器指令(8条) 助记符指令 说 明 AADD TAx, TAy 两辅助寄存器或临时寄存器相加:TAy=TAy+TAx 说 明 AADD TAx, TAy 两辅助寄存器或临时寄存器相加:TAy=TAy+TAx ASUB TAx,TAy 两辅助寄存器或临时寄存器相减:TAy=TAy–TAx AMOV TAx, TAy 用辅助寄存器或临时寄存器的内容给辅助寄存器或临时寄存器赋值 AADD K8,TAx 辅助寄存器或临时寄存器和8位带符号立即数相加:TAx = TAx + K8 ASUB K8,TAx 辅助寄存器或临时寄存器和8位带符号立即数相减:TAx = TAx – K8 AMOV P8,TAx 程序地址标号P8定义的地址给辅助寄存器或临时寄存器赋值 AMOV D16,TAx 用16位绝对数据地址D16给辅助寄存器或临时寄存器赋值 AMAR Smem 修改Smem 影响指令执行的状态位: ST2_55 (ARnLC) 执行指令后没有受影响的状态位
例4-33,修改辅助寄存器指令举例。 AMOV #255,AR0 ;AR0=255 AMAR *AR3+ ;AR3=AR3+1
17.修改堆栈指针指令(1条) 指令 AADD K8, SP ;SP=SP+K8 状态位 没有影响指令执行的状态位。 执行指令后没有受影响的状态位。 例4-34,修改堆栈指针指令举例。 AADD #127,SP ;SP=SP+127
18. 隐含并行指令(8条) 助记符指令 说 明 MPYM[R] [T3=] Xmem,Tx,ACy 说 明 MPYM[R] [T3=] Xmem,Tx,ACy ::MOV HI(ACx<<T2),Ymem 并行执行以下运算:Tx内容和Xmem相乘, 结果舍入后放入ACy; ACx左移后高16位赋给Ymem:ACy = Tx * Xmem:: Ymem = HI(ACx << T2) MACM[R] [T3=] Xmem,Tx,ACy 并行运算: Tx内容和操作数Xmem相乘, 再和ACy相加, 结果舍入后放入ACy; ACx左移后高16位赋值给Ymem: ACy = ACy + (Tx * Xmem) :: Ymem = HI(ACx << T2) MASM[R] [T3=] Xmem,Tx,ACy 并行运算: Tx内容和Xmem相乘, 再作为被减数和ACy相减, 结果舍入后放入ACy; ACx左移后高16位赋给Ymem: ACy = ACy – (Tx * Xmem) ADD Xmem<<#16,ACx,ACy 并行运算: Xmem左移16位, 再和ACx相加, 结果放入ACy; ACy左移后高16位赋值给Ymem: ACy = ACx + (Xmem << #16) :: Ymem = HI(ACy << T2) SUB Xmem<<#16,ACx,ACy 并行运算:Xmem左移16位, 再减去ACx, 结果放入ACy; ACy左移后高16位赋值给Ymem: ACy = (Xmem << #16) – ACx
影响指令执行的状态位: FRCT, SMUL, C54CM, M40, RDM, SATD, SXMD。 助记符指令 说 明 MOV Xmem<<#16, ACy ::MOV HI(ACx<<T2),Ymem 并行运算: Xmem左移16位, 结果放入ACy; ACx左移后高16位赋值给Ymem: ACy = Xmem << #16:: Ymem = HI(ACx << T2) MACM[R][T3=] Xmem,Tx,ACx ::MOV Ymem<<#16,ACy 并行运算: Tx内容和Xmem相乘, 再和ACx相加, 结果舍入后放入ACx; Ymem左移16位后, 结果放入ACy: ACx = ACx + (Tx * Xmem) :: ACy = Ymem << #16 MASM[R][T3=] Xmem,Tx,ACx 并行运算: Tx内容和Xmem相乘, 再作为被减数和ACx相减, 结果舍入后放入ACx; Ymem左移16位后, 结果放入ACy: ACx = ACx – (Tx * Xmem) 影响指令执行的状态位: FRCT, SMUL, C54CM, M40, RDM, SATD, SXMD。 执行指令后会受影响的状态位: ACOVx,ACOVy,CARRY
::MOV HI(AC0<<T2),*AR1+ 例4-35:隐含并行指令举例。 MPYMR *AR0+,T0, AC1 ::MOV HI(AC0<<T2),*AR1+ 例4-35:隐含并行指令举例。 ;AC1=(*AR0)*T0, 因FRCT=1,左移1, AC1=rnd(AC1*2) ;AC0=AC0<<T2, (*AR1)=AC0(31-16), ;AR1=AR1+1, AR0=AR0+1
19.绝对距离指令(1条) 指令: 绝对距离指令以并行方式完成两个操作, 一个在 D单元的MAC中, 另一个在D单元的ALU中 ABDST Xmem, Ymem, ACx, ACy ;ACy=ACy+|HI(ACx)| ;ACx=(Xmem<<#16)-(Ymem<<#16) 状态位 影响指令执行的状态位: FRCT,C54CM,M40,SATD, SXMD 执行指令后会受影响的状态位: ACOVx,ACOVy,CARRY
;AC0=(*AR0)<<#16-(*AR1)<<#16, AR0=AR0+1 例4-36, 绝对距离指令举例。 ABDST *AR0+,*AR1,AC0,AC1 ;AC1=AC1+|hi(AC0)|, ;AC0=(*AR0)<<#16-(*AR1)<<#16, AR0=AR0+1 减法有借位时进位位为0
20.绝对值指令(1条) 指令 ABS [src,] dst ;dst= |src| 状态位 影响指令执行的状态位 C54CM,M40,SATA,SATD,SXMD 执行指令后会受影响的状态位 ACOVx,CARRY 若结果是0,则CARRY=1, 否则CARRY=0.
例4-37,绝对值指令举例。 ABS AR1, AC1 ;AC1=|AR1| 当绝对值为0时, 进位位为1, 否则为0.
21.FIR滤波指令(2条) 指令: FIR滤波指令在一个周期内完成两个并行的操作,能够完成对称或反对称FIR滤波计算。 FIRSADD Xmem,Ymem,Cmem,ACx,ACy ;ACy=ACy+(ACx(32-16)*Cmem) ;ACx=(Xmem<<#16)+(Ymem<<#16) FIRSSUB Xmem,Ymem,Cmem,ACx.ACy ;ACx=(Xmem<<#16) - (Ymem<<#16) 状态位: 影响指令执行的状态位: FRCT,SMUL,C54CM,M40,SATD,SXMD 执行指令会受影响的状态位: ACOVx,ACVOy,CARRY
FIRSADD *AR0,*AR1,*CDP,AC0,AC1 ;AC1=AC1+AC0(32-16)*(*CDP) ;AC0=(*AR0)<<#16+(*AR1)<<#16 A067是负数-5F99h; -5F99h*6900h=-2735C100h, 写成补码FF D8CA 3F00 AC0 00 6900 0000 00 2300 0000 AC1 00 0023 0000 FF D8ED 3F00 *AR0 3400 *AR1 EF00 *CDP A067 ACOV0 ACOV1 CARRY 1 FRCT SXMD 0 1 若SXMD=0,不符号扩展,则AC0=01 2300 0000, CARRY=0(M40=1)
22.最小均方(LMS)指令(1条) 指令 LMS Xmem, Ymem, ACx, ACy ; ACy=ACy+(Xmem * Ymem) ; :: ACx=rnd(ACx+(Xmem<<#16)) 状态位 影响指令执行的状态位: FRCT, SMUL, C54CM, M40, RDM, SATD, SXMD 执行指令后会受影响的状态位:ACOVx, ACOVy, CARRY
例4-39,最小均方(LMS)指令举例。 LMS. AR0,. AR1,AC0,AC1. ; AC1=AC1+(. AR0). ( 例4-39,最小均方(LMS)指令举例。 LMS *AR0,*AR1,AC0,AC1 ; AC1=AC1+(*AR0)*(*AR1) ;::AC0=rnd(AC0+((*AR0)<<#16))
23.补码指令(1条) 指令 NEG [src,] dst ;求src的2补码后送dst 状态位 影响指令执行的状态位 M40,SATA,SATD,SXMD。 执行指令后会受影响的状态位 ACOVx,CARRY. 例4-40,补码指令举例。 NEG AC1,AC0 ;求AC1的2补码后送AC0
24.归一化指令(2条) 指令 MANT ACx,ACy ::NEXP ACx,Tx ;ACy=mant(ACx),Tx=-exp(ACx) 状态位 没有影响指令执行的状态位 执行指令后没有受影响的状态位
例4-41,归一化指令举例 MANT AC0,AC1 ;AC1等于AC0的尾数,即将AC0右移与32位带符号数 ;对齐后的值 ::NEXP AC0,T1 ;T1等于将AC0的MSB左移与32位带符号对齐所移位 ;的次数值。
25.饱和和舍入指令(2条) 指令 SAT[R] [ACx,] ACy ;ACy =saturate(rnd(ACx)), 按32位数饱和处理 ROUND [ACx,] ACy ;ACy=rnd(ACx) 状态位 影响指令执行的状态位:C54CM ,M40,RDM,SATD 执行指令后会受影响的状态位 ACOVy RDM=0时,8000h=< bit(15–0), 进位; RDM=1时: if( 8000h < bit(15–0) < 10000h) add 8000h to the 40-bit source accumulator ACx else if( bit(15–0) == 8000h) if( bit(16) == 1)
例4-42,饱和和舍入指令举例。 ROUND AC0,AC1 ;AC1=AC0+8000h,且16个最低有效位清0
SAT AC0,AC1 ;将32位的AC0饱和, ;将饱和后的值FF 8000 0000装入AC1。 ;按32位数饱和处理
26.平方差指令(1条) 指令 SQDST Xmem,Ymem,ACx, ACy ;ACy=ACy+(ACx(32-16)*ACx(32-16)) ;ACx=(Xmem<<#16)-(Ymem<<#16) 状态位 影响指令执行的状态位 FRCT,SMUL,C54CM,M40,SATD,SXMD 执行指令后会受影响的状态位 ACOVx,ACVOy,CARRY
例4-43,平方差指令举例。 SQDST. AR0,. AR1,AC0,AC1 ;AC1=AC1+AC0(32-16) 例4-43,平方差指令举例。 SQDST *AR0,*AR1,AC0,AC1 ;AC1=AC1+AC0(32-16)*AC0(32-16) ;AC0=(*AR0)<<16-(*AR1)<<16 -00 5433 0000 1BB1
4.2.2 位操作指令(20条) 位域比较指令(1条) 位域扩展和抽取指令(2条) 存储器位操作指令(8条) 寄存器位操作指令(5条) 状态位设置指令(4条)
1.位域比较指令(1条) 指令 BAND Smem,k16,TCx ;If (((Smem)AND k16)==0),TCx=0 ;else TCx=1 状态位 没有影响指令执行的状态位 执行指令后会受影响的状态位:TCx
例4-44,位域比较指令举例。 BAND *AR3,#00A0h,TC2 ;If (((*AR3)AND#00A0h)==0),TCx=0 ;else TCx=1 ;由于(*AR3) AND k16==0,TC2=0
2.位域扩展和抽取指令(2条) 位域抽取:BFXTR k16, ACx, dst Extract Accumulator Bit Field 位域抽取:BFXTR k16, ACx, dst ;从LSB到MSB将k16中非零位对应的ACx 中的位抽取出 来 ; 组装成最低位LSBs, 依次放到dst的LSBs中。 例4-45: BFXTR #8024h,AC0,T2 ;从LSB到MSB将(8024h)中非零位对应AC0中的位抽出, ;组成LSBs, 依次放到T2的LSBs中 #8024h: 1000 0000 0010 0100 AC0(15–0): 0101 0101 1010 1010 T2 : 0000 0000 0000 0010 没有影响指令执行的状态位 执行指令后没有受影响的状态位
;将ACx的LSBs放到k16中非零位对应的dst 中的位置上, ; ACx的LSBs个数等于k16中1的个数 2.位域扩展和抽取指令 Expand Accumulator Bit Field 位域扩展: BFXPA k16,ACx,dst ;将ACx的LSBs放到k16中非零位对应的dst 中的位置上, ; ACx的LSBs个数等于k16中1的个数 例4-46: BFXPA #8024h,AC0,T2 ;将AC0的LSBs放到#8024h中非零位对应的T2的位置上, ;AC0的LSBs个数等于#8024h中1的个数。 #8024h: 1000 0000 0010 0100 AC0(15–0): 0010 1011 0110 0101 T2 : 1000 0000 0000 0100 没有影响指令执行的状态位 执行指令后没有受影响的状态位
3.存储器位操作指令(8条) 没有影响指令执行的状态位 执行指令后会受到影响的状态位:TCx 助记符指令 说 明 说 明 BTST src, Smem, TCx 以src的4个LSB为位地址,测试Smem对应位 BNOT src, Smem 以src的4个LSB为位地址,取反Smem对应位 BCLR src, Smem 以src的4个LSB为位地址,清零Smem对应位 BSET src,Smem 以src的4个LSB为位地址,置位Smem对应位 BTSTSET k4,Smem,TCx 以k4为位地址, 测试并置位Smem的对应位 BTSTCLR k4,Smem,TCx 以k4为位地址, 测试并清零Smem的对应位 BTSTNOT k4,Smem,TCx 以k4为位地址, 测试并取反Smem的对应位 BTST k4,Smem,TCx 以k4为位地址, 测试Smem的对应位 没有影响指令执行的状态位 执行指令后会受到影响的状态位:TCx
例4-47,存储器位操作指令举例。 (1)BTST AC0,*AR0,TC1 ;位地址AC0(3-0)=8,测试(*AR0)的位8, 结果存入TC1 (2)BTSTNOT #12,*AR0,TC1 ;测试(*AR0)的位12,结果存入TC1,并将(*AR0)位12取反
4.寄存器位操作指令(5条) 助记符指令 说 明 BTST Baddr, src, TCx 说 明 BTST Baddr, src, TCx 以Baddr为位地址,测试src的对应位,并复制到TCx中 BNOT Baddr, src 以Baddr为位地址,取反src的对应位 BCLR Baddr, src 以Baddr为位地址,清零src的对应位 BSET Baddr, src 以Baddr为位地址,置位src的对应位 BTSTP Baddr, src 以Baddr和Baddr+1为位地址,测试src的两个位,分别复制到TC1和TC2中。 没有影响指令执行的状态位 执行指令后会受影响的状态位:TCx
例4-48,寄存器位操作指令举例。 (1)BTST #12, T0, TC1 ;测试T0的位12,将结果存入TC1 (2) BNOT AR1, T0 ;将T0中由AR1确定的位12取反
5.状态位设置指令(4条) 助记符指令 说 明 BCLR k4, STx_55 以k4为位地址, 清零STx_55的对应位 说 明 BCLR k4, STx_55 以k4为位地址, 清零STx_55的对应位 BSET k4,STx_55 以k4为位地址, 置位STx_55的对应位 BCLR f-name 按f-name(状态标志名)寻址, 清零STx_55的对应位 BSET f-name 按f-name(状态标志名)寻址, 置位STx_55的对应位 没有影响指令执行的状态位 执行指令后会受影响的状态位: 已经选择的状态位
例4-49,状态位设置指令举例。 (1)BCLR #1,ST2_55 ;将ST2_55的位1清零 (2)BSET #11,ST0_55 ;将ST0_55的位11置位
4.2.3 扩展辅助寄存器操作指令(7条) 助记符指令 说 明 MOV xsrc,xdst 说 明 MOV xsrc,xdst 当xdst为累加器, xsrc为23位时:xdst(31~23)=0, xdst(22~0)=xsrc; 当xdst为23位时, xsrc为累加器时: xdst=xsrc(22~0) AMAR Smem,XAdst 把操作数Smem的地址载入寄存器XAdst AMOV k23,XAdst 把23位无符号立即数载入XAdst: XAdst = k23 MOV dbl(Lmem),XAdst XAdst=Lmem(22~0) 把32位操作数的低23位载入寄存器XAdst MOV XAsrc,dbl(Lmem) Lmem(22~0)=XAsrc, Lmem(31~23)=0; 把23位XAsrc内容载入32位操作数低23位,其他位清0. POPBOTH xdst xdst(15~0)=(SP), xdst(31~16)=(SSP);当xdst为23位时, 取SSP的低7位:xdst(22~16)=(SSP)(6~0) PSHBOTH xsrc (SP)=xsrc(15~0), (SSP)=xsrc(31~16);当xsrc为23位时, (SSP)(6~0)=xsrc(22~16), (SSP)(15~7)=0 AMAR *AR1, XAR0 ; XAR0=XAR1. 影响指令执行的状态位: ST2_55 执行指令后没有受影响的状态位。 AMAR *(101234h), XAR0 ; XAR0= 101234h.
MOV dbl(*AR3),XAR1 ;将(*AR3)低7位和(*AR3+1)的16位装入XAR1 例4-50 扩展辅助寄存器举例。 MOV dbl(*AR3),XAR1 ;将(*AR3)低7位和(*AR3+1)的16位装入XAR1 ;XAR1=Lmem(22~0) 1 低7位 16位 组成23位
4.2.4 逻辑运算指令(32条) 按位与/或/异或/取反指令(25条) 位计数指令(1条) 逻辑移位指令(4条) 循环移位指令(2条)
1. 按位与/或/异或/取反指令(25条) AND/OR/XOR各8条 助记符指令 说 明 NOT [src,]dst 寄存器按位取反 说 明 NOT [src,]dst 寄存器按位取反 AND/OR/XOR src,dst 两个寄存器按位与/或/异或 AND/OR/XOR k8,src,dst 8位无符号数和寄存器按拉与/或/异或 AND/OR/XOR k16,src dst 16位无符号数和寄存器按拉与/或/异或 AND/OR/XOR Smem,src,dst 操作数Smem和寄存器按位与/或/异或 AND/OR/XOR ACx<<#SHIFTW [,ACy] 累加器ACx移位后和累加器ACy按位与/或/异或 AND/OR/XOR k16<<#16,[ACx,]ACy 16位无符号立即数左移16位后和累加器ACx按位与/或/异或 AND/OR/XOR k16<<#SHFT,[ACx,]ACy 16位无符号立即数移位后和累加器ACx按位与/或/异或 AND/OR/XOR k16,Smem 16位无符号立即数和操作数Smem按位与/或/异或 影响指令执行的状态位:C54CM,M40 执行指令后没有受影响的状态位
例4-51、按位与/或/异或/取反指令举例。 (1) NOT AC0,AC1 ;将AC0的内容取反,结果存入AC1 (2)AND AC0,AC1 ;将AC1与AC0各位相与,结果存入AC1
2.位计数指令(1条) 指令 BCNT ACx,ACy,TCx,Tx ;Tx=(ACx AND ACy)中1的个数 ;若Tx为奇数, 则TCx=1,反之TCx=0 状态位 没有影响指令执行的状态位 执行指令后会受影响的状态位:TCx
例4-52、位计数指令举例。 BCNT AC1,AC2,TC1,T1 ;T1=(AC1与AC2)中1的个数, ;个数是奇数,TC1=1
3. 逻辑移位指令(4条) 助记符指令 说 明 SFTL dst,#1 dst=dst<<#1, CARRY=移出的位 说 明 SFTL dst,#1 dst=dst<<#1, CARRY=移出的位 SFTL dst,#-1 dst=dst>>#1, CARRY=移出的位 SFTL ACx,Tx[,ACy] ACy=ACx<<Tx; 若Tx超出了-32~31的范围, 则Tx被饱和为-32或31, CARRY=移出的位 SFTL ACx, #SHIFTW [,ACy] ACy=ACx<<#SHIFTW,#SHIFTW是6位值,CARRY=移出的位 影响指令执行的状态位:C54CM,M40 执行指令后受影响的状态位:CARRY M40=0, 从位31提取CARRY, 位(39~32)清零; M40=1, 从位39提取CARRY, 位(39~0)整体移位;
例4-53、逻辑移位指令举例。 (1)SFTL AC1, #1 ;AC1=AC1<<#1, ;由于M40=0,CARRY=位31,且位(39~32)清零 M40=1时不清0, 整体移位 (2)SFTL AC0, T0, AC1 ;AC1=AC0<<-6,因M40=0, AC0位(39~32)先清0再移位
4.循环移位指令(2条) 指令 ROL BitOut,src,BitIn,dst ;将BitIn移进src的LSB, ;src被移出的位存放于BitOut,结果放到dst中 ROR BitIn,src,BitOut,dst ;将BitIn移进src的MSB, 状态位 影响指令执行的状态位:CARRY,M40,TC2 执行指令后会受影响的状态位:CARRY,TC2 TC2, CARRY 可作BitIn或BitOut M40=0,将AC0(39~32)清零。
例4-54、循环移位指令举例。 ROL CARRY,AC1,TC2,AC1 ;将TC2移入AC1的LSB, ;将AC1中位31移出放入CARRY, ;由于M40=0,将AC0(39~32)清零。
4.2.5 移动指令(141条) 累加器、辅助寄存器或临时寄存器装载、存储、移动和交换指令(51条) 存储单元间的移动及初始化指令(9条) 入栈和出栈指令(12条) CPU寄存器装载、存储和移动指令(69条)
1. 累加器、辅助(或临时)寄存器装载、存储、移动和交换指令 (51条) 助记符指令 说 明 MOV k4,dst 加载4位无符号数到目的寄存器:dst=k4 MOV –k4,dst 4位无符号数取2补码后加载到:dst= – k4 MOV K16,dst 加载16位带符号立即数到目的寄存器: dst = K16 MOV Smem,dst 操作数加载到目的寄存器: dst=Smem MOV [uns(]high_byte(Smem)[)],dst 16位操作数的高位字节加载到目的寄存器:dst = high_byte(Smem) [uns(]low_byte(Smem)[)], dst 16位操作数的低位字节加载到目的寄存器:dst = low_byte(Smem) MOV K16<<#16,ACx ACx = K16 << #16 ACx = K16 << #SHFT MOV K16<<#SHFT,ACx MOV [rnd(]Smem<<Tx[)],ACx 16位操作数根据Tx的内容移位, 结果舍入后放入累加器:ACx=Smem<<Tx 取2补码后符号扩展到40位
助记符指令 说 明 MOV low_byte(Smem)<<#SHIFTW, ACx 16位操作数高低位字节移位后加载到累加器:ACx = low_byte(Smem) << #SHIFTW MOV high_byte(Smem)<<#SHIFTW, ACx 16位操作数低高位字节移位后加载到累加器:ACx = high_byte(Smem) << #SHIFTW MOV Smem<<#16,ACx 16位操作数左移16位后加载到累加器:ACx = Smem << #16 MOV [uns(]Smem[)],ACx 16位操作数加到ACx:ACx=Smem MOV [uns(]Smem[)]<<#SHIFTW,ACx 16位操作数移位后加载到累加器: ACx = Smem << #SHIFTW MOV[40] dbl(Lmem), ACx 32位操作数加载:ACx = dbl(Lmem) MOV Xmem, Ymem, ACx ACx(15-0)=Xmem, ACx(39-16)=Ymem LO(ACx)=Xmem::HI(ACx)=Ymem MOV dbl(Lmem),pair(HI(ACx)) ACx(31-16)=HI(Lmem) AC(x+1)(31-16)=LO(Lmem), x=0 or 2;pair(HI(ACx)) = Lmem MOV dbl(Lmem),pair(LO(ACx)) ACx(15-0)=HI(Lmem) AC(x+1)(15-0)=LO(Lmem), x=0 or 2;pair(LO(ACx)) = Lmem
助记符指令 说 明 MOV dbl(Lmem),pair(TAx) TAx=HI(Lmem), TA(x+1)=LO(Lmem), x=0 or 2; pair(TAx) = Lmem MOV src,Smem Smem=src(15-0) MOV src,high_byte(Smem) high_byte(Smem)=src(7-0) MOV src,low_byte(Smem) low_byte(Smem)=src(7-0) MOV HI(ACx),Smem Smem=ACx(31-16) MOV [rnd( ]HI(ACx)[ )], Smem Smem=[rnd]ACx(31-16) MOV ACx<<Tx,Smem Smem=(ACx<<Tx)(15-0) MOV [rnd(]HI(ACx<<Tx)[ )],Smem Smem=[rnd](ACx<<Tx)(31-16) MOV ACx<<#SHIFTW,Smem Smem=(ACx<<#SHIFTW)(15-0) MOV HI(ACx<<#SHIFTW),Smem Smem=(ACx<<#SHIFTW)(31-16) MOV [rnd(]HI(ACx<< #SHIFTW) [)],Smem Smem=[rnd](ACx<<#SHIFTW)(31-16) MOV [uns(][rnd(]HI[(saturate] (ACx)[)))],Smem Smem=[uns]([rnd](sat(ACx(31-16)))) MOV [uns(][rnd(]HI[(saturate] (ACx<<Tx)[)))],Smem ACx根据Tx内容移位,结果高16位存到Smem: Smem=HI(ACx<<Tx)
助记符指令 说 明 MOV [uns(][rnd(]HI[(saturate] (ACx<<#SHIFTW[)))],Smem 累加器ACx移位后, 结果高16位存到Smem: Smem=HI(ACx<<#SHIFTW) MOV ACx,dbl(Lmem) Lmem=ACx(31-0) MOV[uns(]saturate(ACx)[)], dbl(Lmem) Lmem=[uns](sat(ACx(31-0))) MOV ACx>>#1,dual(Lmem) ACx高16位右移一位后, 结果存到Lmem高16位(第31位根据SXMD进行符号扩展); ACx低16位右移一位后, 结果存到Lmem低16位(第15位根据SXMD进行符号扩展): HI(Lmem) = HI(ACx) >> #1 :: LO(Lmem) = LO(ACx) >> #1 MOV pair(HI(ACx)), dbl(Lmem) ACx高16位存到Lmem高16位; AC(x+1)高16位存到Lmem低16位: HI(Lmem)=ACx(31-16) LO(Lmem)=AC(x+1)(31-16),x=0 or 2 MOV pair(LO(ACx)), dbl(Lmem) ACx低16位存到Lmem高16位; AC(x+1)低16位存到Lmem低16位: HI(Lmem)=ACx(15-0) LO(Lmem)=AC(x+1)(15-0),x=0 or 2 MOV pair(TAx),dbl(Lmem) HI(Lmem)=TAx,LO(Lmem)=TA(x+1),x=0 or 2
ACx低16位存到Xmem; ACx高16位存到Ymem: Xmem = LO(ACx):: Ymem = HI(ACx) 助记符指令 说 明 MOV ACx,Xmem,Ymem ACx低16位存到Xmem; ACx高16位存到Ymem: Xmem = LO(ACx):: Ymem = HI(ACx) MOV src,dst 源寄存器的内容存到目的寄存器: dst = src MOV HI(ACx),TAx ACx的高16位移动到Tax: TAx=HI(ACx) MOV TAx, HI(ACx) TAx内容移动到ACx高16位:HI(ACx) = TAx SWAP ARx,Tx ARx<->Tx, 操作数(AR4,T0或AR5,T1或AR6,T2或AR7,T3) SWAP Tx,Ty Tx<->Ty,操作数为(T0,T2或T1,T3) SWAP ARx,ARy ARx<->ARy,操作数为(AR0, AR1或AR0,AR2或AR1,AR3) SWAP ACx,ACy ACx<->ACy, 操作数为(AC0, AC2或AC1, AC3) SWAPP ARx,Tx ARx<->Tx,AR(x+1)<->Tx(x+1),操作数为(AR4,T0或AR6,T2) SWAPP T0,T2 T0<->T2,T1<->T3 SWAPP AR0,AR2 AR0<->AR2,AR1<->AR3 SWAPP AC0,AC2 AC0<->AC2,AC1<->AC3 SWAP4 AR4,T0 AR4<->T0,AR5<->T1, AR6<->T2,AR7<->T3 AR4<->T0,AR5<->T1或AR6<->T2,AR7<->T3
影响指令执行的状态位: C54CM, M40, RDM, SATD, SXMD 执行指令后会受影响的状态位: ACOVx 例4-55、累加器、辅助寄存器或临时寄存器装载、存储、移动和交换指令举例。 (1)MOV AC0,*(#0E10h) ;将AC0(15-0)存入E10h单元
(2)MOV AC0,AC1 ;AC1=AC0,由于M40=0,在31位检测到溢出 ;将ACOV1置位
2.存储单元间的移动及初始化指令(9条) 没有影响指令执行的状态位 执行指令后没有受影响的状态位 助记符指令 说 明 DELAY Smem 说 明 DELAY Smem (Smem+1)=(Smem),将Smem内容复制到下一地址单元中, 原单元内容不变, 实现Z延迟。 MOV Cmem,Smem 将Cmem内容复制到Smem指示数据存储单元 MOV Smem,Cmem 将Smem内容复制到Cmem指示数据存储单元 MOV K8,Smem 将立即数加载到Smem指示的数据存储单元 MOV K16,Smem MOV Cmem,dbl(Lmem) HI(Lmem)=(Cmem), LO(Lmem)=(Cmem+1) MOV dbl(Lmem),Cmem (Cmem)=HI(Lmem), (Cmem+1)=LO(Lmem) MOV dbl(Xmem),dbl(Ymem) (Ymem)=(Xmem), (Ymem+1)=(Xmem+1) MOV Xmem,Ymem 将Xmem的内容复制到Ymem 没有影响指令执行的状态位 执行指令后没有受影响的状态位
例4-56、存储单元间的移动及初始化指令举例。 (1) DELAY *AR1+ ;*(AR1+1)=*(AR1), AR1=AR1+1 (2) MOV *CDP,*(#0500h) ;将(*CDP)存入0500h处
3. 入栈和出栈指令(12条) 助记符指令 说 明 POP dst1,dst2 dst1=(SP),dst2=(SP+1),SP=SP+2 说 明 POP dst1,dst2 dst1=(SP),dst2=(SP+1),SP=SP+2 POP dst dst=(SP),SP=SP+1,若dst为累加器,则dst(15-0)=(SP), dst(39-16)不变 POP dst,Smem dst=(SP), (Smem)=(SP+1), SP=SP+2 若dst为累加器,则dst(15-0)=(SP), dst(39-16)不变 POP dbl(ACx) ACx(31-16)=(SP), ACx(15-0)=(SP+1),SP=SP+2 POP Smem (Smem)=(SP),SP=SP+1 POP dbl(Lmem) HI(Lmem)=(SP),LO(Lmem)=(SP+1),SP=SP+2 PSH src1,src2 SP=SP-2, (SP)=src1, (SP+1)=src2; 若src1, src2为累加器, 则将src1(15-0), src2(15-0)压入堆栈 PSH src SP=SP-1,(SP)=src; 若src为累加器, 则取src(15-0) PSH src,Smem SP=SP-2, (SP)=src, (SP+1)=Smem; 若src为累加器, 则取src(15-0) PSH dbl(ACx) SP=SP-2,(SP)=ACx(31-16),(SP+1)=ACx(15-0) PSH Smem SP=SP-1,(SP)=Smem PSH dbl(Lmem) SP=SP-2,(SP)=HI(Lmem),( SP +1)=LO(Lmem)
例4-57、入栈和出栈指令举例。 (1)POP AC0, AC1 没有影响指令执行的状态位 执行指令后没有受影响的状态位 例4-57、入栈和出栈指令举例。 (1)POP AC0, AC1 ; AC0(15-0)=(SP), AC1(15-0)=(SP+1) ;(39-16)不变,SP=SP+2
(2)PSH AR0,AC1 ;SP=SP-2, (SP)=AR0, (SP+1)=AC1(15-0) 原来0300,以示区别
4. CPU寄存器装载、存储和移动指令(69条) BRC0,BRC1:块循环重复计数 器0和1; k12可产生3字节代码: 0001 011E kkkk kkkk kkkk 0100 0001 011E kkkk kkkk kkkk 0101 0001 011E kkkk kkkk kkkk 0110 0001 011E kkkk kkkk kkkk 1001 …… k16可产生7字节代码。 助记符指令 说 明 MOV k12,BK03 装载立即数到指定的CPU寄存器单元 MOV k12,BK47 MOV k12,BKC MOV k12,BRC0 MOV k12,BRC1 MOV k12,CSR MOV k7.DPH MOV k9,PDP MOV k16,BSA01 MOV k16,BSA23 MOV k16,BSA45 MOV k16,BSA67 MOV k16,BSAC MOV k16,CDP MOV k16,DP MOV k16,SP MOV k16,SSP BRC0,BRC1:块循环重复计数 器0和1; 任何装入BRC1的指令将相同 的值装入BRS1; BRS1: BRC1的保存寄存器, BRC0没有保存寄存器。
助记符指令 说 明 MOV Smem,BK03 把Smem指示的数据存储单元的内容装载到指定的CPU寄存器单元 MOV Smem,BK47 MOV Smem,BKC MOV Smem,BSA01 MOV Smem,BSA23 MOV Smem,BSA45 MOV Smem,BSA67 MOV Smem,BSAC MOV Smem,BRC0 MOV Smem,BRC1 MOV Smem,CDP MOV Smem,CSR MOV Smem,DP MOV Smem,DPH MOV Smem,PDP MOV Smem,SP MOV Smem,SSP MOV Smem,TRN0 MOV Smem,TRN1
助记符指令 说 明 MOV BK03,Smem 把指定的CPU寄存器单元的内容存储到Smem指示的数据存储单元 MOV BK47,Smem MOV BKC,Smem MOV BSA01,Smem MOV BSA23,Smem MOV BSA45,Smem MOV BSA67,Smem MOV BSAC,Smem MOV BRC0,Smem MOV BRC1,Smem MOV CDP,Smem MOV CSR,Smem MOV DP, Smem MOV DPH,Smem MOV PDP,Smem MOV SP,Smem MOV SSP,Smem MOV TRN0,Smem MOV TRN1,Smem
没有影响指令执行的状态位 执行指令后没有受影响的状态位 助记符指令 说 明 MOV dbl(Lmem),RETA 说 明 MOV dbl(Lmem),RETA 把Lmem指示数存单元内容装载到指定CPU寄存器单元: CFCT=Lmem(31-24), RETA=Lmem(23-0) MOV RETA,dbl(Lmem) 把指定CPU寄存器单元内容存到Lmem指示数存单元: Lmem(31-24)=CFCT, Lmem(23-0)=RETA MOV TAx,BRC0 把TAx的内容移动到指定的CPU寄存器单元 MOV TAx,BRC1 MOV TAx,CDP MOV TAx,CSR MOV TAx,SP MOV TAx,SSP MOV BRC0,TAx 把指定的CPU寄存器单元的内容移动到TAx MOV BRC1,TAx MOV CDP,TAx MOV RPTC,TAx MOV SP,TAx MOV SSP,TAx CFCT:控制流关系寄存器, 8位循环关系的暂存器 没有影响指令执行的状态位 执行指令后没有受影响的状态位 Program Flow Registers PC: Program counter RETA: Return address register CFCT: Control flow context register
例4-58: CPU寄存器装载、存储和移动指令举例。 (1) MOV T1, BRC1 ;BRC1=BRS1=T1 (2) MOV SP,*AR1+ ;(*AR1)=(SP), AR1=(AR1+1)
4.2.6 程序控制指令(34条) 跳转指令(10条) 调用与返回指令(7条) 中断与返回指令(3条) 重复指令(9条) 4.2.6 程序控制指令(34条) 跳转指令(10条) 调用与返回指令(7条) 中断与返回指令(3条) 重复指令(9条) 其他程序控制指令(5条)
1.跳转指令(10条) Branch Compare, Conditionally 助记符指令 说 明 B ACx 说 明 B ACx 跳转到由ACx(23~0)指定地址, 即PC=ACx(23~0) B L7 跳转到标号L7, L7为7位长的相对PC的带符号偏移 B L16 跳转到标号L16, L16为16位长相对PC的带符号偏移 B P24 跳转到由标号P24指定的地址, P24为绝对程序地址 BCC l4, cond 条件为真时, 跳转到标号l4处(小写字母l), l4为4位长的相对PC的无符号偏移 BCC L8,cond 条件为真时, 跳转到标号L8处, L8为8位长的相对PC的带符号偏移 BCC L16,cond 条件为真时, 跳转到标号L16处, L16为16位长的相对PC的带符号偏移 BCC P24,cond 条件为真时, 跳转到标号P24处, P24为24位长的绝对程序地址 BCC L16, ARn_mod!=#0 当指定辅助寄存器不等于0时, 跳转到标号L16处, L16为16位长的相对PC的带符号偏移 BCC[U] L8, src RELOP K8 当src与K8关系满足指定的关系(有(无)符号比较)时, 跳转到标号L8处, L8为8位长的相对PC的带符号偏移 modification 状态位受ACOVx, CARRY, C54CM, M40, TCx影响; 也影响ACOVx
(1) BCC branch, TC1 ;TC1=1,程序跳到branch处执行 例4-59、跳转指令举例。 (1) BCC branch, TC1 ;TC1=1,程序跳到branch处执行 编码l4 (2) B AC0 ; PC=AC0 (23-0)
2.调用与返回指令(7条) 助记符指令 说 明 CALL ACx 调用地址为ACx(23~0), L16或P24的子程过程: 说 明 CALL ACx 调用地址为ACx(23~0), L16或P24的子程过程: 堆栈配置为快返回时, 将RETA(15~0)压入SP, CFCT与RETA (23 ~16)压入SSP; 将返回地址写入RETA, 将调用现场标志写入CFCT; 堆栈配置为慢返回时, 将返回地址和调用现场标志分别存入系统堆栈和数据堆栈。然后将子程序地址装入PC, 并设置相应激活标志。 CALL L16 CALL P24 CALLCC L16,cond 当条件为真时, 执行调用。调用过程同无条件调用 CALLCC P24,cond RET 从子程序返回过程: 堆栈配置为快返回时, 将RETA值写入PC, 更新CFCT, 从SP和SSP弹出RETA和CFCT的值; 堆栈配置为慢返回时, 从系统堆栈和数据堆栈恢复返回地址和调用现场。 RETCC cond 当条件为真时, 执行返回, 过程同无条件返回
影响指令执行的状态位: ACOVx, CARRY, C54CM, M40, TCx 执行指令后会受影响的状态:ACOVx 例4-60、调用与返回指令举例。 (1)CALLCC (subroutine), AC1>=#2000h ; AC1>=#2000h,PC=子程序地址 (2)RETCC ACOV0=#0 ;ACOV0=0,PC=调用子程序的返回地址
3. 中断与返回指令(3条) 指令 INTR k5 ; 程序执行中断服务子程序,中断向量地址由中断向量指针(IVPD)和5位无符号数确定,置位INTM。 TRAP k5 ;除不置位INTM外, 其它同 INTR k5; RETI ; 从中断服务子程序返回。 状态位 没有影响指令执行的状态位 执行指令后会受影响的状态位:INTM
4. 重复指令(9条) 助记符指令 说 明 RPT CSR 重复执行下一条指令或下两条并行指令(CSR)+1次 RPT k8 说 明 RPT CSR 重复执行下一条指令或下两条并行指令(CSR)+1次 RPT k8 重复执行下一条指令或下两条并行指令k8+1次 RPT k16 重复执行下一条指令或下两条并行指令k16+1次 RPTADD CSR,TAx 重复执行下一条指令或下两条并行指令(CSR)+1次, CSR=CSR+ TAx RPTADD CSR,k4 CSR=CSR+k4 RPTSUB CSR,k4 CSR=CSR-k4 RPTCC k8,cond 当条件满足时,重复执行下一条指令或下两条并行指令k8+1次 RPTB pmad 重复执行一段指令, 次数=(BRC0/BRS1)+1。指令块最长为64KB RPTBLOCAL pmad 重复执行一段指令, 次数=(BRC0/BRS1)+1。指令块最长为64KB, 仅限于IBQ内的指令 影响指令执行的状态位:ACOVX,CARRY,C54CM,M40,TCx 执行指令后会受影响的状态位:ACOVx
例4-61、重复指令举例。 RPT CSR ;下一条指令执行CSR+1次 MACM *AR3+, *AR4+, AC1
5.其他程序控制指令(5条) 程序控制指令还包括 条件执行: XCC [label,] cond 满足条件时, 下面(并行)条件语句都执行。 XCCPART [label,] cond 满足条件时, 下面(并行)条件语句都执行。 不满足条件时, 除XCCPART后条件语句的地址修改部分须执行外, 条件语句不执行, 程序转到label语句, 或条件语句下面的语句(此时语句中无label). 例: XCC AR0 != #0 ;设(AR0)=0, 条件不满足, ADD *AR2+, AC0 ; 则程序转到ADD行下面的语句执行。 空闲: IDLE 空操作: NOP 软件复位: RESET
第4章 作业 4.6~4.11 注意: 4.10所采用的例题4-7的程序, 教材中程序不全, 完整程序如下所示, 或查看网站中压缩例程文件。 第4章 作业 4.6~4.11 注意: 4.10所采用的例题4-7的程序, 教材中程序不全, 完整程序如下所示, 或查看网站中压缩例程文件。 BCLR C54CM AMOV #001020h,XAR0 AMOV #001030h,XAR3 mov #0,T2 MOV #15,BRC0 RPTB L0 mov T2,*AR0+ ; L0: add #1,T2 MOV #1020h, AR0 MOV #0008h, T0 ;N/2 MOV #15, BRC0 RPTB L1 MOV *(AR0+T0B),T2 ; AR0指向输入序列 L1: MOV T2,*AR3+ ; AR1指向输出序列 L2: nop b L2