当前位置: 首页 > 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;因此这里做一下详细的说明。 以机器人领域的论文为例。 论文题目&…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...