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等单词,对于初学者可能不太清楚他们之间的区别,因此这里做一下详细的说明。 以机器人领域的论文为例。 论文题目&…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
