ARM实验-ARM主程序调用ARM/C语言子程序

news2024/12/26 21:45:57

一、实验名称:ARM主程序调用ARM/C语言子程序

二、实验目的:

  1. 了解ARM应用程序框架。
  2. 了解ARM汇编程序函数和C语言程序函数相互调用时,遵循的ATPCS标准;
  3. 了解和掌握ARM汇编程序调用C语言程序函数的基本方法;
  4. 了解和掌握ARM汇编程序调用C语言程序函数的参数传递过程。

 三、实验原理:

  1. ARM工程

由于C语言便于理解,有大量的支持库,所以它是当前ARM程序设计所使用的主要编程语言。

对硬件系统的初始化、CPU状态设定、中断使能、主频设定 以及RAM控制参数初始化等C程序力所不能及的底层操作,还是要由汇编语言程序 来完成。

ARM工程 的各种源文件之间的关系,以及最后形成可执行文件的过程如下图1所示:

图1 汇编语言和C语言混合编译链接示意图

在应用系统的程序设计中,若所有的编程任务均用汇编语言 来完成,其工作量是可想而知的,这样做也不利于系统升级或应用软件移植。

通常汇编语言部分完成系统硬件的初始化;高级语言部分完成用户的应用。

执行时,首先执行初始化部分,然后再跳转到C/C++部分。整个程序结构显得清晰明了,容易理解。为方便工程开发,ARM公司的开发环境ARM ADS为用户提供了一个可以选用的应用程序框架。该框架把为用户程序做准备工作的程序分成了: 启动代码 和 应用程序初始化 两部分。

用于硬件初始化的汇编语言部分叫做 启动代码;用于应用程序初始化的C部分叫做初始化部分。整个程序如下图2所示:

图2 ARM应用程序框架

  1. 过程调用标准ATPCS

在ARM工程中,C程序调用汇编函数和汇编程序调用C函数是经常发生的事情。为此人们制定了ARM-Thumb过程调用标准ATPCS(ARM-Thumb Procedure Call Standard)。

  1. ATPCS规定,ARM的数据堆栈为FD型堆栈,即递减满堆栈。
  2. ATPCS标准规定,对于参数个数不多于4的函数,编译器必须按参数在列表中的顺序,自左向右为它们分配寄存器R0~R3。其中函数返回时,R0还被用来存放函数的返回值。
  3. 如果函数的参数多于4个,那么多余的参数则按自右向左的顺序压入数据堆栈,即参数入栈顺序与参数顺序相反。
  4. 根据ATPCS的C语言程序调用汇编函数,参数由左向右依次传递给寄存器R0~R3的规则。
  1. 子程序的调用与返回

人们把可以多次反复调用的、能完成指定功能的程序段称为“子程序”。把调用子程序的程序称为“主程序”。

为进行识别,子程序的 第1条指令 之前必须赋予一个 标号,以便其他程序可以用这个标号调用子程序。

在 ARM 汇编语言程序中,主程序一般通过 BL 指令来调用子程序。该指令在执行时完成如下操作:将子程序的返回地址存放在连接寄存器 LR 中,同时将程序计数器 PC 指向子程序的入口点。

为使子程序执行完毕能 返回 主程序的调用处,子程序末尾 处应有 MOV、LDMFD 等指令,并在指令中将返回地址重新复制到 PC 中。

在调用子程序的同时,也可以使用 R0~R3 来进行 参数的传递 和从子程序返回 运算结果。

四、实验内容:

  1. ARM指令主程序调用ARM指令子程序;
  2. ARM指令主程序调用C语言子程序,输入的6个参数为1、2、3、4、5、6;
  3. 子程序的参数个数要求至少6个, C语言子程序实现的功能为:(i1+i2+i3+i4)*i5-i6。
  4. 分析通过反汇编得到的C程序的ARM指令代码段,了解参数传递过程。

五、实验器材(设备、元器件):

  1. PC机一台;
  2. Keil MDK-ARM uVision4开发工具。

六、实验步骤:

  1. 打开Keil MDK-ARM uVision4开发工具;
  2. 新建一个工程文件;
  3. 在新建的工程文件中,添加新的源程序文件
  4. 编写代码
  5. 选择“Build target”菜单对编写好的工程文件进行编译链接。
  6. 点击““Start/Stop Debug Section””按键,对程序进行跟踪调试,在调试界面,单步执行,对CPU各寄存器的值的变化、以及相关内存的变化进行分析比较,判断程序的执行是否符合预期要求。

七、实验结果与分析(含重要数据结果分析或核心代码流程分析)

  1. ARM指令主程序调用ARM指令子程序;程序代码

(1)程序代码如代码1所示:

 AREA lab3,CODE,READONLY

 ENTRY  

 MOV R0,#0x01

 MOV R1,#0x02

 BL arm_func  ;调用ARM子程序

 B final

arm_func ;ARM子程序用来实现将R0和R1的值相加保存在R6中

 ADD R6,R0,R1

 BX LR

final

 END

(2)运行过程及结果界面截图

图1 ARM指令主程序调用ARM指令子程序运行结果截图

(3)实验结果分析

执行程序后,首先将R0,R1分别初始化为0x01、0x02,之后调用ARM子程序arm_func,将R0跟R1的内容相加送到R6,此时可以看到R6的内容为0x03结果正确。

(4)实验结论

实验结果与期望结果一致,ARM子程序执行正确。

   2.ARM指令主程序调用C语言子程序;

  1. 程序代码

ARM指令主程序如代码2所示

代码2  ARM指令主程序调用C语言子程序的RM指令主程序

 PRESERVE8

 IMPORT c_func   ;声明c_func为外部引用符号

 AREA lab3,CODE,READONLY

 ENTRY  

 LDR SP,=0x40000100 ;初始化堆栈指针SP

 MOV R0,#0x01

 MOV R1,#0x02

 MOV R2,#0x03

 MOV R3,#0x04

 MOV R4,#0x05

 MOV R5,#0x06

 STMFD SP!,{R4,R5} ;多余两个参数压栈

 BL c_func ;调用c程序

 MOV R0,R0

 END

C语言子程序代码如代码3所示

代码3  RM指令主程序调用C语言子程序的C语言子程序

#include<stdio.h>

int c_func(int i1,int i2,int i3,int i4,int i5,int i6){

return (i1 + i2 + i3 + i4) * i5 - i6;

}
  1. 运行过程及结果界面截图

图2是程序即将调用C子程序的截图,将R0-R5分别初始化为0x01、0x02、0x03、0x04、0x05、0x06,由于参数个多余四个,因此将多余的两个参数压栈。

 

图2 程序即将调用C子程序的截图

图3是程序跟踪进入C语言子程序的截图,可以看到函数已经接收到了六个参数值。

图3 程序跟踪进入C语言子程序的截图

图4是调用C程序返回后的截图,函数返回值0x2C保存到R0中。

图4 程序跟踪进入C语言子程序的截图

  1. 实验结论

函数的接收到的六个参数分别为0x01、0x02、0x03、0x04、0x05、0x06,经(i1+i2+i3+i4)*i5-i6运算后结果为0x2C并返回,从R0的值为0x2C可以看出,ARM程序成功接收到C语言函数返回值。

七、总结及心得体会:

(1)心得体会:通过本次实验我进一步了解了ARM应用程序框架,掌握了在ARM汇编程序函数和C语言程序函数相互调用时需要遵循的ATPCS标准;同时我也了解和掌握ARM汇编程序调用C语言程序函数的基本方法以及ARM汇编程序调用C语言程序函数的参数传递过程。

(2)思考题:

1)在ARM汇编程序中,参数多余4个(比如为6个)时,多余的参数会按照从右向左的顺序压栈。

2)调用C语言函数前SP寄存器的值以及C函数返回后SP寄存器的值没有发生变化,进入C语言函数时,会先进行现场保护将会用到的寄存器压栈保存,此时SP的值变小,C语言函数执行完之后,会进行恢复现场的出栈操作,SP值变大,恢复到调用C语言函数前的值。

3)如果参数多余4个的话,前四个参数通过R0-R3寄存器传递,剩下的参数通过LDR指令从栈中依次取出;在C语言函数入口使用STMDB指令将函数中所用到的其他寄存器压栈保存依次来保护现场,之后C语言函数出口,使用LDMIA指令进行出栈进行恢复现场。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统第4章 文件系统 知识点

UNIX系统不存一些具体的指针了 只存文件名和指向i结点的指针 这个删除和截断有什么区别 目录本来放在外存的&#xff0c;有文件打开表&#xff0c;从外存复制到内存的文件打开表中&#xff0c;用户想继续读的时候&#xff0c;不用再去外存搜索目录 访问文件打开表的索引叫文…

基于“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用

近年来&#xff0c;国内外学者在生态系统的敏感性、适应能力和潜在影响等方面开展了大量的生态脆弱性研究&#xff0c;他们普遍将生态脆弱性概念与农牧交错带、喀斯特地区、黄土高原区、流域、城市等相结合&#xff0c;评价不同类型研究区的生态脆弱特征&#xff0c;其研究内容…

大数据Doris(五十二):Doris数据导出案例和注意事项

文章目录 Doris数据导出案例和注意事项 一、Doris数据导出到HDFS案例 1、创建Doris表并插入数据 2、创建Export ,数据导出到 HDFS 3、查看任务 4、查看导出结果 二、Doris数据导出到本地案例 1、配置 fe.conf 2、Doris 数据导出到本地 三、注意事项 Doris数据导出案例…

kettle源码远程debug调试

一、kettle启动时指定debug端口号 windows下&#xff0c;修改bat执行文件&#xff0c;同理 linux修改sh执行文件 在java执行参数的末尾添加debug参数 address为debug端口 -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:transportdt_socket,servery,suspendn,address9080然…

从渲染流程、数据处理结构聊聊Flutter性能优化

不可否认 Flutter 是一个非常强大的移动应用开发框架&#xff0c;我们在技术架构选型时就是选用的 Flutter&#xff0c;特别是跨端能力属实很优秀&#xff0c;but 也逐渐发现在复杂的应用程序实现中&#xff0c;App 的性能会受到一些影响。 其实这个问题&#xff0c;我们内部也…

SpringCloud入门实战(九)- SpringCloud Config配置中心

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

java List集合使用笔记

1、List集合的特点 有序集合、有序的序列&#xff0c;用户可以精准的控制元素插入的位置通过索引访问元素可以搜索元素与Set不同&#xff0c;List允许重复的元素存在 2、List集合特有的方法 add(索引,元素) remove(索引)&#xff1a;返回的是被删除的索引 get(索引)&#xf…

Arduino uno 环境配置 for Mac

1、IDE 在官网下载 官网地址&#xff1a;https://www.arduino.cc/en/software 看到钱&#x1f4b0;不要怕&#xff0c;只是问你捐不捐款&#xff0c;不收钱&#xff0c;你直接安装就行 &#xff08;你也可以捐一点&#xff5e;&#xff09; 安装之后 2、安装驱动 地址 &…

单片机-矩阵键盘密码锁

89C52RC芯片 1.矩阵按键输入正确密码&#xff0c;LCD1602右上角显示ok&#xff0c;错误显示Err。 涉及文件&#xff1a; 1.main.c (#include<regx52.h>) 2.lcd1602.c lcd1602.h 3.Delay.c Delay.h 4.MatrixKey.c MetrixKey.h 共7项 代码 main.c #…

此导入从不用作值,必须使用 “import type“ ,因为 “importsNotUsedAsValues“ 设置为 “error“。

前言 最近电脑更新了一次系统&#xff0c;重启后在 VsCode中打开项目 &#xff0c;发现原本正常的代码出现了一堆语法提示。网上搜了一下&#xff0c;没有找到关于此问题的回答&#xff0c;不知道我是不是第一个遇到的。在此记录一下这次的经历&#xff0c;如果有其他人遇到&a…

蓝桥杯专题-试题版含答案-【6174问题】【笨小熊】【鸡兔同笼】【小学生算数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

突破APP广告收益天花板的多种数据优化方法

​APP开发者对于广告变现最关心的问题就是收益。事实上&#xff0c;广告收益与广告请求、曝光和点击等关键数据之间存在着密切的联系。这些数据的表现直接影响着广告的收益情况。 因此&#xff0c;开发者需要重视并优化这些关键链路数据。本文将介绍一些优化方法&#xff0c;帮…

zabbix 介绍及部署

目录 一、zabbix的基本概述 二、zabbix功能 &#xff08;一&#xff09;数据收集 &#xff08;二&#xff09;灵活的阈值定义 &#xff08;三&#xff09;高度可配置的告警 &#xff08;四&#xff09;实时图形 &#xff08;五&#xff09;网络监控功能 &#xff08;六…

牛客网专项练习——C语言错题集(10)

文章目录 两数相除后的数据类型if 语句表达式类似转义字符逗号表达式易错题指针概念异或刁钻题&#xff0c;多维数组地址自动变量 两数相除后的数据类型 C语言规定除法运算符( / )的运算结果的数据类型与被除数的数据类型保存一致&#xff0c;所以一个整数除以另一个整数的结果…

JPA 批量插入较大数据 解决性能慢问题

JPA 批量插入较大数据 解决性能慢问题 使用jpa saveAll接口的话需要了解原理&#xff1a; TransactionalOverridepublic <S extends T> List<S> saveAll(Iterable<S> entities) {Assert.notNull(entities, "Entities must not be null!");List<…

建设Web3需要Web2的人才?探索传统技能在Web3时代的作用

摘要&#xff1a;Web3作为下一代互联网技术的前沿&#xff0c;许多人关注着它的发展和应用。然而&#xff0c;建设Web3是否需要Web2的人才仍然是一个有争议的问题。 Web3作为下一代互联网技术&#xff0c;以去中心化、智能合约和用户自治等特点引起了广泛的关注。与此同时&…

基于STM32单片机的智能家居毕设

文章目录 一、硬件选型1、硬件清单2、硬件展示&#xff08;部分&#xff09; 二、效果展示1、整体效果展示2、显示屏&#xff08;触摸&#xff09;效果展示 三、功能分析1、系统总体结构框图2、主要包含的功能 四、怎么做&#xff1f;1、STM32单片机部分2、语音识别与播报部分3…

wamp环境解决局域网不能访问的问题!

安装好wamp后&#xff0c;想用手机通过局域访问电脑上wamp下的网页&#xff0c;结果出现如下提示403错误&#xff1a; 第一步&#xff1a;找到 conf 这个文件&#xff1a; 找到下图中红色方框中的onlineoffline tag - don’t remove&#xff0c;将原来的Require local替换为Re…

JMeter:如何开始简单的WEB压力测试?

目录 背景 如何开始简单的WEB压力测试 PutsReq网站截图 执行测试计划 背景 JMeter是一款广泛使用的性能测试工具&#xff0c;它可以模拟用户行为并生成负载&#xff0c;用于评估Web应用程序的性能和稳定性。 最近工作上被安排针对Web网站进行性能压测&#xff0c;以评估特…

chatgpt赋能python:关于Python除二取余法的优缺点分析

关于Python除二取余法的优缺点分析 Python是当前数据分析和科学计算最火热的语言之一&#xff0c;其中除二取余法是Python中很有趣的算法之一。它也是很常用的基础算法之一&#xff0c;特别是在图像处理和编码中&#xff0c;非常常用。除二取余法指的是一个数值除以二后的余数…