当前位置: 首页 > news >正文

C语言面试之旅:掌握基础,探索深度(面试实战之ARM架构二)

        读别人的代码,就像撕洋葱,每读一层,哭一遍。

引言        

        ARM 处理器冯诺依曼存储结构程序空间RAM 空间IO 映射空间统一编址,除对对RAM 操作以外,对外围IO、程序数据的访问均要通过加载/存储指令进行

ARM 的加载/存储指令是可以实现字、半字、无符/有符字节操作;批量加载/存储指令可实现一条指令加载/存储多个寄存器的内容,大大提高效率。

 

一.ARM指令集

        ARM指令集是一种计算机ARM操作指令系统,可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类。

        其中,跳转指令包括B(不带返回)、BL(带返回跳转)、BLX(带返回和状态切换)、BX(带状态切换)等;数据处理指令包括MOV(数据传送)、MVN(数据取反传送)、CMP(比较指令)、CMN(反值比较)、TST(位测试)、TEQ(相等测试)、ADD(加)、ADC(带进位加)、SUB(减法指令)、SBC(带借位减法)、RSB(逆向减法指令)、RSC(带借位的逆向减法)、AND(逻辑与指令)、ORR(逻辑或指令)、EOR(逻辑异或)、BIC(位清楚指令)等;程序状态寄存器访问指令包括MRS(程序状态寄存器到通用寄存器的数据传送指令)。

 

1.加载/存储指令

        这些指令用于在内存中读取或写入数据。例如,LDR(加载寄存器)和STR(存储寄存器)是常用的加载/存储指令。

LDR指令用于从内存读取数据放入寄存器中;STR 指令用于将寄存器中的数据保存到内存。指令格式如下:LDR{cond}{T} Rd,<地址>;加载指定地址上的数据(字),放入Rd中STR{cond}{T} Rd,<地址>;存储数据(字)到指定地址的存储单元,要存储的数据在Rd中LDR{cond}B{T} Rd,<地址>;加载字节数据,放入Rd中,即Rd最低字节有效,高24位清零STR{cond}B{T} Rd,<地址>;存储字节数据,要存储的数据在Rd,最低字节有效其中,T 为可选后缀,若指令有T,那么即使处理器是在特权模式下,存储系统也将访问看
成是处理器是在用户模式下。T在用户模式下无效,不能与前索引偏移一起使用T。

 

2.协处理器指令

        这些指令用于与协处理器进行通信,以执行某些特定的操作。例如,CPSID(禁用协处理器)和CPSIE(启用协处理器)是常用的协处理器指令。

1. CDP 协处理器数据操作指令
ARM 处理器通过CDP 指令通知ARM 协处理器执行特定的操作。该操作由协处理器完成,即对命令的参数的解释与协处理器有关,指令的使用取决于协处理器。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:CDP{cond}coproc,opcodel,CRd,CRn,CRm{,opcode2}其中: coproc 指令操作的协处理器名。标准名为pn,n 为0~15。opcodel 协处理器的特定操作码。CRd 作为目标寄存器的协处理器寄存器。CRN 存放第1 个操作数的协处理器寄存器。CRm 存放第2 个操作数的协处理器寄存器。Opcode2 可选的协处理器特定操作码。CDP 指令举例如下:CDP p7,0,c0,c2,c3,0 ;协处理器7 操作,操作码为0,可选操作码为0CDP p6,1,c3,c4,c5 ;协处理器操作,操作码为12. LDC 协处理器数据读取指令
LDC指令从某一连续的内存单元将数据读取到协处理器的寄存器中。协处理器数据的数据的传送,由协处理器来控传送的字数。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:LDC{cond}{L} coproc,CRd,<地址>其中: L 可选后缀,指明是长整数传送。coproc 指令操作的协处理器名。标准名为pn,n 为0~15CRd 作为目标寄存的协处理器寄存器。<地址> 指定的内存地址LDC 指令举例如下:LDC p5,c2,[R2,#4];读取R2+4指向的内存单元的数据,传送到协处理器p5的c2寄存器中LDC p6,c2,[R1] ;读取是指向的内存单元的数据,传送到协处理器p6的c2 寄存器中3. STC 协处理器数据写入指令
STC指令将协处理器的寄存器数据写入到某一连续的内存单元中。
进行协处理器数据的数据传送,由协处理器来控制传送的字数。
若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:STC{cond}{L} coproc,CRd,<地址>其中: L 可选后缀,指明是长整数传送。coproc 指令操作的协处理器名。标准名为pn,n 为0~15CRd 作为目标寄存的协处理器寄存器。<地址> 指定的内存地址STC 指令举例如下:STC p5,c1,[R0]STC p5,c1,[Ro,#-0x04]4. MCR  ARM寄存器到协处理器寄存器的数据传送指令
MCR 指令将ARM 处理器的寄存器中的数据传送到协处理器的寄存器中。
若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:MCR{cond}coproc,opcodel,Rd,CRn,CRm{,opcode2}其中:coproc 指令操作的协处理器名。标准名为pn,n 为0~15。cpcodel 协处理器的特定操作码。RD 作为目标寄存器。CRn 存放第1 个操作数的协处理器寄存器CRm 存放第2 个操作数的协处理器寄存器。Opcode2 可选的协处理器特定操作码。MCR 指令举例如下:MCR p6,2,R7,c1,c2,MCR P7,0,R1,c3,c2,1,5. MRC 协处理器寄存器到ARM寄存器到的数据传送指令
MRC 指令将协处理器寄存器中的数据传送到ARM 处理器的寄存器中。
若协处理器不能成功地执行该操作。将产生未定义异常中断。指令格式如下:MRC {cond}coproc,opcodel,Rd,CRn,CRm{,opcode2}其中:coproc 指令操作的协处理器名。标准名为pn,n为0~15。opcodel 协处理器的特定操作码。Rd 作为目标寄存器。CRn 存放第1 个操作数的协处理器寄存器。CRm 存放第2 个操作数的协处理器寄存器。opcode2 可选的协处理器特定操作码。MRC 指令举例如下:MRC p5,2,R2,c3,c2MRC p7,0,R0,c1,c2,1

 

3.异常产生指令    

        ARM指令集中提供了两条产生异常的指令,通过这两条指令可以用软件的方法实现异常。其中一条指令是SWI(Software Interrupt),用于产生软中断,从而实现从用户模式变换到管理模式。另一条指令是HVC(Half-word Virtual Control),用于产生半虚拟控制异常。

        SWI指令的语法格式为SWI{<cond>} <immed_24>,其中cond表示指令执行的条件,immed_24表示24位的立即数,指定了用户请求的类型。在执行SWI指令时,CPSR保存到管理模式的SPSR中,执行转移到SWI向量,在管理模式下执行相应的中断服务程序。

        HVC指令的语法格式为HVC imm8,其中imm8表示8位的立即数,用于选择要触发的异常类型。执行HVC指令时,处理器会切换到管理模式,并触发相应的异常。

        需要注意的是,使用异常产生指令需要谨慎处理异常的优先级、嵌套和异常返回等问题,以确保程序的正确性和稳定性。

//SWI指令产生软中断
MOV R0, #12 ; 设置12号软中断  
SVC 0      ; 产生软中断,中断号为0
在这个例子中,指令MOV R0, #12将寄存器R0的值设置为12,表示请求12号软中断。
指令SVC 0产生一个软中断,中断号为0,并将程序的控制流转移到相应的中断服务程序。

//SWI指令产生软中断并传递参数
MOV R0, #34 ; 设置功能号为34  
SWI 12      ; 产生软中断,中断号为12,传递功能号34给中断服务程序
在这个例子中,指令MOV R0, #34将寄存器R0的值设置为34,表示请求的服务
类型的功能号为34。指令SWI 12产生一个软中断,中断号为12,并将功能号34
传递给相应的中断服务程序。

4.跳转指令

两种方式可以实现程序的跳转:

(1)使用跳转指令直接跳转,跳转指令有跳转指令B,带链接的跳转指令BL ,带状态切换的跳转指令BX。

(2)直接向PC 寄存器赋值实现跳转。

1. B 跳转指令, 跳转到指定的地址执行程序。B{cond} label举例如下:B WAITA ;跳转到WAITA 标号处B 0x1234 ;跳转到绝对地址0x1234 处跳转到指令B 限制在当前指令的±32Mb 的范围内。2. BL 带链接的跳转指令, 指令将下一条指令的地址拷贝到R14(即LR)链接寄存器中,然后跳转到指定地址运行程序。BL{cond} label举例如下:BL DELAY跳转指令B 限制在当前指令的±32MB 的范围内。BL 指令用于子程序调用。3. BX 带状态切换的跳转指令, 跳转到Rm 指定的地址执行程序,若Rm 的位[0]为1,则跳转时自动将CPSR 中的标志T 置位,即把目标地址的代码解释为Thumb代码;若Rm 的位[0]为0,则跳转时自动将CPSR 中的标志T 复位,即把目标地址的代码解释为ARM代码。指令格式如下:BX{cond} Rm举例如下:ADRL R0,ThumbFun+1BX R0 ;跳转到R0 指定的地址,并根据R0 的最低位来切换处理器状态4. BLX, BLX目标地址:跳转,改变状态及保存PC值

五.数据处理指令

        包括ADD(加法指令)、ADC(带进位加法指令)、SUB(减法指令)、SBC(带借位减法指令)、RSB(逆向减法指令)和RSC(带借位的逆向减法指令)等。这些指令用于对两个操作数进行算术运算,并将结果存储在目标寄存器中。

//ADD指令将两个寄存器相加,并将结果存储到目标寄存器中
ADD R1, R2, R3 ; 将R2和R3相加,结果存储到R1中

六.程序状态寄存器处理

        MRS(程序状态寄存器到通用寄存器的数据传送指令)和MSR(通用寄存器到程序状态寄存器的数据传送指令)。这些指令用于将程序状态寄存器的值读取到通用寄存器中或将通用寄存器的值写入到程序状态寄存器中。

//MSR指令将通用寄存器的值写入到程序状态寄存器中:MSR PSR, R0      ; 将R0的值写入到PSR中

二.ARM指令集具有以下特点

  1. 32位指令集:ARM指令集使用32位的指令格式,每个指令通常由操作码和操作数组成。
  2. 支持条件执行:ARM指令集支持条件执行,即只有满足特定的条件时才会执行某些指令。
  3. 支持寄存器操作:ARM指令集支持对寄存器进行操作,包括对寄存器进行读取、写入、移位等操作。
  4. 支持内存访问:ARM指令集支持对内存进行访问,包括读取和写入操作。
  5. 支持协处理器操作:ARM指令集支持与协处理器进行通信,以执行某些特定的操作。
  6. 支持异常处理:ARM指令集支持触发异常并进行处理。

相关文章:

C语言面试之旅:掌握基础,探索深度(面试实战之ARM架构二)

读别人的代码&#xff0c;就像撕洋葱&#xff0c;每读一层&#xff0c;哭一遍。 引言 ARM 处理器是冯诺依曼存储结构&#xff0c;程序空间、RAM 空间及IO 映射空间统一编址&#xff0c;除对对RAM 操作以外&#xff0c;对外围IO、程序数据的访问均要通过加载/存储指令进…...

Axios详解及运用案例

前言 Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js。它允许开发者使用异步的方式发送 HTTP 请求,同时提供了一个简单、方便的 API 来处理这些请求和响应。 主要特性 Axios 的主要特性包括: 支持 Promise API:Axios 的所有函数都返回一个 Promise 对象…...

期刊影响因子和期刊分区(国内-中科院/国外-JCR分区)

总结&#xff1a; SCI就是一个WOS中的一个科学类引文数据库&#xff0c;是理科方向的&#xff1b;SSCI是当中的社会科学类引文数据库&#xff0c;也就是文科方向的&#xff1b;SCIE&#xff1a;Science Citation Index-Expanded&#xff08;SCI-E&#xff0c;科学引文索引&…...

R语言gWQS包在加权分位数和回归模型的应用

在流行病学研究中&#xff0c;相较于单一因素的暴露&#xff0c;多因素同时暴露的情况更为常见。传统模型在评价多因素联合暴露时存在数据维度高、多重共线性等问题. WQS 回归模型的基本原理是通过分位数间距及加权的方法&#xff0c;将多种研究因素的效应综合成为一个指数&…...

【Makelist】release无法生成pdb

记录makelist使用中遇到的问题 一、release版无法生成pdb 【解决方法】&#xff1a;需要在最大级的Makelist下的设置编译器选项添加如下标记 #release 链接库生成pdbSET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")#lib的 release链接库生成pdbSET…...

【Linux】信号的保存和捕捉

文章目录 一、信号的保存——信号的三个表——block表&#xff0c;pending表&#xff0c;handler表sigset_t信号集操作函数——用户层sigprocmask和sigpending——内核层 二、信号的捕捉重谈进程地址空间&#xff08;第三次&#xff09;用户态和内核态sigaction可重入函数volat…...

Sourcepawn脚本入门(二)命令与事件监听

&#x1f34e;Sourcepawn脚本入门(二)命令与事件监听 &#xff08;控制台&#xff09;命令是常用的插件形式&#xff0c;eg. noclip …等都是常用的命令&#xff0c;在游戏中使用也很容易,souremod可以注册自己的命令。 事件的监听则需要考虑到不同的起源游戏支持的事件不同&am…...

java-poi操作笔记

row表示行&#xff0c;cell表示row中的第几个cell package sample.Utils;import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Workbook; impor…...

PHP:js中怎么使用PHP变量,php变量为数组时的处理

方法一&#xff1a;使用内嵌 PHP 脚本标记 1、简单的拼接 使用内嵌的 PHP 脚本标记 <?php ?> 将 PHP 变量 $phpVariable 的值嵌入到 JavaScript 代码中。 <?php $phpVariable "Hello, World!"; ?><script> // 将 PHP 变量的值传递给 JavaS…...

网工学习7-配置 GVRP 协议

7.1GARP概述 GARP(Generic Attribute Registration Protocol)是通用属性注册协议的应用&#xff0c;提供 802.1Q 兼容的 VLAN 裁剪 VLAN pruning 功能和在 802.1Q 干线端口 trunk port 上建立动态 VLAN 的功能。 GARP 作为一个属性注册协议的载体&#xff0c;可以用来传播属性…...

python:格式化输出指定内容

python&#xff1a;格式化输出指定内容 当涉及到在Python中格式化输出指定内容时&#xff0c;有几种方法可以让您的输出更加清晰和易读。Python的f-string&#xff08;格式化字符串&#xff09;是一种简洁而强大的工具&#xff0c;可以帮助您以所需的格式输出数据。 首先&…...

【C语言】7-35 强迫症 分数 10

7-35 强迫症 分数 10 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 小强在统计一个小区里居民的出生年月&#xff0c;但是发现大家填写的生日格式不统一&#xff0c;例如有的人写 199808&#xff0c;有的人只写 9808。有强迫症的小强请你写个程序&#xff0c;把所有人的…...

如何快速了解一家公司?

在炒股过程中&#xff0c;我们想要了解一家公司是否具有投资价值&#xff0c;需要查看和阅读很多公司的相关资料。股民们自行去查询往往会花费很多的时间精力&#xff0c;所以专业的炒股软件一般都会给股民提供这些现成的资料。 在金斗云智投APP内&#xff0c;进入到个股详情页…...

ZPLPrinter Emulator SDK for .NET 6.0.23.1123​ Crack

ZPLPrinter Emulator SDK for .NET 适用于 .NET 的 ZPLPrinter 仿真器 SDK 允许您通过编写 C# 或VB.NET 代码针对任何 .NET Framework、.NET CORE、旧版 ASP.NET MVC 和 CORE、Xamarin、Mono 和通用 Windows 平台 (UWP) 作业。 适用于 .NET 的 ZPLPrinter 仿真器 SDK 允许您将…...

查收查引(通过文献检索开具论文收录或引用的检索证明)

开具论文收录证明的 专业术语为 查收查引&#xff0c;是高校图书馆、情报机构或信息服务机构提供的一项有偿服务。 因检索需要一定的时间&#xff0c;提交委托时请预留足够的检索时间。 一般需要提供&#xff1a;论文题目、作者、期刊名称、发表年代、卷期、页码。 目录 一、查…...

Python一帮一

在当前尚未分组的学生中&#xff0c;将名次最靠前的学生与名次最靠后的异性学生分为一组。 输入格式&#xff1a; 输入第一行给出正偶数N&#xff08;≤50&#xff09;&#xff0c;即全班学生的人数。此后N行&#xff0c;按照名次从高到低的顺序给出每个学生的性别&#xff0…...

学员追访 | “IC的标签并不是只有高薪与965”

大家好&#xff0c;我是08期的学员小D 。 很开心能在这里与大家分享我的学习、工作经历&#xff0c;我毕业于一所双非本科院校。现在已经入职五个月了&#xff0c;很满意目前的薪资水平和工作状态。 接下来我把我的学习经历和求职经验给大家做个分享&#xff0c;希望能够帮到…...

LeetCode(39)赎金信【哈希表】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 赎金信 1.题目 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字…...

输入日期求n天后

题目要求&#xff1a;输入一个日期startdate年月日和days天数&#xff08;>1&#xff09;&#xff0c;输出自该日期days天后的日期enddate。 要求输出和输出的年份为四位整数&#xff0c;输入时对输入数据的有效性进行检查&#xff1b;同时考虑跨月&#xff0c;跨年和闰年情…...

科技论文中的Assumption、Remark、Property、Lemma、Theorem、Proof含义

一、背景 学控制、数学、自动化专业的学生在阅读论文时&#xff0c;经常会看到Assumption、Remark、Property、Lemma、Theorem、Proof等单词&#xff0c;对于初学者可能不太清楚他们之间的区别&#xff0c;因此这里做一下详细的说明。 以机器人领域的论文为例。 论文题目&…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...