7.2.1加减运算 ·在数字信号处理中,加减运算是常见的算术运算。 一般使用16位或32位加减运算,数值分析、浮 点运算和其它操作可能需要32位以上的运算。 C55x有直接完成16位或32位加减运算的指令, 但没有能直接完成多字加减运算的指令。要进行 多字加减运算,需要通过编程方法实现。 23
7.2.1 加减运算 ⚫ 在数字信号处理中,加减运算是常见的算术运算。 一般使用16位或32位加减运算,数值分析、浮 点运算和其它操作可能需要32位以上的运算。 ⚫ C55x有直接完成16位或32位加减运算的指令, 但没有能直接完成多字加减运算的指令。要进行 多字加减运算,需要通过编程方法实现。 23
M40=1 ●以下指令可在单周期内完成32位加法运算: MOV40 dbl(Lmem),ACx 可进行单独32位或 ADD dbl(Lmem),ACx 64位的低32位加 ●64位的高32位加法要考虑低32位加法产生的进位,高 3247位 32位使用以下指令:ADD uns(Smem),CARRY,ACx 48~63位 ADD (Smem-1)<<#16,ACx ●以下指令可在单周期内完成32位减法运算: MOV40 dbl(Lmem),ACx 可进行单独32位或 SUB dbl(Lmem),ACx 64位的低32位加 ●64位的高32位减法要考虑低32位减法产生的借位,使 用以下指令:SUB uns(Smem),BORROW,ACx SUB (Smem-1)<<#16,ACx 24
⚫ 以下指令可在单周期内完成32位加法运算: MOV40 dbl(Lmem),ACx ADD dbl(Lmem),ACx ⚫ 64位的高32位加法要考虑低32位加法产生的进位,高 32位使用以下指令: ADD uns(Smem), CARRY, ACx ⚫ 以下指令可在单周期内完成32位减法运算: MOV40 dbl(Lmem), ACx SUB dbl(Lmem), ACx ⚫ 64位的高32位减法要考虑低32位减法产生的借位,使 用以下指令: SUB uns(Smem), BORROW,ACx 可进行单独32位或 64位的低32位加 可进行单独32位或 64位的低32位加 24 M40=1 ADD (Smem-1)<< #16, ACx 32~47位 48~63位 SUB (Smem-1)<< #16, ACx
例7-1, 64位加法运算。文件名为:add64.asm。 .mmregs为存储器映射寄存器定义符号名.与对所有存储器映射寄 .mmregs 存器执行.set功能一样。C54x汇编器(手册)支持.mmregs指令。 model Icall=c55 std C函数调用时参量与寄存器(10个)的排列关系按表611执行(默 认:c55std)。c55 compat只能传递3个参数到寄存器 model mem=large 指针分配 AR1-> X3(偶地址) 1000h 米米米米米米米米米米米米米米米米米 X2 I 64位加法 始 地 AR2-> Y3(偶地址) 址值 1004h ◆ X3 X2 X1 XO ◆ Y3 Y2 Y1 Y0 依次 ◆ Y品 ◆ W3 W2 W1 WO AR3-> W3(偶地址) 增 1008h W2 加 W1 WO 25
例7-1,64位加法运算。文件名为:add64.asm。 .mmregs .model call=c55_std .model mem=large ;***************** ; 64位加法 ; ; X3 X2 X1 X0 ; + Y3 Y2 Y1 Y0 ; --------------------- ; W3 W2 W1 W0 25 指针分配 AR1 -> X3(偶地址) X2 X1 X0 AR2 -> Y3(偶地址) Y2 Y1 Y0 AR3 -> W3(偶地址) W2 W1 W0 1000h 地 址 值 依 次 增 加 1004h 1008h .mmregs为存储器映射寄存器定义符号名. 与对所有存储器映射寄 存器执行.set功能一样。C54x 汇编器(手册)支持.mmregs指令。 C函数调用时参量与寄存器(10个)的排列关系按表6-11执行(默 认: c55_std) 。 c55_compat只能传递3个参数到寄存器
.sym-COFF Symbolic Debugging Directivesi已废弃 .sect ".text" .align 4 The.sym directive defines a global variable,a local variable,or a function.Several parameters .global start allow you to associate various debugging ;.sym start,start,36,2,0 information with the variable or function. start:标号地址,表示函数,外部,不占存储 格式: 用数表示对应C变量类型,占存储单元位数 .sym name,valueL,type,storage dass,size,tag,dims] MOV #0100h,AR1 MOV #0104h,AR2 参考文献:TMS320C28X系列DSP指令和编程指南 -附录B符号调试伪指令.Sym(需看附录A:难懂) MOV #0108h,AR3 茶苑老吴的博客:"关于TMS320C55x的汇编语言 L1: 中的.Sym伪指令"(此文献非常详细明了) MOV40 dbl(*AR1(#2)),ACO ;ACO=X1 XO ADD dbl(*AR2(#2)),ACO ;ACO X1 XO Y1 Y0 MOV ACO,dbl(*AR3(#2)) ;保存W1W0. MOV40 dbl(*AR1),ACO ;ACO X3 X2 ADD uns(*AR2(#1)),CARRY,ACO;ACO=X3X2 +00 Y2+CARRY ADD *AR2<<#16,ACO ;ACO-X3 X2 +Y3 Y2 CARRY MOV ACO,dbl(*AR3) ;保存W3W2. BL1
.sect ".text" .align 4 .global start ;.sym start,start, 36, 2, 0 start: MOV #0100h,AR1 MOV #0104h,AR2 MOV #0108h,AR3 L1: MOV40 dbl(*AR1(#2)), AC0 ;AC0 = X1 X0 ADD dbl(*AR2(#2)), AC0 ;AC0 = X1 X0 + Y1 Y0 MOV AC0,dbl(*AR3(#2)) ;保存W1 W0. MOV40 dbl(*AR1), AC0 ;AC0 = X3 X2 ADD uns(*AR2(#1)),CARRY,AC0;AC0=X3 X2 + 00 Y2 + CARRY ADD *AR2<< #16, AC0 ;AC0= X3 X2 +Y3 Y2 + CARRY MOV AC0, dbl(*AR3) ;保存 W3 W2. B L1 27 .sym-- COFF Symbolic Debugging Directives已废弃 The .sym directive defines a global variable, a local variable, or a function. Several parameters allow you to associate various debugging information with the variable or function. 格式: .sym name, value[, type, storage class, size, tag, dims] 参考文献: TMS320C28X系列DSP指令和编程指南 -附录B 符号调试伪指令.sym(需看附录A:难懂) 茶苑老吴的博客:”关于TMS320C55x的汇编语言 中的.sym伪指令 “(此文献非常详细明了) 标号,地址,表示函数,外部,不占存储 用数表示对应C变量类型,占存储单元位数
AR1->X3(偶地址) .sect ".text" 1000h .align 4 指针分配 2X0 提 1002万 .global start AR2 1-> ;.sym start,start,36,2,0 值依次增 1004h 1005万 start: 1006 MOV #0100h,AR1 AR3-> 3(偶地址) 1008h MOV #0104h,AR2 MOV #0108h,AR3 100Ah O L1:该指令执行后AR1的值不变,该指令寻址:(AR1)+2 MOV40 dbl(*AR1(#2)),ACO ;ACO = X1 XO ADD dbl(*AR2(#2)),ACO ;ACO=X1 XO Y1 Y0 MOV ACO,dbl(*AR3(#2)) :保存W1W0. MOV40 dbl(*AR1),ACO ;ACO X3 X2 五 ADD uns(*AR2(#1)),CARRY,ACO ;ACO=X3X2+00Y2 +CARRY ADD*AR2<<#16,AC0;两行完成AC0=X3X2+Y3Y2+CARRY MOV AC0,dbl(*AR3);保存W3w2.加法AC0=AC0+Y300 B L1 此指令不是带进位加,也不需要,因X2加Y2的进位就在AC0(16)中 28
.sect ".text" .align 4 .global start ;.sym start,start, 36, 2, 0 start: MOV #0100h,AR1 MOV #0104h,AR2 MOV #0108h,AR3 L1: MOV40 dbl(*AR1(#2)), AC0 ;AC0 = X1 X0 ADD dbl(*AR2(#2)), AC0 ;AC0 = X1 X0 + Y1 Y0 MOV AC0,dbl(*AR3(#2)) ;保存W1 W0. MOV40 dbl(*AR1), AC0 ;AC0 = X3 X2 ADD uns(*AR2(#1)),CARRY,AC0 ;AC0=X3X2+00Y2 +CARRY ADD *AR2<< #16, AC0 ;两行完成AC0=X3X2+Y3Y2+CARRY MOV AC0, dbl(*AR3) ;保存W3 W2. B L1 28 AR1 -> X3(偶地址) X2 X1 X0 AR2 -> Y3(偶地址) Y2 Y1 Y0 AR3 -> W3(偶地址) W2 W1 W0 1000h 地 址 值 依 次 增 加 1004h 1008h 指 针 分 配 无带进位的 32位加指令 此指令不是带进位加, 也不需要, 因X2加Y2的进位就在AC0(16)中. 1002h 1006h 100Ah 1005h 加法AC0=AC0+Y300 该指令执行后AR1的值不变,该指令寻址:(AR1)+2