c51 汇编调用c函数:一般都是C调用汇编的,倒是反过来了,在C函数中,如果要严格时序或者精确操作的要求,某一段会用汇编来写,不管是C调用汇编,还是汇编调用C。
创新互联公司 - 德阳机房服务器托管,四川服务器租用,成都服务器租用,四川网通托管,绵阳服务器托管,德阳服务器托管,遂宁服务器托管,绵阳服务器托管,四川云主机,成都云主机,西南云主机,德阳机房服务器托管,西南服务器托管,四川/成都大带宽,服务器机柜,四川老牌IDC服务商
我的程序KEIL编译器,EXTRN CODE(_Send_CRC)的第一个国家Send_CRC C函数编译加上调用_LCALL _Send_CRC如果您要成相应的数据,然后使用变量在C,XDATA代码。
一般形式:
函数名(实参表列);如果是调用无参函数,则"实参表列"可以没有,但括弧不能省略。如果实参表列包含多个实参,则个参数间用逗号隔开。实参与形参的个数应相等,类型应一致。
实参与形参按顺序对应,一一传递数据。但应说明,如果实参表列包括多个实参,对实参求值的顺序并不是确定的,有的系统按自左至右顺序求实参的值,有的系统则按自右至左顺序
把汇编写在另一个文件里 在main写个原型声明 再把两个文件同时编译可不可以。
我的gcc编译器里是这样写的
汇编文件m.s
.file "stdio.h"
#hellowrold.s print "hello,world!"
.section .data
output:
.ascii "%d %d %d\0"
.section .text
.globl _fun
_fun:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 0x8(%ebp), %eax
movl %eax, 0x4(%esp)
movl 0xc(%ebp), %eax
movl %eax, 0x8(%esp)
movl 0x10(%ebp), %eax
movl %eax, 0xc(%esp)
movl $output, %eax
movl %eax, (%esp)
call _printf
movl %ebp, %esp
popl %ebp
ret
.end
主函数前的原型声明 extern int fun(int i, int j, int k);
如果keil5的话,在汇编内调用c语言的变量,可以
IMPORT (变量名)
LDR r0, =(变量名) //获得该变量地址到r0
LDR r0,[r0] //将r0其值作为地址,获取其地址指向的值
这样c中变量的值就传递到r0了