----->汇编程序和C程序混合调用(精要总结)
1.C语言中如何调用汇编语言实现的函数
2.C语言中如何使用汇编语言定义的变量
3.汇编语言中如何调用C语言的函数
4.汇编语言中如何调用C语言定义的变量
1.C语言中如何调用汇编语言实现的函数
比较两个字符串是否相等的函数my_strcmp
.text
.code 32
.global my_strcmp
my_strcmp:
ldrb r2,[r1],#1 @r1是“ledon”首地址
ldrb r3,[r0],#1 @r0是buf的首地址
cmp r2,#0
beq cmd_end
...
cmp_end:
sub r0, r2,r3
bx lr
extern void my_strcmp(char *d, const char *s);
main.c
int main(void)
{
char buf[256];
uart0_gets(buf);
my_strcmp(buf, “ledon”);
r0 r1 (默认从r0,r1,r2开始)
如果成功,调用ledon命令的处理函数
}
1.汇编函数的名字声明为全局标号.global my_strcmp
2.C程序中如要调用这个汇编函数,需要声明该函数的函数原型(与调用普通函数相同)
extern void my_strcmp(char *d, const char *s);
r0 r1
3.按照C语言的方式调用该函数
2.C语言中如何使用汇编语言定义的变量
.data
.global yy
yy:
.word 0x100
1.汇编中将该变量声明为全局变量
2.在C语言中声明该变量为外部变量
extern int yy;
3.按照C的方式使用该变量
3.汇编语言中如何调用C语言的函数
int add(int a, int b, int c, int d)
{
return (a+b+c+d);
}
1.C程序中该函数定义为全局,不能加static
2.汇编程序中将该函数声明为外部标号
.extern add
3.按照汇编的方式调用
mov r0, #1 ->a
mov r1, #2 ->b
mov r2, #3 ->c
mov r3, #4 ->d
bl add
cmp r0, #0
关键是:参数传递的规则
int add(int a, int b, int c, int d)
r0 r1 r2 r3
4.汇编语言中如何调用C语言定义的变量
int a;
1.C中变量声明为全局
2.汇编程序中声明该变量为外部变量
.extern a
3.按照汇编方式使用
ldr r0, =a
ldr r1, [r0]
小结:
被调用方:
将被调用的函数或者变量都要定义为全局的
调用方:
声明被调用的函数的函数原型或变量都要为外部标号
C程序调用汇编函数
将用汇编实现的字符串比较函数替换掉用C实现的字符串比较函数
1.汇编函数(字符串比较函数)定义为全局标号
2.在C程序中将该汇编函数声明函数原型extern
3.替换C的字符串比较函数,用汇编函数