一、跳转指令实现函数调用

  • LR(链接寄存器):保留函数返回地址

1.1 bl指令

        跳转指令bl,使LR保存当前函数进入前的下一条指令的地址,使函数调用后可以返回下一条指令的地址;

1.2 bx指令

        跳到目标地址;


1.3 栈的使用方法 

函数调用前,保护现场,调用后恢复现场 :

        使用栈(先进后出的特性);


栈的使用方法:

1.3.1.空增

        保护时,SP先写,再加;

        恢复时,SP先减,再读;

1.3.2 满增 

        保护时,SP先加,再写;

        恢复时,SP先读,再减;

1.3.3 满减

        保护时,SP先减,再写;

        恢复时,SP先读,再加;

1.3.4 空减

        保护时,SP先写,再减;

        恢复时,SP先加,再读;


1.4 ARM内核使用满减栈,使用方法

1.4.1 stmfd指令

入栈保护时,使用stmfd指令;

        stmfd <c><Rn>{!}, <registers>:

        其中:

  • !是让栈指针的内容随程序发生变化
  • 命令含义是把多个寄存器保存到Rn寄存器中
  • 举例:stmfd sp!, {r0-r12, lr}

1.4.2 ldmfd指令 

出栈恢复时,使用ldmfd指令;

        如:ldmfd sp!, {r0-r12, lr}

二、汇编与C语言混合调用

注意:由主调者负责保护现场和恢复现场

2.1 汇编为主调

 步骤:

  1. 首先确保SP指针有效
  2. 对函数声明:import(导入)         export(导出)
  3. 保护现场
  4. 使用bl跳转
  5. 恢复现场

注意:

若参数4个以内,R0-R3传递参数;

若有第五个参数,只能用栈的方式来传参:

  •         stmfd sp!, {r4}
  •         ldmfd sp!, {r4}

main.c 

start.s 

2.2 c为主调

在汇编中,声明c的函数,import main

                                         export asm_add 

main.c 

start.s 

三、准备工作

3.1 切换模式

CPS命令修改CPSR寄存器的M[4:0]

        如,CPS #<mode>

        (但不支持keil) 

解决方法:

(1) msr指令:读取cpsr、spsr寄存器

mrs r0, cpsr

(2) 于r0中,设置相关数据,设为User模式(10000)

bic r0, r0, #(0x1F << 0)    //低5位清零
orr r0, r0, #0x10           //第5位置一

(3) msr指令:写入cpsr、spsr寄存器

msr cpsr_c, r0

(4)将User模式下的SP进行设置

ldr sp, =0x40001000
sub sp, sp, #1024

3.2 异常处理被占用(解决),初始化异常向量表 

3.3 产生软件中断异常

加^,表示恢复执行前cpsr寄存器的值

四、IMX6ULL入门

  • Windows编写代码
  • Ubuntu编写代码

主要部分:

  1. 搭建编程环境
  2. 汇编点灯
  3. 下载程序

4.1 引脚的功能复用

  • 说明哪些引脚归哪个外设使用
  • PAD:引脚
  • MUX:功能复用

以点亮LED为例:

        GPIO1组的3号引脚

数据寄存器        GPIO data register(GPIOx_DR) 

方向寄存器 

 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】七种常见排序算法

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 欢迎来到排序算法的学习&#xff0c;恭喜你&#xff01;本期内容主要介绍排序算法&#xff0c;一起来探索吧~ &#xf…

Spring AOP 代理模式解析

一、核心概念&#xff1a;代理模式就像房屋中介 想象你要租一套房子&#xff1a; 你&#xff1a;租客&#xff08;业务调用者&#xff09;房东&#xff1a;房主&#xff08;真实业务对象&#xff09;中介&#xff1a;代理对象 传统方式&#xff08;无代理&#xff09; 租客…

智能制造——案例解读16页制造业指标体系搭建指导【附全文阅读】

文档的主要内容可以总结如下&#xff1a; **文档概述**&#xff1a; 本文档详细探讨了企业为何需要指标体系、指标体系的定义、如何搭建指标体系、如何有效拆解和管理指标&#xff0c;并最后提供了制造业指标体系的参考。 **主要内容**&#xff1a; 1. **企业为什么需要指标体系…

Pandas 数据清洗

数据清洗是数据分析过程中至关重要的一环&#xff0c;也是初学者最容易忽视的步骤。本文将详细介绍如何使用Pandas进行数据清洗&#xff0c;涵盖空值处理、日期格式修正、错误数据识别和重复数据删除四大核心内容。 1. Pandas 清洗空值 空值是数据集中最常见的问题之一&#…

C++容器之 forward_list (单向链表)使用说明

目录 1. 语法格式 2. 说明 3. 用法示例 1. 语法格式 描述控制可变长度元素序列的对象。该序列存储为单向(前向)链接的节点列表&#xff0c;每个节点包含一个 Type 类型的成员。 template <class Type, class Allocator allocator<Type>> class forward_lis…

ali 轻量服务器安装nginx

# Ubuntu sudo apt install nginx-light # 精简版 # CentOS sudo yum install nginx #启动并设置开机自启 sudo systemctl daemon-reload sudo systemctl start nginx sudo systemctl enable nginx #验证安装 nginx -v curl -I 127.0.0.1 #常用命令&#xff1a; # 重新加载配…

【设计模式】4.代理模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 代理模式 1. 第一版 class SchoolGirl:def __init__(self):self._name Nonepropertydef name(self):return self._namename.setterdef name(self, valu…

基于微信小程序的美食点餐订餐系统

文章目录 1. 项目概述2. 项目思维导图3. 系统架构特点4. 核心模块实现代码1. 登录注册2. 首页模块实现4. 分类模块实现5. 购物车模块实现6. 订单模块实现 5. 注意事项6. 项目效果截图7. 关于作者其它项目视频教程介绍 1. 项目概述 在移动互联网时代&#xff0c;餐饮行业数字化…

[neo4j]介绍4个开源的知识图谱项目

项目主要介绍几个开源项目&#xff1a; QASystemOnMedicalKG&#xff1a;医疗知识图谱问答 https://github.com/liuhuanyong/QASystemOnMedicalKG Agriculture_KnowledgeGraph&#xff1a;农业知识图谱 Financial-Knowledge-Graphs&#xff1a;小型金融知识图谱 stock-know…

20倍光学镜头怎么实现20+20倍数实现

1. 硬件选择 球机摄像头 选择40倍光学变焦的摄像头 &#xff1a;确保摄像头具有足够的变焦能力&#xff0c;同时考虑摄像头的分辨率、帧率、夜视功能等。 内置云台 &#xff1a;许多高端摄像头已经内置了云台功能&#xff0c;如果是这样&#xff0c;可以简化机械设计和电机控制…

Axios 在 Vue3 项目中的使用:从安装到组件中的使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

【Python打卡Day50】预训练模型与CBAM注意力@浙大疏锦行

现在我们思考下&#xff0c;是否可以对于预训练模型增加模块来优化其效果&#xff0c;这里我们会遇到一个问题: 预训练模型的结构和权重是固定的&#xff0c;如果修改其中的模型结构&#xff0c;是否会大幅影响其性能。其次是训练的时候如何训练才可以更好的避免破坏原有的特征…

ONLYOFFICE Jira 集成应用程序 4.0.0 发布,含新的文件格式支持等多个重大更新!

ONLYOFFICE 与 Jira 集成的重大更新现已发布&#xff01;使用 ONLYOFFICE Docs 在 Jira Software 中处理各种办公文档&#xff0c;从 4.0.0 版本开始&#xff0c;ONLYOFFICE 连接器允许您编辑 PDF 文件和表单、直接从编辑器创建新文件、可视化用户头像、在 Jira 平台内处理新文…

安装区块链相关Geth(基于CentOS7)

注&#xff1a;由于版本冲突问题&#xff0c;请严格按如下介绍版本进行安装 安装所需资料&#xff1a;通过网盘分享的文件&#xff1a;区块链_CSDN 链接: https://pan.baidu.com/s/1dn5xcLtwwFy90xhOWKiWyA?pwdzgzs 提取码: zgzs --来自百度网盘超级会员v6的分享 一、安装运…

系统分析师——计算机系统基础

系统分析师——计算机系统基础 引言 作为系统分析师学习的第一节课&#xff0c;计算机系统基础部分构建了整个知识体系的核心框架。本文将围绕计算机系统的层次结构、硬件组成、软件分类以及关键技术点进行详细总结&#xff0c;为后续深入学习奠定基础。 本节学习内容如下图&…

JS常用设计模式汇总

1、基于类的单例模式 // PageManager.js class PageManager {constructor(config) {if (!PageManager.instance) {this.config config;this.initialized false;PageManager.instance this;this.init();}return PageManager.instance;}init() {if (this.initialized) return…

迈向软件开发 T 型人才之路:构建多元能力体系

在软件开发的广袤天地里&#xff0c;T 型人才备受瞩目。这类人才犹如具备强大能量的 “多面手”&#xff0c;既有深入专精的技术能力&#xff0c;又有广泛多元的知识与技能储备&#xff0c;能够从容应对复杂多变的项目需求&#xff0c;引领行业创新发展。于当今社会而言&#x…

SALMONN-omni论文阅读

论文链接 项目链接 名词理解&#xff1a; backchanneling&#xff1a; 指的是听话人在不打断说话人的情况下&#xff0c;用简短的语气词或动作表示“我在听”“我理解了”的反馈。 常见示例包括&#xff1a; “嗯哼”&#xff08;“uh-huh”&#xff09; “对的”&#xff08…

区块链:什么是DeFi?

DeFi&#xff08;去中心化金融&#xff0c;Decentralized Finance&#xff09; 是一种基于区块链技术的金融生态系统&#xff0c;旨在通过去中心化的方式提供传统金融服务&#xff08;如借贷、交易、储蓄等&#xff09;&#xff0c;无需依赖银行、经纪商等中介机构。DeFi主要构…

idea编译器使用git拉取、提交非常慢的原因和解决方案

前言 最近在公司换了一个电脑,但是发现这个电脑用idea编译器使用git拉取、提交各种操作非常慢,有时候需要等10分钟左右,这明显是不对劲的,说明电脑的某些环境影响到git和idea之间的整合了。 目录 在idea拉取代码非常慢的原因 解决方案 在idea拉取代码非常慢的原因 经过排查…