微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > 请教C语汇编程序,附代码

请教C语汇编程序,附代码

时间:10-02 整理:3721RD 点击:


在C语言写的主程序里定义如下:
extern int Multiply(x,y);

汇编写的函数程序:
.def _Multiply
.global _x
.global _y
.global _TEMP
.global _z
.text

_Multiply:
POPD *+ ; return address
SAR AR0,*+ ; old frame pointer
SAR AR1,* ; old stack pointer
LAR AR0,*+,AR1; assign new frame pointer
;; SST #1,*+ ; status register 1
;; SST #0,*+ ; status register 0

LACL _x
SACL _TEMP
LT _y
MPYU _TEMP
SACL _z

MAR *,AR1 ;*=AR1=stack pointer
MAR *- ;SP points to last data
LST #0,*- ; status register 0
LST #1,*- ; status register 1
LAR AR0,*- ; restore old FP
PSHD * ; return address
RET
在编译的时候提示:
line 11: [F095] parameter types missing from prototype of \'Multiply\'

line 11 就是指我在主程序里定义的extern int Multiply(x,y);
我的本意是实现两个数相乘,本来用Q格式写的,但是测试运算速度太慢,所以想用C调汇编写.

谢谢.

extern int Multiply(x,y);
改为extern int Multiply(int x,int y); 试试。

这个我试过了,在汇编返回的时候就跑飞了.而且在单步运行时观察运行结果,发现连赋值功能都没

有实现.

现在很晕呢,写的浮点运算试都没敢拿来试,肯定太慢.IQ运算做个乘/除法也要17uS左右.用在PI

运算中速度是否跟得上也没有把握.

现在就是想做两个C调汇编的小程序,一个用来实现两个Q14相乘,一个实现两个Q14相除.应该是

非常简单的.不知道有没有好心人帮忙弄一个?感激涕零.

help!

有没有人帮我写一个C调汇编的程序?

搞不定呢.

拜谢.

参数地址不对,当C中调用了int Multiply(x,y)后,编译器的处理方法类似于下面代码:

MAR *,AR2
LAR AR2,#X
LACC *,AR1
SACL *+,AR2
LAR AR2,#Y
LACC *,AR1
SACL *+

CALL _Multiply
MAR *,AR1
SBRK #2

----------------------------------
编译器是将参数压入了堆栈当中,所以,这个有参数的函数的汇编代码要到堆栈当中去寻找两个乘数;

_Multiply:
POPD *+ ;FP-2
SAR AR0,*+ ;FP-1
SAR AR1,* ;当前局部指针FP
LAR AR0,*+,AR1;
......................
.......................

MAR *,AR1
MAR *-
LAR AR0,*-
PSHD *
RET


所以,两个被乘数的位置在FP-3,和FP-4的位置;

另外,

关于积存器保存的问题我认为是这样:
用到的要保存,不用的不闭理睬;关于ST1和ST0你的程序里我认为没有必要保存,即使要保存,要注意顺序,要保证返回时ST1在ST0前面,应为ST0装有当前积存器AR1,若果ST1在后面,则当前积存器肯定变化了,是用AR1之前的哪个辅助积存器,这样,一弹栈就错,程序必然跑飞.
----------------以上观点是本人理解,仅供参考.

参数的声明在汇编中如下:

.def _Multiply

_Multiply:

.....
......
没有其他任何变量的声明了!

--------------
在C当中:
extern int Mulityply(int x,inty);

--------------------------------------------------------------

CC中的C与汇编接口和KEIL C中的C与汇编接口基本类似.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top