c语言和汇编语言的混合编写

阅读: 评论:0

c语言和汇编语言的混合编写

c语言和汇编语言的混合编写

文章目录

  • 一、c语言中调用汇编程序
    • 1. 无参调用
    • 2. 有参调用
  • 二、汇编中调用c语言
  • 三、总结
  • 四、参考文献

一、c语言中调用汇编程序

1. 无参调用

c语言程序main.c

#include<stdio.h>
extern void Init_1(void);
int main()
{
Init_1();
return 0;
}

汇编程序Func.s

	AREA My_Function,CODE,READONLY		;这一行必有的除了My_Function可以自己取名以外,其他都是模板EXPORT Init_1		;与在C文件中定义的Init_1函数关联起来;高级语言中的声明和使用变量其实是对寄存器的使用,所以我们只需要直接使用寄存器即可Init_1MOV R1,#0		;设R1寄存器是iMOV R2,#0		;设R2寄存器是jLOOP		;写在最左边的是程序段的段名,执行跳转程序时要用到CMP R1,#10		;比较R1和10的大小BHS LOOP_END	;如果R1大于或等于10,则跳转到LOOP_END程序段,反之忽略该语句,直接执行下面的语句ADD R2,#1		;j++ADD R1,#1		;i++B LOOP			;执行一次循环后,无条件再次进入循环判断,即是跳转到LOOP段
LOOP_ENDNOPEND				;必须空格后再写END,不然会被认为是段名,表示程序结束

我们在keil中进行仿真调试,具体如何在keil中创建工程以及如何软件仿真可以参考我以前的文章

断点调试

若我们在MOV R1,#0处设置断点,会发现左上角R1、R2的值都没变,为0

重新设置断点后,每RUN一次,R1、R2都会+1,直至为10跳出循环

2. 有参调用

我们将上面的Func.s修改一下,使原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。

修改后的Func.s

	AREA My_Function,CODE,READONLY		EXPORT Init_1		Init_1ADD R6,#100		MOV PC,LR	END

main.c

#include<stdio.h>
extern int Init_1(int);
int main()
{
Init_1(3);
return 0;
}

编译并调试后,能够看到R6的值发生了改变

二、汇编中调用c语言

我们仍然在前面代码的基础做修改,下面是修改后的代码

main.c

#include<stdio.h>
extern int Init_1(int x);
int re(void);
int main()
{int x = Init_1(420);printf("%d",x);return 0;
}int re(void)
{return 5;
}

Func.s

	AREA My_Function,CODE,READONLY		;这一行必有的 除了My_Function可以自己取名以外,其他都是模板EXPORT Init_1		;与在C文件中定义的Init_1函数关联起来IMPORT 	re		;声明return1为外部引用
;高级语言中的声明和使用变量其实是对寄存器的使用,所以我们只需要直接使用寄存器即可Init_1ADD R0,#100		;将传入的值+100MOV PC,LR		;返回R0LOOP		;写在最左边的是程序段的段名,执行跳转程序时要用到CMP R1,#10		;比较R1和10的大小BHS LOOP_END	;如果R1大于或等于10,则跳转到LOOP_END程序段,反之忽略该语句,直接执行下面的语句ADD R2,#1		;j++ADD R1,#1		;i++B LOOP			;执行一次循环后,无条件再次进入循环判断,即是跳转到LOOP段
LOOP_ENDNOPEND				;必须空格后再写END,不然会被认为是段名,表示程序结束

编译调试

可以看到R0变成了5,c函数调用成功

三、总结

在汇编程序中调用c语言其实还可以使用BL+函数名称;汇编函数传入参数需要选择对应的寄存器,因为传递的参数数量有限,不同参数类型对应的寄存器也不同。

四、参考文献

用51汇编完整写一个函数
浅谈C语言与汇编语言混合编程

本文发布于:2024-02-02 19:22:14,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170687293645906.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:汇编语言   语言
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23