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指令集具有以下特点
- 32位指令集:ARM指令集使用32位的指令格式,每个指令通常由操作码和操作数组成。
- 支持条件执行:ARM指令集支持条件执行,即只有满足特定的条件时才会执行某些指令。
- 支持寄存器操作:ARM指令集支持对寄存器进行操作,包括对寄存器进行读取、写入、移位等操作。
- 支持内存访问:ARM指令集支持对内存进行访问,包括读取和写入操作。
- 支持协处理器操作:ARM指令集支持与协处理器进行通信,以执行某些特定的操作。
- 支持异常处理:ARM指令集支持触发异常并进行处理。
相关文章:
C语言面试之旅:掌握基础,探索深度(面试实战之ARM架构二)
读别人的代码,就像撕洋葱,每读一层,哭一遍。 引言 ARM 处理器是冯诺依曼存储结构,程序空间、RAM 空间及IO 映射空间统一编址,除对对RAM 操作以外,对外围IO、程序数据的访问均要通过加载/存储指令进…...
Axios详解及运用案例
前言 Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js。它允许开发者使用异步的方式发送 HTTP 请求,同时提供了一个简单、方便的 API 来处理这些请求和响应。 主要特性 Axios 的主要特性包括: 支持 Promise API:Axios 的所有函数都返回一个 Promise 对象…...
期刊影响因子和期刊分区(国内-中科院/国外-JCR分区)
总结: SCI就是一个WOS中的一个科学类引文数据库,是理科方向的;SSCI是当中的社会科学类引文数据库,也就是文科方向的;SCIE:Science Citation Index-Expanded(SCI-E,科学引文索引&…...
R语言gWQS包在加权分位数和回归模型的应用
在流行病学研究中,相较于单一因素的暴露,多因素同时暴露的情况更为常见。传统模型在评价多因素联合暴露时存在数据维度高、多重共线性等问题. WQS 回归模型的基本原理是通过分位数间距及加权的方法,将多种研究因素的效应综合成为一个指数&…...
【Makelist】release无法生成pdb
记录makelist使用中遇到的问题 一、release版无法生成pdb 【解决方法】:需要在最大级的Makelist下的设置编译器选项添加如下标记 #release 链接库生成pdbSET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")#lib的 release链接库生成pdbSET…...
【Linux】信号的保存和捕捉
文章目录 一、信号的保存——信号的三个表——block表,pending表,handler表sigset_t信号集操作函数——用户层sigprocmask和sigpending——内核层 二、信号的捕捉重谈进程地址空间(第三次)用户态和内核态sigaction可重入函数volat…...
Sourcepawn脚本入门(二)命令与事件监听
🍎Sourcepawn脚本入门(二)命令与事件监听 (控制台)命令是常用的插件形式,eg. noclip …等都是常用的命令,在游戏中使用也很容易,souremod可以注册自己的命令。 事件的监听则需要考虑到不同的起源游戏支持的事件不同&am…...
java-poi操作笔记
row表示行,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变量为数组时的处理
方法一:使用内嵌 PHP 脚本标记 1、简单的拼接 使用内嵌的 PHP 脚本标记 <?php ?> 将 PHP 变量 $phpVariable 的值嵌入到 JavaScript 代码中。 <?php $phpVariable "Hello, World!"; ?><script> // 将 PHP 变量的值传递给 JavaS…...
网工学习7-配置 GVRP 协议
7.1GARP概述 GARP(Generic Attribute Registration Protocol)是通用属性注册协议的应用,提供 802.1Q 兼容的 VLAN 裁剪 VLAN pruning 功能和在 802.1Q 干线端口 trunk port 上建立动态 VLAN 的功能。 GARP 作为一个属性注册协议的载体,可以用来传播属性…...
python:格式化输出指定内容
python:格式化输出指定内容 当涉及到在Python中格式化输出指定内容时,有几种方法可以让您的输出更加清晰和易读。Python的f-string(格式化字符串)是一种简洁而强大的工具,可以帮助您以所需的格式输出数据。 首先&…...
【C语言】7-35 强迫症 分数 10
7-35 强迫症 分数 10 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写 199808,有的人只写 9808。有强迫症的小强请你写个程序,把所有人的…...
如何快速了解一家公司?
在炒股过程中,我们想要了解一家公司是否具有投资价值,需要查看和阅读很多公司的相关资料。股民们自行去查询往往会花费很多的时间精力,所以专业的炒股软件一般都会给股民提供这些现成的资料。 在金斗云智投APP内,进入到个股详情页…...
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 允许您将…...
查收查引(通过文献检索开具论文收录或引用的检索证明)
开具论文收录证明的 专业术语为 查收查引,是高校图书馆、情报机构或信息服务机构提供的一项有偿服务。 因检索需要一定的时间,提交委托时请预留足够的检索时间。 一般需要提供:论文题目、作者、期刊名称、发表年代、卷期、页码。 目录 一、查…...
Python一帮一
在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。 输入格式: 输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别࿰…...
学员追访 | “IC的标签并不是只有高薪与965”
大家好,我是08期的学员小D 。 很开心能在这里与大家分享我的学习、工作经历,我毕业于一所双非本科院校。现在已经入职五个月了,很满意目前的薪资水平和工作状态。 接下来我把我的学习经历和求职经验给大家做个分享,希望能够帮到…...
LeetCode(39)赎金信【哈希表】【简单】
目录 1.题目2.答案3.提交结果截图 链接: 赎金信 1.题目 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字…...
输入日期求n天后
题目要求:输入一个日期startdate年月日和days天数(>1),输出自该日期days天后的日期enddate。 要求输出和输出的年份为四位整数,输入时对输入数据的有效性进行检查;同时考虑跨月,跨年和闰年情…...
科技论文中的Assumption、Remark、Property、Lemma、Theorem、Proof含义
一、背景 学控制、数学、自动化专业的学生在阅读论文时,经常会看到Assumption、Remark、Property、Lemma、Theorem、Proof等单词,对于初学者可能不太清楚他们之间的区别,因此这里做一下详细的说明。 以机器人领域的论文为例。 论文题目&…...
逆向爬虫进阶实战:突破反爬虫机制,实现数据抓取
文章目录 一、引言二、逆向爬虫进阶技巧三、逆向爬虫进阶实战代码片段四、总结与展望好书推荐内容简介作者简介前言节选 一、引言 随着网络技术的发展,网站为了保护自己的数据和资源,纷纷采用了各种反爬虫机制。然而,逆向爬虫技术的出现&…...
个体民营诊所-如何打破传统发展瓶颈,增客流-提营收?
随着人们对传统医学和自然疗法的需求增加,开办针灸诊所可以满足社会公众对健康的需求,提供更多元化的医疗选择。 针灸作为一种传统的中医疗法,不仅可以帮助调理身体,还能帮助客户缓解疼痛,改善循环等。但针灸诊所&…...
Filament引擎分析--command抽象设备API
1. 前言 Filament中使用了FrameGraph来管理渲染管线,需要准备两点: 设备接口抽象:设备API抽象为Command资源抽象:使用虚拟资源,在实际用到时再创建,方便剔除无用资源 下面就围绕Filament中设备API抽象为…...
网络协议与响应码
http:超文本(不止文本)传输协议,底层是tcp/ip get,post,put,delete GET把参数包含在 URL 中, POST 通过 request body 传递参数 请求都是tcp链接,HTTP规定,当…...
彻底删除VsCode配置和安装过的插件与缓存
前言 当你准备对 Visual Studio Code(VSCode)进行重新安装时,可能遇到一个常见问题:重新安装后,新的安装似乎仍然保留了旧的配置信息,这可能会导致一些麻烦。这种情况通常是由于卸载不彻底所致,…...
【XILINX】ISE chipscope出现错误 Can‘t load jre bin client jvm.dll
记录一个ISE软件使用过程中遇到的问题及解决方案。 问题 ISE chipscope出现错误 Cant load jre bin client jvm.dll C:\Xilinx\14.7\ISE_DS\ISE\bin\nt C:\Xilinx\14.7\ISE_DS\.xinstall\bin\nt C:\Xilinx\14.7\ISE_DS\.xinstall\bin\nt64 C:\Xilinx\14.7\ISE_DS\ISE\bin\nt6…...
并发编程(已整理,已废弃)
这一块知识,那真是有的啃了。 直接先看速成基础,再直接吃掉高频考点。 每个小知识点,直接看短视频,浅浅了解,在写下来就是自己的资料。 # 基础 一个进程有多个线程,多个线程共享进程的堆和方法区…...
第一篇:MongoDB的安装、启动、关闭、链接shell
目录 简介 安装 安装遇到的问题 查看brew 当前使用的源: 更换brew 源。更换成清华大学镜像源 版本查看 MongoDB 数据目录与日志目录 启动方式一: 启动MongoDB 验证MongoDB 是否正常运行 停止或重新启动 停止MongoDB 服务 重新启动MongoDB服…...
Python爬虫之重放攻击详解
更多资料获取 📚 个人网站:ipengtao.com 重放攻击是一种网络攻击方式,攻击者通过截获合法用户的请求,并将其重新发送,以模拟合法用户的行为。在Python爬虫领域,了解重放攻击的原理和防范方法至关重要。本文…...
构建一个语音转文字的WebApi服务
构建一个语音转文字的WebApi服务 简介 由于业务需要,我们需要提供一个语音输入功能,以便更方便用户的使用,所以我们需要提供语音转文本的功能,下面我们将讲解使用Whisper将语音转换文本,并且封装成WebApi提供web服务…...
网站建设实训意见和建议/seo关键词优化报价
## php利用phpExcel 导出数组为Excelphp/*** 导出多页的excel** param [type] $fileName 文件名* param [type] $Data 数据* param [type] $sheets 工作区数量[可选]* author Tan * return void*/function exportExcel_sheets($fileName,$Data,$sheets) {$fileName empty($fil…...
服装高端网站建设/内部优化
流媒体解决方案 Live555 流媒体平台框架 EasyDarwin 实时流媒体播放服务器程序DarwinStreamingSrvr 流媒体实时传输开发包 jrtplib 多媒体处理工具 ffmpeg 多媒体编码工具包Libav Flash流媒体服务器 Red5 流媒体服务器 Open Streaming Server FMS流媒体服务器 Wowza流媒体服务器…...
门户网站样式/seo任务平台
1.题目描述: 2.算法分析: 首先肯定是定义一个double类型数组存放数据,然后的一个问题是怎么判断浮点数最近的整数的差, 使用round函数即可 floor : 不大于自变量的最大整数 ceil :不小于自变量的最大整数 round:四舍五入到最邻近…...
关于茶网站模板/在线crm
第一次备份,没什么经验,搜了一下,发现很简单,但是大多都是win7上面的demo,我这里用的Windows Server 2008,备份之后发现.dump文件找不到,搜了一下才发现,生成备份的文件,…...
mac wordpress数据库文件路径/今日大事件新闻
--- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间内的各个版本 --- 使用闪回事务查询查看事务处理历史记录或行 优点: …...
佛山顺德容桂做网站的公司/win7优化大师
着互联网的不断发展和逐渐普及,各行各业也纷纷选择了上云之路,腾讯云数据库致力于运用领先技术,助力企业上云,分布式数据库TDSQL就是部署在腾讯云上的一款具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特…...