2440栈的实现类型、b系列指令、汇编掉用c、c调用汇编、切换工作模式、初始化异常向量表、中断处理、

我要成为嵌入式高手之4月11日51ARM第六天!!
————————————————————————————

b指令

标签:表示这条指令的名称,可跳转至标签

b指令:相当于goto,可随意跳转

如:finish为标签,b finish跳转至该位置

finish
    b finish   

bl指令:跳转之后将跳转前的位置存储到 lr(链接寄存器) 寄存器中

bx指令:将某个寄存器的保存的地址写入 pc 寄存器 

练习:用汇编写出1~100的累加和

	area reset, code, readonlycode32entrymov r0, #0mov r1, #0loopadd r1, r1, r0add r0, #1cmp r0, #100ble loopfinishb finishend

2440栈的实现类型 

        2440实现保护和恢复现场使用的栈是数组栈,即用一段连续的内存空间为栈提供空间。从数组栈的具体实现来看入栈的方式有四种做法:

  1. 空增:先写入数据,再让栈指针自增;
  2. 空减:先写入数据,再让栈指针自减;
  3. 满增:先让栈指针自增,再写入数据;
  4. 满减:先让栈指针自减,再写入数据。

        arm体系采用的方案是满减,但是在进行操作之前,我们必须告诉2440栈底的位置,这里我们把栈底设置为0x40001000,从地址0x40000000开始的0x1000这段内存空间对应的是2440内部的一段ram,总共4k。实际能够使用的内存空间为[0x40000000~0x40000FFF],

设置栈底指针寄存器: ldr sp =0x40001000

入栈保护指令stmfd(STMDB)

STMFD<c> <Rn>{!}, <registers>

其中Rn表示栈底指针寄存器,< registers >表示需要入栈保护的寄存器,!表示入栈之后sp自动自减。如:stmfd sp!, {r0, r1, r2, r3-r12, lr}
 

出栈恢复指令ldmfd(LDM/LDMIA/)

LDMFD<c> <Rn>{!}, <registers>

中Rn表示栈底指针寄存器,< registers >表示需要入栈保护的寄存器,!表示出栈之后sp自动自增。如:ldmfd sp!, {r0, r1, r2, r3-r12, lr}

汇编程序中调用c程序函数

步骤:

1、先用 import 声明c函数

        如:    import c_add

2、入栈保护{r0 - r12}

3、若是函数参数小于4个时,通过 r0 ~ r3 寄存器进行传参

4、函数调用完的返回值结果通过 r0 寄存器返回

5、若参数个数大于4个,从第五个开始要通过栈进行参数传参

6、出栈恢复{r0 - r12}

	import c_addstmfd sp!, {r0-r12}mov r0, #1mov r1, #2 mov r2, #3mov r3, #4 mov r4, #5stmfd sp!, {r4}bl c_addldmfd sp!, {r4}ldmfd sp!, {r0-r12

c程序中掉用汇编函数

1、import main

2、b main

3、export 汇编函数名

4、在main中声明汇编函数

5、在汇编函数结尾bx lr

如何切换工作模式

1、把r0中低5位清零

2、把r0中低五位设置为10000(user模式)

3、用msr指令将r0的值写入cpsr寄存器

	ldr sp, =0x40001000bic r0, r0, #0x1Forr r0, r0, #0x10msr cpsr_c, r0

为什么此处sp变为0?

答:此时的sp为sp_svc,不是user模式下的sp,故需要设置sp_user,且要从栈顶往后走1k

	ldr sp, =0x40001000bic r0, r0, #0x1Forr r0, r0, #0x10msr cpsr_c, r0ldr sp, =0x40001000sub sp, sp, #1024

cpsr中指令

msr指令:写入cpsr

mrs指令:读取cpsr中数据

启动代码

异常向量表

初始化代码:

	preserve8area reset, code, readonlycode32entry;用8个代码占用异常向量表的八个格式b startnopnopnopnopnopnopnopstartldr sp, =0x40001000;状态切换到user模式下mrs r0, cpsrbic r0, #0x1Forr r0, #0x10msr cpsr_c, r0ldr sp, =0x40001000sub sp, sp, #1024import mainb mainfinishb finishend

中断处理

中断类型:

软件中断SWI

SWI指令:发出一个软件中断,用法:SWI  #立即数

                  作用:产生一个软件中断

                  流程 :产生一个异常,进入svc模式;查询异常向量表(找软件中断0x08)

	;用8个代码占用异常向量表的八个格式b startnopb do_swinopnopnopnopnopstart;设置的是svc下的栈指针寄存器ldr sp, =0x40001000;状态切换到user模式下mrs r0, cpsrbic r0, #0x1Forr r0, #0x10msr cpsr_c, r0ldr sp, =0x40001000sub sp, sp, #1024import mainb maindo_swiimport swi_handlestmfd sp!, {r1-r12, lr}bl swi_handleldmfd sp!, {r1-r12, pc}^;^含义:不但要恢复现场,并且要恢复之前的工作模式export asm_swi
asm_swiswi #10bx lr;在写完函数之后都应该加上bx lr:将lr写入pc中

IRQ快速中断

初始化IRQ模式栈指针寄存器

	preserve8area reset, code, readonlycode32entry;用8个代码占用异常向量表的八个格式b startnopb do_swinopnopnopb do_interruptnopstart;设置的是svc下的栈指针寄存器ldr sp, =0x40001000;状态切换到user模式下mrs r0, cpsrbic r0, #0x1Forr r0, #0x12;切换到IRQ模式bic r0, r0, #(1 << 7);将中断允许清零,意为允许中断msr cpsr_c, r0;初始化的是IRQ模式下的栈指针寄存器ldr sp, =0x40001000sub sp, sp, #1024mrs r0, cpsrbic r0, #0x1Forr r0, #0x10msr cpsr_c, r0ldr sp, =0x40001000sub sp, sp, #2048import mainb maindo_interruptimport interrupt_handlesub lr, lr, #4;查询中断类型表得出快速中断需要lr寄存器的值-4stmfd sp!, {r1-r12, lr}bl interrupt_handleldmfd sp!, {r1-r12, pc}^do_swiimport swi_handlestmfd sp!, {r1-r12, lr}bl swi_handleldmfd sp!, {r1-r12, pc}^;^含义:不但要恢复现场,并且要恢复之前的工作模式export asm_swi
asm_swiswi #10bx lr;在写完函数之后都应该加上bx lr:将lr写入pc中	finishb finishend

MINI2440

将软件写入MINI2440,需要修改的操作

若将软件下载进板子成功,会出现如此字样

调试结果与软件调试结果应一致

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

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

相关文章

【C++】详解类的--封装思想(让你丝滑的从C语言过度到C++!!)

目录 一、前言 二、【面向过程】 与 【面向对象】 三、结构体 与 类 &#x1f34e;C中结构体的变化 &#x1f349;C中结构体的具体使用 &#x1f350;结构体 --> 类 ✨类-----语法格式&#xff1a; ✨类的两种定义方式&#xff1a; 四、类的访问限定符及封装【⭐】 …

acwing算法提高之图论--最近公共祖先

目录 1 介绍2 训练 1 介绍 本博客用来记录"对于有根图中&#xff0c;求最近公共祖先"的题目。 求解方法&#xff1a; 向上标记法。每次求两个结点的最近公共祖先的时间复杂度是O(N)。由于时间复杂度较高&#xff0c;通常不用。倍增法。 倍增法重要思路&#xff1…

labview中的同步定时结构

单帧定时循环定时比较精确&#xff0c;最常用的功能还是它的定时循环功能&#xff0c;定时循环允许不连接“循环条件”端子&#xff0c;可以连接定时循环“结构名称”端子&#xff0c;通过定时结构停止函数停止循环。 例子在附件中。

Red Hat Enterprise Linux提示:正在更新Suscription Manager软件仓库,无法读取客户身份,本系统尚未在权利服务器中注册。

1、问题概述&#xff1f; 在Red Hat Enterprise Linux系统中执行sudo yum -y update命令的时候提示如下问题。 正在更新 Subscription Management 软件仓库。无法读取客户身份 本系统尚未在权利服务器中注册。可使用 subscription-manager进行注册。 错误:在"/etc/yum.r…

RMT: Retentive Networks Meet Vision Transformers学习笔记

代码地址&#xff1a;GitHub - qhfan/RMT: (CVPR2024)RMT: Retentive Networks Meet Vision Transformer 论文地址&#xff1a;https://arxiv.org/pdf/2309.11523.pdf Transformer首次出现在自然语言处理领域&#xff0c;后来迁移到计算机视觉领域&#xff0c;在视觉任务中表现…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU使用containerd部署K8S 1.26.15集群(一主多从)》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本&#xff0c;出现了一个问题&#xff0c;就是在pod中访问百度网站&#xff0c;大…

u-boot 学习笔记:uclass 与 UCLASS_DRIVER 的理解

前言 u-boot 是嵌入式开发中经常使用的一种 bootloader&#xff0c;兼顾 boot &#xff08;启动&#xff09;与 loader&#xff08;引导&#xff09;等基础功能&#xff0c;应用于 ARM 等多个平台&#xff0c;通用性比较好&#xff0c;在嵌入式 Linux 开发中&#xff0c;用于引…

Form表单控件主要标签及属性。name属性,value属性,id属性详解。表单内容的传递流程,get和post数据传递样式。表单数据传递实例

form表单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

ubuntu 安装java

在Ubuntu上安装Java通常有两种方式&#xff1a;使用包管理器安装默认仓库中的Java或者手动安装Oracle JDK。 使用APT包管理器安装&#xff1a; sudo apt update sudo apt install default-jdk 手动安装Oracle JDK&#xff1a; 首先&#xff0c;你需要从Oracle官网下载JDK的…

PromptRPA-手机上的智能代理框架

PromptRPA的设计基于一个智能代理的多代理框架&#xff0c;这些代理模拟人类的认知功能&#xff0c;专门用于解释用户意图、管理RPA生成的外部信息以及在智能手机上执行操作。传统的RPA技术能有效地自动化图形用户界面&#xff08;GUI&#xff09;上的任务&#xff0c;通过模仿…

浏览器缓存(强缓存、协商缓存)

一、浏览器缓存 这一点主要解析浏览器缓存以及缓存机制的详细过程。 与缓存相关的状态码&#xff1a; 200 ok 从浏览器下载的最新资源 200 (from memory cache) 不进行http请求&#xff0c;直接从浏览器内存中读取的资源&#xff0c;页面关闭&#xff0c;则资源释放&a…

【攻防世界】bug

垂直越权IP绕过文件上传 文件上传绕过&#xff1a; 1. mime检测 2. 大小写绕过 3. 等价替换&#xff08;php5&#xff0c;php3&#xff09; 4. 利用JavaScript执行php代码&#xff08;正常的php代码会被检测到&#xff0c;所以就用JavaScript来执行&#xff09; <script lan…

Linxu vim详解(常用命令)

目录 强烈建议全文阅读&#xff01; vim是什么&#xff1f; 命令模式 底行模式&#xff1a;shift &#xff1b; 普通用户无法sodu&#xff1f; vim配置问题&#xff1a;&#xff08;一点都不重要&#xff09; vim是什么&#xff1f; Vs 2022是一款集成开发软件 vim是一…

记录一下MySQL8版本更改密码规则

#查看当前密码策略 show variables like validate_password%;#修改密码等级为low set global validate_password.policy LOW; #注意MySQL8版本这是点&#xff0c;不是_#修改密码长度为6 set global validate_password.length 6;#查询我的数据库中user表host和user select host,…

[C++][算法基础]SPFA求负权边(Dijkstra优化)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你判断图中是否存在负权回路。 输入格式 第一行包含整数 n 和 m。 接下来 m 行每行包含三个整数 x,y,z&#xff0c;表示存在一条从点 x 到点 y 的有向边&#xff0c;边长…

康耐视visionpro-CogFindCircleTool操作工具详细说明

◆CogFindCircleTool]功能说明: 通过用多个卡尺找到多个点来拟合所要找的圆 ◆CogFindCircleTool操作说明: ①.打开工具栏,双击或点击鼠标拖拽添加CogFindCircleTool工具 ②.添加输入图像,右键“链接到”或以连线拖拽的方式选择相应输入源 ③预期的圆弧:设置预期圆弧的…

消除 BEV 空间中的跨模态冲突,实现 LiDAR 相机 3D 目标检测

Eliminating Cross-modal Conflicts in BEV Space for LiDAR-Camera 3D Object Detection 消除 BEV 空间中的跨模态冲突&#xff0c;实现 LiDAR 相机 3D 目标检测 摘要Introduction本文方法Single-Modal BEV Feature ExtractionSemantic-guided Flow-based AlignmentDissolved…

基于Spring Boot实现的图书个性化推荐系统

基于Spring Boot实现的图书个性化推荐系统 开发语言&#xff1a;Java语言 数据库&#xff1a;MySQL工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统实现 前台首页功能模块 学生注册 登录 图书信息 个人信息 管理员功能模块 学生管理界面图 图书分类管理界面图 图书信息管…

A17 STM32_HAL库函数 之 GPIO扩展驱动程序所有函数的介绍及使用

A1 STM32_HAL库函数 之 HAL系统驱动程序所有函数的介绍及使用 1 该驱动函数预览1.1 HAL_GPIOEx_ConfigEventout1.2 HAL_GPIOEx_EnableEventout1.3 HAL_GPIOEx_DisableEventout 该文档修改记录&#xff1a;总结 1 该驱动函数预览 序号函数名描述1HAL_GPIOEx_ConfigEventout()配…

基于R语言实现的负二项回归模型【理解与实现】-理解负二项回归模型和泊松回归模型之间的区别

前言 我们可以在R语言中使用MASS包中的glm.nb函数来拟合负二项模型&#xff0c;以及使用glm函数来拟合泊松模型。以下是一个详细的过程&#xff0c;包括模拟数据的生成、模型的拟合、结果的比较和解释。 需要的包 if (!require("MASS")) install.packages("M…