ARM 流控制指令

计算机按照严格的顺序执行指令。流控制改变了默认的顺序执行方式。前面已
经介绍了强制跳转到程序中某个非顺序位置的无条件分支。以及依据测试结果
进行跳转的条件分支。这里将介绍子程序调用和返回指令,它们会跳转到一个
指令块、执行这些指令,然后返回到子程序调用指令后的一个位置来修改控制
流。

无条件分支

ARM无条件分支指令格式为B target,target指分支目标地址(branch target
address,BTA)。

下面代码说明了如何使用无条件分支指令:
… do this ; 一些代码
… then that ; 另一些代码
B Next ; 跳过下面的指令
… ; …被略过的代码
… ; …被略过的代码
Next … ; 分支目标地址,由标号Next表示

在高级语言中,无条件分支叫作goto,它被认为是一种比较糟糕的编程风格。
然而,在汇编语言中,无条件分支是很难避免的。

条件分支

下面给出了高级语言中实现条件行为的典型例子:
IF(X == Y)
THEN Y = Y + 1
ELSE Y = Y + 2

ARM汇编语言表示:
CMP r1,r2 ; 假设r1包括y,r2包括x,将它们比较
BNE plus2 ; 如果不相等则跳转到ELSE部分
ADD r1,r1,#1 ; 如果相等则继续,y加1
B leave ; 现在跳过ELSE部分
plus2 ADD r1,r2,#2 ; ELSE部分,y加2
leave … ; 从这里继续

条件分支指令测试处理器中条件码寄存器中的标志位,如果测试结果为真则转移成功
在这里插入图片描述
在这里插入图片描述
ARM有4条测试与比较指令CMP、CMN、TST、TEQ,这些指令会显式更新条件
码标志,因此无需在指令后添加S

相等测试指令TEQ

确定两个操作数是否相等,如果相等将Z位置1,否则将Z位清0
如,指令TEQ r1,r2完成RTL操作[r1] – [r2],如果r1和r2相等,Z位被置1。

TEQ与CMP指令类似,测试时TEQ不影响溢出标志的状态而仅修改Z位。相反地,
CMP会更新溢出标志。

比较指令CMP

用第一个源操作数减去第二个,然后更新条件码。

如,指令CMP r1,r2计算[r1] – [r2],然后设置CPSR中的N、Z、C和V位。

测试指令TST

通过与操作来比较两个操作数,然后根据结果更新标志位。可以用TST来测试一个字中的每一位。
如,由于小写ASCII字母的第5位为1,所以通过下面的代码来判断r0中的ASCII字母是否为小写字母:
TST r0,#2_00100000 ; r0与00100000进行与操作,测试第5位的状态
BEQ LowerCase ; 如果第5位为1则跳转到小写字母处理部分

取负并比较指令CMN

在进行比较操作之前先将第二个源操作数取负。

如,指令CMN r1,r2计算[r1] - [-r2],然后设置CPSR。注意[r1] - [-r2]的值与[r1] +
[r2]的相同。

分支与循环结构

用经典的循环结构来介绍流控制概念是最合适的,循环是结构化编程的核心。

下面代码说明了FOR、WHILE和UNTIL循环的结构

for

	MOV 	r0,#10		; 设置循环计数器
Loop	code	…		; 循环体SUBS	r0,r0,#1	; 循环计数器减1并设置状态标志BNE	Loop		; 继续直到计数值为0——不为0时跳转Post	loop		; 计数值为0的后续代码

while

Loop	CMP	r0,#0		; 循环开始执行测试BEQ	WhileExit		; 测试结果为true则退出code	…			; 循环体B	Loop		; 为true时重复

WhileExit Post loop … ; 退出

until

Loop	code	…		; 循环体CMP	r0,#0		; 循环末尾进行测试BNE	Loop		; 重复直到UNTIL为truePost	loop	…	; 退出

组合循环

组合循环将上面3中循环的特点结合在一起。
FOR部分指定了最大计数值,限制了循环的执行次数。
WHILE部分测试r1中的初始条件,如果条件不为true则立即退出。
UNTIL部分则在循环体末尾r2为true时退出。
MOV r0,#10 ; 设置循环计数器
LoopStart CMP r1,#0 ; 以WHILE测试开始
BEQ ComboExit ; 为true退出循环
code … ; 循环体
CMP r2,#0 ; 测试UNTIL条件
BEQ ComboExit ; 为true退出循环
SUBS r0,r0,#1 ; 循环计数器减1并设置状态标志
BNE LoopStart ; 继续直到计数器为0——不为0则转移
ComboExit Post loop … ; 退出

条件执行

汇编语言程序员在指令助记符后添加合适的条件以指明条件执行模式
如:ADDEQ r1,r2,r3

指定仅当条件码中的Z位因为前一个结果为0而被置为1时,加法操作才会被执行。
其RTL形式为:IF Z = 1
THEN [r1] <- [r2] + [r3]

条件执行和移位操作可以组合在一起,因为指令中的分支和移位字段是无关的
如:ADDCC r1,r2,r3 LSL r4
其RTL形式为:IF C = 0
THEN [r1] <- [r2] + [r3] X 2[r4]

ARM的条件执行模式使得在高级语言中实现条件操作更容易。
(1)考虑下面的C代码段:
If(P == Q)
X = P – Y;

如果r1为P,r2为Q,r3为X,r4为Y,则可以写为:
CMP	r1,r2		;  比较P == Q
SUBEQ	r3,r1,r4		; 为true则r3 = r1 - r4,为false,减法被转换为空操作

考虑一个更复杂例子,一个带有组合条件的C代码段:
If((a == b) && (c == d))
e++;
可以写为:
CMP r0,r1 ; 比较a == b
CMPEQ r2,r3 ; 如果a == b,则比较c == d
ADDEQ r4,r4,#1 ; 如果a == b且c == d,则e加1

不使用条件执行,则可写为:CMP 	r0,r1		; 比较a == bBNE	Exit		; a !=b则退出CMP	r2,r3		; 比较c == dBNE	Exit		; c!=d则退出ADD	r4,r4,#1		; 否则e加1
Exit

处理一些带有多个条件的C代码段:
If(a == b) e = e + 4;
If (a < b) e = e + 7;
If(a > b) e = e + 12;

可以写为:CMP 	r0,r1		; 比较a == bADDEQ	r4,r4,#4		; 如果a == b,则e = e + 4ADDLE	r4,r4,#7		; 如果a < b,则e = e + 7ADDGT	r4,r4,#12	; 如果a > b,则e = e + 12

不使用条件执行,则可写为:

	CMP	r0,r1		; 比较a == bBNE	Test1		; 不相等则跳转到Test1进行下一次测试ADD	r4,r4,#4		; a ==b,则e = e + 4B	ExitAll		; 退出
Test1	BLT	Test2		; 如果a < b,则跳转到Tset2ADD	r4,r4,#12	; 此处a > b,因此e = e + 12B	ExitAll		; 退出
Test2	ADD	r4,r4,#7		; 此处a < b,因此e =e + 7
ExitAll	

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF内容搜索--支持跨文件夹多文件、组合词搜索

平时我们接触到的PDF文档特别多&#xff0c;需要对PDF文档做一些处理&#xff0c;那么今天给大家带来的这两个软件非常的棒&#xff0c;可以帮你提升处理文档的效率。 PDF内容搜索 快速检索 我用夸克网盘分享了「PDF搜索PDF 转长图.zip」&#xff0c;点击链接即可保存。打开「…

个人Unity自用面经(未完)

目录标题 1.在 2D 平台跳跃游戏项目中&#xff0c;你使用了对象池来生成和回收怪物包含阵亡的动画预制件。在对象池回收对象时&#xff0c;如何确保动画状态被正确重置&#xff0c;避免下次使用时出现异常&#xff1f;2.在僵尸吃脑子模拟项目中&#xff0c;你创建了继承于IAspe…

【计网】ICMP、IP、Ethernet PDU之间的封装关系

TCP/IP体系结构 应用层RIP、OSPF、FTP运输层TCP、UDP网际层IP、ARP、ICMP网络接口层底层协议&#xff08;Ethernet&#xff09; 数据链路层 Ethernet报文格式 6Byte6Byte2Byte46~1500Byte4Byte目的MAC地址源MAC地址类型/长度数据FCS 其中&#xff0c;类型 / 长度值小于 1536…

前端取经路——入门取经:初出师门的九个CSS修行

大家好&#xff0c;我是老十三&#xff0c;一名前端开发工程师。CSS就像前端修行路上的第一道关卡&#xff0c;看似简单&#xff0c;实则暗藏玄机。在今天的文章中&#xff0c;我将带你一起应对九大CSS难题&#xff0c;从Flexbox布局到响应式设计&#xff0c;从选择器优先级到B…

n8n工作流自动化平台的实操:Cannot find module ‘iconv-lite‘

解决问题&#xff1a; 1.在可视化界面&#xff0c;执行const iconv require(iconv-lite);&#xff0c;报Cannot find module iconv-lite [line 2]错误&#xff1b; 查看module的路径 进入docker容器 #docker exec -it n8n /bin/sh 构建一个test.js,并写入如何代码 vi tes…

如何在 PowerEdge 服务器上设置 NIC 分组

以下文章提供了有关 Windows、VMware 和 Linux 中的 NIC 分组的信息。 什么是网络适配器分组&#xff1f;设置 NIC 分组 Windows设置 NIC 分组 VMware设置 NIC 分组 Linux 什么是网络适配器分组&#xff08;绑定&#xff09;&#xff1f; 网络适配器分组是一个术语&#xff0…

【Java ee初阶】多线程(5)

一、wait 和 notify wait notify 是两个用来协调线程执行顺序的关键字&#xff0c;用来避免“线程饿死”的情况。 wait 和 notify 其实都是 Object 这个类的方法&#xff0c;而 Object这个类是所有类的“祖宗类”&#xff0c;也就是说明&#xff0c;任何一个类&#xff0c;都…

基于k8s的Jenkins CI/CD平台部署实践(二):流水线构建与自动部署全流程

基于k8s的Jenkins CI/CD平台部署实践&#xff08;二&#xff09;&#xff1a;流水线构建与自动部署全流程 文章目录 基于k8s的Jenkins CI/CD平台部署实践&#xff08;二&#xff09;&#xff1a;流水线构建与自动部署全流程一、Jenkins简介二、系统架构与环境说明1. 系统架构2.…

《Windows 环境下 Qt C++ 项目升级 GCC 版本的完整指南》

Windows 环境下 Qt C++ 项目升级 GCC 版本的完整指南 在 Windows 系统中升级 Qt C++ 项目的 GCC 版本需要同时考虑 Qt 工具链、MinGW 环境以及项目配置的调整。以下是详细的升级步骤和注意事项: 一、升级前的准备工作 1. 确认当前环境 检查 Qt 版本(建议使用 Qt 5.15+ 以获…

【coze】故事卡片(图片、音频、文字)

【coze】故事卡片&#xff08;图片、音频、文字&#xff09; 1、创建智能体2、添加人设与回复逻辑3、添加工作流&#xff08;1&#xff09;创建工作流&#xff08;2&#xff09;添加大模型节点&#xff08;3&#xff09;添加提示词优化节点&#xff08;4&#xff09;添加豆包图…

Maven 依赖发布与仓库治理

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

虚拟现实视频播放器 2.6.1 | 支持多种VR格式,提供沉浸式观看体验的媒体播放器

虚拟现实媒体播放器是一款专为在智能手机上播放VR&#xff08;虚拟现实&#xff09;照片和视频而设计的应用程序。它支持多种格式的影像内容&#xff0c;包括360和180等距矩形柱面、标准镜头和鱼眼镜头拍摄的照片和视频&#xff0c;并且兼容3D立体并排、上/下以及收缩媒体格式。…

ts axios中报 Property ‘code‘ does not exist on type ‘AxiosResponse<any, any>‘

ts语法有严格的格式&#xff0c;如果我们在处理响应数据时&#xff0c;出现了axios响应中非默认字段&#xff0c;就会出现标题那样的警告&#xff0c;我们可以通过创建axios.dt.ts解决这个问题 下面是我在开发中遇到的警告&#xff0c;code并不是axios默认返回的字段&#xff0…

tinyrenderer笔记(Shadow Mapping)

tinyrenderer个人代码仓库&#xff1a;tinyrenderer个人练习代码 前言 阴影是光线被阻挡的结果&#xff1b;当光源的光线由于其他物体的阻挡而无法到达物体表面时&#xff0c;该物体就会产生阴影。阴影能使场景看起来更真实&#xff0c;并让观察者获得物体之间的空间位置关系。…

debian中笔记本的省电选择auto-cpufreq

在reddit中&#xff0c;看评论区出现这个软件&#xff0c;于是打算尝试一下&#xff0c;应该能对不使用电源时笔记本的省电起到一定的作用。 https://github.com/AdnanHodzic/auto-cpufreq?tabreadme-ov-file#why-do-i-need-auto-cpufreq 作用 One of the problems with Linux…

Windows 查看电脑是否插拔过U盘

1、按 “WinR” 组合键打开 “运行” 对话框&#xff0c;输入 “regedit” 并回车&#xff0c;打开注册表编辑器。 2、依次展开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR注册表项&#xff0c;这里记录了所有已连接过的 USB 设备信息&#xff0c;包括 U 盘&am…

426、N叉树的层序遍历

输入检查&#xff1a; if not root:return [] 如果根节点为空&#xff0c;直接返回空列表 初始化&#xff1a; result [] queue collections.deque([root]) result用于存储最终结果queue初始化包含根节点&#xff0c;使用双端队列实现 主循环&#xff1a; while queue:leve…

【ES】Elasticsearch字段映射冲突问题分析与解决

在使用Elasticsearch作为搜索引擎时&#xff0c;经常会遇到一些映射(Mapping)相关的问题。本文将深入分析字段映射冲突问题&#xff0c;并通过原生的Elasticsearch API请求来复现和解决这个问题。 问题描述 在实际项目中&#xff0c;我们遇到以下错误&#xff1a; Transport…

小红书怎么看自己ip地址?小红书更改ip地址教学

在社交媒体高度透明的今天&#xff0c;小红书等平台公开用户IP属地的功能引发了广泛讨论。无论是出于隐私保护的担忧&#xff0c;还是因需要切换属地&#xff0c;许多用户都迫切想知道&#xff1a;能否通过手动修改“伪装”所在地&#xff1f; 事实上&#xff0c;IP属地可能影…

深入理解 Java 观察者模式:原理、实现与应用

在软件开发领域&#xff0c;设计模式堪称开发者智慧的凝练结晶&#xff0c;它们为解决各类常见编程难题提供了行之有效的方案。观察者模式&#xff08;Observer Pattern&#xff09;作为行为型设计模式的重要一员&#xff0c;在处理对象间依赖关系与事件通知方面表现卓越。本文…