初学DSP 汇编问题(参数传递)

2019-03-26 16:38发布

刚入手DSP汇编,想编个简单的测试程序运行下,功能是:主函数中用C,调用汇编文件中的功能函数两数相乘 编译出错: [E0002] Illegal mnemonic specified,下面是2个源文件,请帮看下,谢谢! /*********main.c************/ #include <stdio.h> void main() {     int m,n,a;     m = 10;     n = 20;     a = MPY1(m, n);     printf("a=%d ",a); } /**********test.asm********/      .text     ..globle _MPY1   _MPY1:     .asg A0, A_m     .asg A2, A_n;      MV  .S1  A0, A6    MV  .S1  A2, A4     LD  .D1 *A4, A3   LD  .D1 *A6, A5       MPY .M1 A3, A5, A7     NOP 2     .end     上面就是源程序了,第一次写,也不知道该怎么传递参数m,n。。。哪位兄弟出来帮解答下   [ 本帖最后由 breeze505 于 2012-4-25 11:06 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
carrotchen
1楼-- · 2019-03-26 22:13
< 根据你的代码,估计你用的是c6000,参考spru187的第8章Run-Time Environment。

第一、二个参数分别用A4,B4,从你的代码看,调用汇编子函数是值传递,为什么又要把参数当成指针来用?
breeze505
2楼-- · 2019-03-27 03:45
 精彩回答 2  元偷偷看……
carrotchen
3楼-- · 2019-03-27 08:26
 精彩回答 2  元偷偷看……
breeze505
4楼-- · 2019-03-27 13:56

感谢你的解答,我这没spru187文档。。有疑问请再帮指导下:

1. B .S2 B3 这条指令是干嘛?

2. 你的代码里程序通过什么返回回去?是通过A4?

3. 程序通过; Branch 结束?我试了下用.end也一样可以,

 4.我编译了你的代码,可以了!想再问下,如果我的程序参数传递想改成

 MPY1(m, n,a); 也就是把计算结果存在a中,这样的3个参数该怎么传?代码该怎么改,请指教

[ 本帖最后由 breeze505 于 2012-4-25 14:22 编辑 ]
carrotchen
5楼-- · 2019-03-27 15:40
1. B .S2 B3,返回到主函数,B3是返回地址,在spru187中规定:http://www.ti.com/lit/ug/spru187o/spru187o.pdf
2. A4是子函数MPY1的返回值
3. ; Branch是注释,B .S2 B3是从子函数返回,但是B指令要延迟5个周期,在; Branch处生效,故标注之
4. 在CGT v6.1.20下可以通过,估计你的编译器较老,可以试做以下修改:
    .text
    .global _MPY1
_MPY1:
    B .S2 B3
    MV .S1 A4, A0
    MV .S1x B4, A1 ; <- S1改为S1x
    MPY32 .M1 A0, A1, A4
    NOP 2
    ; Branch
breeze505
6楼-- · 2019-03-27 21:12
感谢你的回复!
1. 是不是所有情况下,A4都接受函数的第一个参数?还有起返回值的作用?
2. 如果我要实现的是无返回值,如下:
void MPY1(int m, int n, int a)
{a = m + n;}
我改汇编代码如下:
.text
.global _MPY1
_MPY1:
.asg A4, m
.asg B4, n
.asg A3, a
B .S2 B3
MV .S1 A4, A0
MV .S1 B4, A1
MPY32 .M1 A0, A1, A3
NOP 2
; Branch
我编译了,执行结果不对,并没有写进去,应该是我不知道第三个参数怎么传?怎么写进a的计算结果值,请指教,谢谢!

一周热门 更多>