IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言嵌套汇编语言 -> 正文阅读

[C++知识库]C语言嵌套汇编语言

目录

一、创建新工程test2

1.1 点击创建

1.2?取项目名称为test2

1.3 选择STM32F103C8?

?二、编写程序

2.1 main.c

2.2 Func.s

2.3 原理:首先在C里面用 extern 声明 Init_1这个函数,再在main里面调用好了。 然后在汇编里面用EXPORT Init_1与C联系起来就可以了。

?三、添加源代码

3.1 添加main.c

3.2 添加Func.s

3.3 修改debug参数改成只运行程序

四、编译并调试

4.1 rebuild没有错误

?4.2 设置断点,观察每次比较时的R1和R2大小?

?4.3 此时R1是小于10的会不断进入i++和j++循环

4.4 此时R1大于10则跳出循环到LOOP_END??

五、修改参考代码

5.1 main.c

5.2 Func.s

5.3 添加文件并开始编译

5.4 设置断点并调试

5.5 寄存器与堆栈使用规则

六、总结


一、创建新工程test2

1.1 点击创建

1.2?取项目名称为test2

1.3 选择STM32F103C8

?因为只是跑程序,因此不需要添加设备。

?二、编写程序

2.1 main.c

#include<stdio.h>

extern void Init_1(void);

int main(){
	
	Init_1();
	
	return 0;
	
}

2.2 Func.s

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

?遇到问题注释变成了问号

解决办法:Edit-configuration

?点击OK即可。

2.3 原理:首先在C里面用 extern 声明 Init_1这个函数,再在main里面调用好了。 然后在汇编里面用EXPORT Init_1与C联系起来就可以了。

?三、添加源代码

3.1 添加main.c

3.2 添加Func.s

3.3 修改debug参数改成只运行程序

?

四、编译并调试

4.1 rebuild没有错误

4.2 设置断点,观察每次比较时的R1和R2大小?

4.3 此时R1是小于10的会不断进入i++和j++循环

4.4 此时R1大于10则跳出循环到LOOP_END?

五、修改参考代码

? 要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。

5.1 main.c

#include<stdio.h>

extern int Init_1(int x);

int main()
	{
	 int x,y;
		x=10;
	y=Init_1(x);
	
return 0;
	}

定义一个返回值为整型的Init_1的函数

5.2 Func.s

	AREA	My_Function,CODE,READONLY	;这一行必有的除了My_ Function可以自己取名意以外,其它的都是模版啦
	EXPORT Init_1	;与在c文件中定义的Init_ 1函数关联起来
	;高级语言中的声明和使用变量其实是对板子寄存器的使用,所以我们只需要直接使用寄存器即可
Init_1
loop ;写在最左边的是程序段的段名,执行跳转程序时要用到
	MOV R2,100	;设R2寄存器的值为100
	ADD R1,R0,R2;计算R0与R2的和,并将值存储到R1
LOOP_END ;写在最左边的是程序段的段名,执行跳转程序时要用到
	MOV  PC,LR; 返回值,这是必要的格式
	END ;必须空格后再写END,不然会被认为是段名,表示程序结束

5.3 添加文件并开始编译

?

5.4 设置断点并调试

?可见R0十六进制对应的是传入的参数值,R1为x+100后的值

5.5 寄存器与堆栈使用规则

1)寄存器的使用规则

子程序之间通过寄存器r0~r3来传递参数,当参数个数多于4个时,使用堆栈来传递参数。此时r0~r3可记作A1~A4。 在子程序中,使用寄存器r4~r11保存局部变量。因此当进行子程序调用时要注意对这些寄存器的保存和恢复。此时r4~r11可记作V1~V8。 寄存器r12用于保存堆栈指针SP,当子程序返回时使用该寄存器出栈,记作IP。 寄存器r13用作堆栈指针,记作SP。寄存器r14称为链接寄存器,记作LR。该寄存器用于保存子程序的返回地址。 寄存器r15称为程序计数器,记作PC。

2)堆栈的使用规则

ATPCS规定堆栈采用满递减类型(FD,Full Descending),即堆栈通过减小存储器地址而向下增长,堆栈指针指向内含有效数据项的最低地址。 3)参数的传递规则 整数参数的前4个使用r0~r3传递,其他参数使用堆栈传递;浮点参数使用编号最小且能够满足需要的一组连续的FP寄存器传递参数。 子程序的返回结果为一个32位整数时,通过r0返回;返回结果为一个64位整数时,通过r0和r1返回;依此类推。结果为浮点数时,通过浮点运算部件的寄存器F0、D0或者S0返回。

六、总结

? 此次对C语言与汇编语言的混合使用,我明白了在c语言中调用汇编函数的注意事项,并且也掌握了一些汇编语言的基本语法和指令。借此查阅资料学习到了在传参时的注意事项,了解了可以在汇编中调用c语言函数,也可在c语言中调用汇编函数,在简单程序中,可直接使用汇编语言,而在复杂的语言中最好是用c与汇编的混合编法,不过还对汇编不是很熟悉,需要勤加练习。

参考文献:如何让把C语言的参数传递给汇编函数

? ? ? ? ? ? ? ? ? ?keil:C语言里面调用汇编程序 - wzb的QQ空间 - 博客园

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-08 11:36:46  更:2021-10-08 11:39:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:44:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码