ARM下c和汇编混合编程

目录

一、题目要求

二、c语言中用汇编语言

1.1创建工程

1.2、创文件

1.3、调制

三、在汇编语言中用c语言

2.1创文件

2.2调制

总结:

参考:



一、题目要求

修改代码,要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为传入一个整型数x,函数运行后返回整型数 x+100。 请编程实现,并仿真跟踪调试;
如果要求在汇编函数中调用一个 C语言写的函数,应该如何修改汇编代码?

二、c语言中用汇编语言

1.1创建工程

首先还是新建工程:

选择芯片是STM32F103C8

然后跳出一个页面,按下图选择:

然后向工程里添加文件

 

1.2、创文件

在keil5下编写fun.s和main.c

fun.s

	AREA func, CODE, READONLY   ;声明代码段func为只可读
	EXPORT init   ;声明init,以便外部函数调用
init
	add	r0,r0, #100  ;寄存器r0的值加上100并赋给r0
	bx lr    ;返回主函数

main.c

#include <stdio.h>

extern int init(int x);   //引用外部函数
int main(void)
{
	int x=20;
 	init(x);      //调用外部函数
	return 0;
}

1.3、调制

然后选择Debug 页面,在“Debug”选项卡中选择“Use Simulator”,表示使用软件仿真;选择“Run to main()”则表示跳过汇编代码,直接跳转到main函数开始仿真。设置下面的“Dialog DLL”项为“DARMSTM.DLL”和“TARMSTM.DLL”;parameter项为“-pSTM32F103C8”,用于设置支持STM32F103C8的软硬件仿真。(当时没发现标记图片的软件,手画的比较寒碜)

 最后进入调试

 

再单步调试到x=20(换成十六进制为14) 

      这一步是参数刚刚从main函数中传到汇编里面,左边寄存器R0的值变成了十六进制的14,这是我们之前在main函数中定义的变量x的值,从十进制的20变成了十六进制的14。

接着我们继续运行:

 这里R0寄存器的值变成了十六进制的78,也就是十进制的100+20=120转化为十六进制

 继续执行,则会跳回到main函数中,将寄存器R0中的值返回到主函数中。

三、在汇编语言中用c语言

这个也需要创建工程文件,然后才是后面的添加下面的代码

2.1创文件

init.c

#include <stdio.h>
extern void asm_main();  //引入汇编函数
int init(int x)
{
	return x+100;
}
int main()
{
	asm_main();  //调用汇编函数
	return 0;
}

asm_main.s

	AREA	asm,CODE,READONLY   ;声明代码段asm
	IMPORT	init  ;引入外部函数,即C语言函数init
	EXPORT  asm_main ;声明,以便调用
	
asm_main
	mov r0, #20  ;使寄存器r0的值等于20
	BL init     ;调用外部函数,即C语言函数
	bx lr    ;返回主函数

2.2调制

因为使用R0进行传参,查看R0的值(20的十六进制是14)

 然后单步调制(120的十六进制78)

总结:

      这次实验它是从寄存器角度为我展示了我们平常一些简单的C程序实现的过程,让我更加了解了c语言和汇编语言的关系。

参考:

(34条消息) ARM下C语言和汇编语言混合编程_diyu-CSDN博客

(74条消息) Keil:C语言与汇编语言的互相调用_txmnQAQ的博客-CSDN博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值