SHARC汇编编程---参数传递以及参数返回,压栈出栈

在C语音和汇编语言混编编程时,C语言调用汇编语言的函数接口,主要由下面几个步骤:

1.extern修饰的全局变量

在C文件内声明变量,在汇编里面使用 .extern 定义外部变量。

例如C文件(main.c)类定义:

int paraa = 0;

汇编文件(test.asm)内定义:

.extern _paraa;

通过上述定义,C文件在需要调用汇编函数之前,将参数赋值给paraa,即可实现C语言和汇编语言的参数传递;

 

2.asm插入指令指明全局变量

在C代码插入汇编指令:register int x asm("r9");这里的r9必须小写。

这种方法不常用。

 

3.通过寄存器和堆栈传递

a.参数少于等于3个时,传递给汇编时,分别将数据传递给R4,R8,R12。

int add3para(int a, int b, int c);

对应的汇编代码:

.global _add3para;

_add3para:

    leaf_ entry;

    R4 = R4+R8;

    R0 = R4+R12;

    leaf_ exit;

_add3para.end;

b.有一个参数传入栈中,这个参数后面全部放在栈中。

int add5para(int a, int b, int c, int c, int d);

对应的汇编代码:

.global _add5para;

_add3para:

    leaf_ entry;

    R4 = R4+R8;

    R4 = R4+R12;

    R8 = reads(1);

    R4 = R4+R8;

    R8 = reads(2);

    R0 = R4+R8;

    leaf_ exit;

_add3para.end;

c.字宽大于32bit或者复数双精度的浮点数放在栈中,且占用2个连续的地址单元;

d.参数个数可变时,最后一个有名的参数放在栈中。

test(int a, int b, int c,......);

a放在R4,b放在R8,C及以后参数放在栈中;

 

4.汇编函数返回

a.全局变量

 

b.返回值放在R0,R1。双精度和复数,同时占用R0,R1。返回时一个结构型,则R0指向结构地址;

 

 

 

5.压栈:在进入汇编程序之后,需要保护现场,退出汇编程序的时候,需要恢复现场。

压栈:只能对Rx进行压栈,其它寄存器需要先赋值给Rx,然后再压栈

puts = R1 或者

R1 = Ix;puts = R1;

出栈:同样的,只能对Rx出栈,如果其它寄存器需要出栈,则先出栈给Rx,然后在赋值

R0=gets(x) 或者

R0=gets(x);Ix=R0;

上面的gets(x)中,x表示压栈顺序

你可能感兴趣的:(SHARC汇编编程---参数传递以及参数返回,压栈出栈)