嵌入式学习(Day 51:ARM指令/汇编与c语言函数相互调用)

1.Supervisor模式与SVC模式

  • Supervisor模式是ARM处理器的一个特权工作模式,允许执行特权指令和访问特权资源。
  • SVC模式(Supervisor Call)是与Supervisor模式相关的一个功能或指令,用于从用户模式切换到Supervisor模式,并触发系统服务例程的执行。
  • SVC不是一种独立的工作模式,而是与Supervisor模式协同工作,用于系统调用和异常处理。

        所以,Supervisor模式和SVC模式在ARM处理器中是不同的概念,但它们之间有密切的关联。SVC模式使用Supervisor模式的功能来提供系统服务。

2.指令+s的作用,影响N,Z,C,V位

        ARM指令中的“S”后缀用于指示该指令执行后是否更新程序状态寄存器(CPSR)的条件标志位。这些标志位可以用于后续的条件判断或分支操作,从而影响指令的执行顺序。

以下是具体功能和详细解释:

  • 条件标志位更新:当ARM指令后带有“S”后缀时,该指令执行后,程序状态寄存器的条件标志位(如N、Z、C、V等,分别代表负数、零、进位和溢出)将被刷新或更新。这些标志位经常用于对条件进行测试,例如是否溢出、是否进位等。

  • 影响指令执行顺序:根据这些条件标志位的变化,程序可以执行不同的分支或循环,从而影响指令的执行顺序。例如,可以使用这些标志位来判断一个加法操作是否导致溢出,然后根据结果选择不同的后续指令。

  • 指令格式:在ARM指令中,后缀“S”是可选的。当不使用“S”后缀时,指令执行后程序状态寄存器的条件标志位将不会发生变化。指令的一般格式可以表示为<opcode>{ <cond> } {S}<Rd>,<Rn>{, <operand2> },其中<opcode>是操作码,<cond>是可选的条件码,<Rd>是目标寄存器,<Rn>是存放第一操作数的寄存器,<operand2>是第二操作数。

  • 具体示例:以加法指令为例,ADD R3, R5, R8(没有使用“S”后缀)执行后,条件标志位将不会发生变化;而ADDS R3, R5, R8(使用了“S”后缀)执行后,条件标志位将根据结果刷新。

3.CPSR(程序状态寄存器)/SPSR(程序状态保存寄存器)

在ARM架构中,CPSR(Current Program Status Register,当前程序状态寄存器)和SPSR(Saved Program Status Register,程序状态保存寄存器)是两个重要的状态寄存器,它们在处理器中扮演着关键的角色。以下是关于这两个寄存器的详细解释:

        3.1. CPSR(当前程序状态寄存器)

        N和C标志位被“置位”,指的是这些标志位被设置为特定的值以表示某种状态或条件。

功能与作用

  • CPSR在用户级编程时用于存储条件码。
  • 它包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。

内容详解

  • 条件标志位:包括N、Z、C、V等,用于表示指令执行后的状态,如运算结果的符号、零、进位和溢出等。
  • 中断禁止位:包括I(IRQ中断禁止位)和F(FIQ中断禁止位),用于控制是否允许相应的中断发生。
  • 处理器模式标志位:指示处理器当前处于哪种模式,如用户模式、系统模式、中断模式等。

访问方式

  • CPSR在任何处理器工作模式下都可以被访问。

        3.2. SPSR(程序状态保存寄存器)

功能与作用

  • SPSR用于保存CPSR的状态,以便在异常返回后恢复异常发生时的工作状态。

内容详解

  • 当特定的异常中断发生时,SPSR会存放当前CPSR的内容。
  • 在异常中断退出时,可以使用SPSR来恢复CPSR的状态。

注意

  • 由于用户模式和系统模式不是异常中断模式,所以它们没有对应的SPSR。
  • 如果在用户模式或系统模式下尝试访问SPSR,将会产生不可预知的后果。

总结

  • CPSR是ARM处理器中的核心寄存器之一,用于存储处理器的状态信息,并在各种模式下提供对中断和其他功能的控制。
  • SPSR作为CPSR的备份,用于在异常处理过程中保存和恢复处理器的状态。这两个寄存器共同确保了ARM处理器在各种复杂操作中的稳定性和可靠性。

4.跳转指令和加载指令

   4.1跳转指令(b/bl/bx)

        b:无条件跳转指令;

        bl:用于函数调用,并在lr寄存器中保存返回地址。

        bl和b之间的区别就在于bl会在lr寄存器中保存回来的地址。

        bx:回到调用处,即:返回主调函数。

        bxgt:满足gt条件时,回到调用处。(gt:>,        ge:>=)

  bx 基于寄存器的内容进行跳转,并支持 ARM/Thumb 切换。

4.2 加载指令(LDR)

  • LDR指令
    • 功能:用于从内存中读取一个32位的字数据到目的寄存器中。
    • 格式LDR{条件} 目的寄存器, <存储器地址>
    • 示例
      • LDR R0, [R1]:将存储器地址为R1的字数据读入寄存器R0。
      • LDR R0, [R1, #8]:将存储器地址为R1+8的字数据读入寄存器R0。
    • 特点
      • 寻址方式灵活多样,支持直接地址、基址加偏移量等。
      • 当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
    • bic指定位清零指令:
    • BIC{S}<c> <Rd>, <Rn>, #<const>;将rn中的字数据const为1的比特清零,把结果放入rd
      • orr指定位置位指令:
      • ORR{S}<c> <Rd>, <Rn>, #<const>

5.ARM中常见的数据处理指令

  • ADD

    • 含义:加法指令。
    • 使用:将两个寄存器或立即数与一个寄存器相加,并将结果存储在一个寄存器中。
    • 示例ADD R1, R2, R3 将 R2 和 R3 的值相加,并将结果存储在 R1 中。
  • SUB

    • 含义:减法指令。
    • 使用:从一个寄存器中减去另一个寄存器或立即数,并将结果存储在一个寄存器中。
    • 示例SUB R1, R2, R3 从 R2 中减去 R3 的值,并将结果存储在 R1 中。

ARM指令集中的数据处理指令是用于在寄存器中执行数学运算、逻辑运算以及数据传送的指令。这些指令在ARM架构中扮演着核心角色,允许CPU高效地执行各种计算任务。以下是一些ARM中常见的数据处理指令,按照其功能分类进行归纳:

  1. 数据传送指令
    • MOV指令:用于将一个寄存器或立即数的值传送到另一个寄存器。例如,MOV R1, R0 将寄存器R0的值传送到寄存器R1。
    • MVN指令:是数据取反传送指令,将一个寄存器或立即数的反码传送到目标寄存器。例如,MVN R0, #0 将立即数0取反后传送到寄存器R0。
  2. 算术运算指令
    • ADD指令:用于将两个寄存器或立即数相加,并将结果存放到目的寄存器中。例如,ADD R0, R1, R2 将R1和R2的值相加后存放到R0。
    • ADC指令:带进位的加法指令,用于将两个寄存器或立即数相加,并加上CPSR中的C条件标志位的值,然后将结果存放到目的寄存器中。
  3. 逻辑运算指令(虽然参考文章中没有直接提及逻辑运算指令,但它们是数据处理指令的重要部分):
    • AND指令:用于将两个寄存器或立即数进行逻辑与运算。
    • ORR指令:用于将两个寄存器或立即数进行逻辑或运算。
    • EOR指令:用于将两个寄存器或立即数进行逻辑异或运算。
  4. 比较指令
    • CMP指令:用于比较两个寄存器或立即数的值,并更新CPSR中的条件标志位,但不保存运算结果。
    • CMN指令:将一个寄存器或立即数的取反值与另一个寄存器或立即数进行比较,并更新CPSR中的条件标志位。
  5. 移位指令(虽然参考文章中没有直接提及移位指令,但它们也是数据处理指令的一部分):
    • LSL指令:逻辑左移指令,将寄存器的内容向左移动指定的位数。
    • LSR指令:逻辑右移指令,将寄存器的内容向右移动指定的位数。
    • ASR指令:算术右移指令,在移位时保留符号位。
  6. 特殊数据处理指令
    • MOVS指令:与MOV指令类似,但会更新CPSR中的条件标志位。
    • BIC指令:位清零指令,用于将某个寄存器中的特定位清零。

这些指令共同构成了ARM指令集中的数据处理部分,允许开发者在ARM架构的CPU上执行各种复杂的计算任务。需要注意的是,ARM指令集在不同的版本(如ARMv7、ARMv8等)中可能会有所不同,上述指令是ARM指令集中常见的和通用的部分。

6.栈的实现类型:

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

  • 空增:先写入数据,再让栈指针自增;(栈指针平时指向空)
  • 空减:先写入数据,再让栈指针自减;(栈指针一开始指向栈顶)
  • 满增:先让栈指针自增,再写入数据;(栈指针平时指向最高层数据)
  • 满减:先让栈指针自减,再写入数据。(栈指针指向栈顶的上一个空位置)

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

        6.1入栈保护指令stmfd(STMDB)

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

其中Rn表示栈底指针寄存器,< registers >表示需要入栈保护的寄存器,!表示入栈之后sp自动自减。如:

stmfd sp!, {r0, r1, r2, r3-r12, lr}               ;保护现场

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

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

中Rn表示栈底指针寄存器,< registers >表示需要入栈保护的寄存器,!表示出栈之后sp自动自增。如:

ldmfd sp!, {r0, r1, r2, r3-r12, lr}   ;恢复现场

7.汇编与C语言代码互相调用规则

7.1在汇编中调用c语言编写的函数

        设有c语言定义的函数void func_c(void);在汇编代码中调用该函数,只需用import导入声明函数名即可,之后就可以使用bl指令调用该函数,注意,既然是调函数,就一定要保护现场。

        7.2 向c函数传参

向c函数传参的方法很简单,如果参数个数小于等于4个,就直接用r0~r3传参,c函数返回值通过r0寄存器返回:

设有c函数:

        int add_c(int a, int b, int c, int d)

        {

        return a + b + c + d;

  }

如果参数个数大于4个,从第五个参数开始就需要通过栈来传参(前4个参数传参,通过r0-r3传参,返回值用r0传参)

在c语言中调用汇编编写的函数类似,不过在汇编中用export声明函数,同时需要在c语言中用extern声明函数,按照标准,调用者负责保护现场和恢复现场

传参方法于此类似

8.切换ARM内核的工作模式

        mrs:读取CPSR的状态;

        msr:写入CPSR寄存器。

        切换工作方式的思路很简单,由于内核的工作模式是由cpsr寄存器的低5位来设置的,那么就可以先把cpsr读出来,更改低5位之后再设置进去。这里读取cpsr使用mrs指令,写cpsr寄存器用msr指令,需要注意的是在keil环境下写cpsr需要写成:   msr cpsr_c r0;将r0的值写入到cpsr寄存器

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++ | 类型转换】转换构造函数、类型转换运算符 详解及例子源码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 本文未经允许…

认识100种电路之稳压电路

在电子电路中&#xff0c;稳压电路扮演着至关重要的角色。那么&#xff0c;为什么电路需要稳压&#xff1f;稳压的原理又是什么&#xff1f;以及稳压需要用到哪些元器件&#xff0c;数量又有多少呢&#xff1f;今天&#xff0c;就让我们一同揭开稳压电路的神秘面纱。 【电路为什…

【原创图解 算法leetcode 146】实现一个LRU缓存淘汰策略策略的数据结构

1 概念 LRU是Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0c;是一种常见的缓存淘汰算法。 其核心思想为&#xff1a;当内存达到上限时&#xff0c;淘汰最久未被访问的缓存。 2 LeetCode LeetCode: 146. LRU缓存 3 实现 通过上面LRU的淘汰策略可知&#…

Zookeeper节点ACL权限设置—digest模式

ACL全称为Access Control List&#xff08;访问控制列表&#xff09;&#xff0c;用于控制资源的访问权限。ZooKeeper使用ACL来控制对其znode&#xff08;ZooKeeper数据树的数据节点&#xff09;的访问。 zk利用ACL策略控制节点的访问权限: CREATE c 可以创建子节点 DELETE …

Java中System的用法

System指的是当前进程运行的操作系统&#xff0c;属于java.lang包下面的类 常见的用法有以下几种&#xff1a; 第一种简单,我们直接上第二种方法吧 currentTimeMills()用法 // 演示currentTimeMillis方法public static void main(String[] args) {// 获取当前时间所对应的毫秒…

《红黑树大能量——set,map封装模拟》

前言 书接上篇博客《手撕红黑树》&#xff0c;我们学习到了红黑树是如何通过其内部方式来管理数据的&#xff0c;本篇文章将基于上篇文章继续探讨红黑树的更多应用。set&#xff0c;map是STL库中很重要的容器&#xff0c;他们就是利用红黑树作为底层来实现的&#xff0c;今天让…

入门Java爬虫:认识其基本概念和应用方法

Java爬虫初探&#xff1a;了解它的基本概念与用途&#xff0c;需要具体代码示例 随着互联网的快速发展&#xff0c;获取并处理大量的数据成为企业和个人不可或缺的一项任务。而爬虫&#xff08;Web Scraping&#xff09;作为一种自动化的数据获取方法&#xff0c;不仅能够快速…

数据结构--堆(图文)

在开始学习堆之前&#xff0c;我们要先简单了解二叉树 二叉树 一棵二叉树是结点的一个有限集合&#xff0c;该集合: 为空由一个根结点加上两棵子树&#xff08;左子树和右子树&#xff09; 特殊的二叉树&#xff1a; 满二叉树&#xff1a;一个二叉树&#xff0c;如果每一…

【高考】人生规划指南

作为一个正处在这个选择的十字路口的高考考生&#xff0c;我认为在选择专业和学校时&#xff0c;要根据自己的具体情况和个人目标来权衡。首先&#xff0c;我认为专业是首要考虑因素。因为专业是直接决定未来职业发展方向的&#xff0c;如果不喜欢或者不适合的专业选择&#xf…

1976 ssm 营地管理系统开发mysql数据库web结构java编程计算机网页源码Myeclipse项目

一、源码特点 ssm 营地管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开…

C++【引用】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

2024年Stable Diffusion应用入门,AI绘画超详细兼职攻略,从零开始!

. AI绘画&#xff1a; 利用AI工具在AI绘画上的应用非常广泛&#xff0c;涵盖了从艺术创作到工业设计等多个领域。 目前市面上有许多AI绘画软件和工具&#xff0c;适合不同需求的用户。 例如&#xff0c;Midjourney、DALL-E 2、Stable Diffusion、DreamStudio等都是较为知名的…

docker配置容器——环境变量

很多时候&#xff0c;我们需要为运行在容器中的应用程序提供一些配置。配置通常用于允许同一个容器在完全不同的环境中运行&#xff0c;例如开发、测试或生产环境。在 Linux 中&#xff0c;配置值通常通过环境变量提供。我们已经了解到&#xff0c;在容器内运行的应用程序与其主…

快手正式推出Vision Pro版本,引领虚拟现实社交新潮流

6月28日&#xff0c;快手正式推出其专为Apple Vision Pro打造的版本——快手vp版app&#xff0c;成为国内首批登陆Apple Vision Pro的短视频平台。 借助先进的虚拟现实技术&#xff0c;用户可以在快手上体验更真实生动的视频内容&#xff0c;无论是观看趣味短视频内容&#xf…

Ubuntu20.04安装Prometheus监控系统

环境准备&#xff1a; 服务器名称内网IP公网IPPrometheus服务器192.168.0.23047.119.21.167Grafana服务器192.168.0.23147.119.22.8被监控服务器192.168.0.23247.119.22.82 更改主机名方便辨认 hostnamectl set-hostname prometheus hostnamectl set-hostname grafana hostn…

电脑文件夹里的表格删除了怎样恢复?别急,可这样做

在日常工作中&#xff0c;我们经常会使用到各种电子表格来记录、整理和分析数据。然而&#xff0c;有时由于操作失误或其他原因&#xff0c;我们可能会不小心将电脑文件夹中的重要表格删除。面对这种情况&#xff0c;许多人可能会感到惊慌失措&#xff0c;担心数据丢失会给工作…

【wsl2】WIN11借助wsl2挂载ext4磁盘

我有一块ext4文件系统的硬盘&#xff0c;想要在win11上访问&#xff0c;我们可以通过wsl2进行挂载 wsl2的安装就跳过了&#xff0c;可以自行搜索安装。 安装完成后 >>> GET-CimInstance -query "SELECT * from Win32_DiskDrive"通过这个命令&#xff0c;可…

2024下半年必追国漫片单,谁将问鼎巅峰?

随着2024年上半年的落幕&#xff0c;国漫市场再度迎来了百花齐放的盛况。从经典续作到全新IP&#xff0c;从玄幻到科幻&#xff0c;每一部作品都以其独特的魅力吸引着观众的目光。本期为大家盘点下半年值得一看的国漫佳作&#xff0c;大胆预测&#xff0c;谁将成为这场神仙打架…

STM32开发方式的演变与未来展望

一、STM32开发方式的演变 自2007年STM32微控制器首次亮相以来&#xff0c;其开发方式经历了从寄存器到标准库&#xff0c;再到HAL&#xff08;硬件抽象层&#xff09;的演变。 1.寄存器开发&#xff08;2007年-2010年代初&#xff09; 最初&#xff0c;由于初期缺乏足够的软…

基于NURBS曲线的数据拟合算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1NURBS曲线基础 4.2 数据拟合原理 5.完整程序 1.程序功能描述 基于NURBS曲线的数据拟合算法,非均匀有理B样条&#xff08;Non-Uniform Rational B-Splines&#xff0c;简称NURBS&#xf…