在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表示压栈顺序