千家信息网

C语言怎么与ARM汇编语言混合编程

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了C语言怎么与ARM汇编语言混合编程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、ARM汇编语言简介什么是汇编语言
千家信息网最后更新 2026年10月31日C语言怎么与ARM汇编语言混合编程

这篇文章主要介绍了C语言怎么与ARM汇编语言混合编程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一、ARM汇编语言简介

什么是汇编语言?汇编语言是任何一种适用于电子计算机、微处理器或其他可编程器件的低级语言。虽然被称为"低级语言",但是并不是说汇编语言真的"低级"。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。汇编语言主要包括传送指令、逻辑运算、移位指令、位操作、控制转移、串操作和输入输出等指令。

二、C语言调用汇编语言

1.无参数调用

在Keil中创建工程文件在我之前的博客中已经介绍了,这里不做过多介绍。

VScode + keil开发环境搭建安装使用过程 https://www.yisu.com/article/218432.htm

使用VSCode和VS2017编译调试STM32程序的实现 https://www.yisu.com/article/186069.htm

首先创建工程文件,然后添加CORE和Starup

然后鼠标右键点击左边工程文件中的Source Group,选择Add New Item…

依次添加Fun.s和main.c两个文件

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,不然会被认为是段名,表示程序结束

main.c

#include extern void Init_1(void);  int main(){         Init_1();         return 0;     }

注意:需要勾选软件调试,然后修改参数。刚开始选择的芯片是stmf103c8,所以此处Parameter填写-pSTM32F103C8

设置断点

可以通过寄存器变化观察程序运行情况

2.有参数调用

简单修改一下代码

Func.s

       AREA My_Function,CODE,READONLY             ;这一行必有的 除了My_Function可以自己取名以外,其他都是模板        EXPORT Init_1              ;与在C文件中定义的Init_1函数关联起来          ;高级语言中的声明和使用变量其实是对寄存器的使用,所以我们只需要直接使用寄存器即可Init_1          ADD R0,#100                ;将传入的值+100        MOV PC,LR          ;返回R0   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,不然会被认为是段名,表示程序结束

main.c

#includeextern int Init_1(int x);  int main(){         int x = Init_1(420);         printf("%d",x);         return 0;}

调试程序观察寄存器变化

此时R1寄存器的值为0x208,即520,调用成功。

三、汇编语言调用C语言

修改代码

Func.s

        AREA My_Function,CODE,READONLY             ;这一行必有的 除了My_Function可以自己取名以外,其他都是模板        EXPORT Init_1              ;与在C文件中定义的Init_1函数关联起来        IMPORT     return1         ;声明return1为外部引用;高级语言中的声明和使用变量其实是对寄存器的使用,所以我们只需要直接使用寄存器即可Init_1          ADD R0,#100                ;将传入的值+100        MOV PC,LR          ;返回R0   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,不然会被认为是段名,表示程序结束

main.c

#includeextern int Init_1(int x);int return1(void);int main(){         int x = Init_1(420);         printf("%d",x);         return 0;}int return1(void){        return 1;}

编译并调试

可以看到R0的值变为了1,可见C函数被成功调用。

感谢你能够认真阅读完这篇文章,希望小编分享的"C语言怎么与ARM汇编语言混合编程"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

语言 程序 寄存器 汇编语言 文件 语句 循环 函数 指令 篇文章 低级 高级 一行 再次 参数 变量 大小 工程 模板 空格 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网公司 科技公司 互联网科技集团 礼当家互联网科技 浩特互联网科技 美国互联网黑科技 中国互联网金融科技基金 哈尔滨秒房互联网科技有限公司 哈尔滨新华互联网科技学院 杭州壁岐互联网科技有限公司 青海科技产业互联网发展 健康食品互联网创新科技园项目 东莞新华互联网科技学校 企晟互联网信息科技有限公司 互联网数据科技专业 黑科技 体验场景 互联网大会 易企秀互联网科技是做什么的 世界互联网科技成果奖 东风日产互联网科技公司叫什么 互联网高科技绘画 银川新华互联网科技学校招聘 互联网科技公司 猫创互联网科技 中盈科技互联网信息有限公司 互联网企业和科技型企业 高科技互联网发展前景如何 四川互联网展示科技馆设计 互联网安防科技感 福仕德教育科技互联网 北京瑞云互联网科技有限公司 山东亿川互联网科技有限责任公司
0