DSP C与汇编混合编程例子

发布 2019-08-01 14:51:37 阅读 1184

第一个:以下是用的msp430型号单片机。

4.1 c 语言函数和汇编语言函数相互调用。

在这个示例中c语言函数main()调用汇编语言函数get_rand()以得到一个随机数;汇编语言函数get_rand()首先调用c语言的标准库函数rand()得到一个整型随机值,然后用调用c语言函数mult()的方法把这个随机值乘以main()函数传递给自己的实参,并把乘积值返回给main()函数。

4.1.1 c语言源文件。

* 文件名:c_ 2003-01-05 */

* c语言和汇编语言混合编程,c源程序 */

* 这段源程序调用汇编语言函数get_rand()

* 注意工程必需包含汇编语言源文件 "asm_"

#include <>头文件 */

extern unsigned long get_rand(unsigned char seed); 汇编语言函数原型声明 */

* 主函数 */

void main( void )

unsigned char seed; /局部变量定义*/

unsigned long value;

/ =系统初始化。

ifg1 = 0; /清除中断标志1 */

wdtctl = wdtpw+wdthold; /停止看门狗 */

p1dir = 0xff;

/ =系统初始化结束。

seed = 0x55;

value = get_rand(seed); 调用汇编语言函数get_rand()得到一个随机数 */

while(1); 程序结束*/

/ =主程序结束。

* 乘法子程序,供汇编语言函数调用 */

unsigned long mult(int x , int y)

return (x *y); x乘y */

/ =乘法子程序结束。

4.1.2 汇编语言源程序。

文件名: asm_

c语言和汇编语言混合编程,汇编语言源程序。

这段源程序调用两个c语言函数,标准库函数rand()和用户自定义函数mult()

#include ""头文件。

name asmfile

extern rand ; c语言标准库函数rand()

extern mult ; c_中用户自定义函数

get_rand

public get_rand ; 导出函数名给c语言函数。

rseg code

get_rand;

push r11 ; 普通寄存器入栈保护。

r12,r11 ; c 函数传递的实参在r12中,送入r16暂存。

call #rand ; 调用 c 函数 rand()

; 函数值为整型返回在r12中。

; rand()函数值作为mult()函数的第一实参。

; 送入r12进行参数传递。

mov r11,r14 ; c 函数传递的实参作为mult()函数的第二实参。

; 送入r14进行参数传递。

call #mult ; mult()值返回在 r12 / r13寄存器对。

pop r11 ; 出栈恢复寄存器内容

ret end

第二个:c6000系列的dsp

c程序的基本结构:

1. 主程序 c程序的入口点。

2. 链接命令文件。cmd

这个文件包含了dsp和目标板的存储器空间的定义,以及数据段,**段是如何分配到这些空间的。

3. c运行库文件。

如果用户程序是准备写进eprom并在上电后运行,则还要包括。asm文件,该文件的**将作为ist(中断服务表),并且必须被。cmd文件分配在地址0。

dsp在复位后首先跳转到0地址,执行复位中断,而该复位中断对应的**要跳转到_c_int00函数,来完成诸如堆栈的初始化,全局变量等操作,接着执行用户main()函数。

全局变量和静态变量被分配在。bss段中,并且在小模式下,.bss段要小于32k,也就是说程序成定义的全局变量和静态变量所占用的空间不能超过32k。

对变量采用直接寻址,而在大模式下没有限制,对变量的访问采用间接寻址,速度较慢。

c程序与线性汇编的混合编程:

在后缀名为。sa的文件中书写线性汇编程序如下:

global _add2申明全局函数add2

add2: .cproc a,bcproc与。endproc标明这之间是汇编优化器所处理的内容。

reg sum

add a,b,sumsum = a + b

return sum ;

endproc

c调用。int add2(int ai, int bi);

main()

int c_result = add2(1,2);

printf(“the add result = d”, c_result);