ARM汇编【4】:CONDITIONAL EXECUTION

news2025/1/21 1:04:10

        我们在讨论消费品安全标准登记册时已经简要地谈到了条件的主题。我们在程序运行时使用条件来控制程序流,通常是通过跳转(分支)或仅在满足条件时执行某些指令。该条件被描述为CPSR寄存器中特定位的状态。这些比特根据一些指令的结果不时地变化。例如,当我们比较两个数字,结果它们相等时,我们触发零位(Z=1),因为在引擎盖下会发生以下情况:a–b=0。在这种情况下,我们有等式条件。如果第一个数字更大,我们将有一个大于条件,在相反的情况下——小于。还有更多的条件,如更低或相等(LE)、更大或相等(GE)等等。

  下表列出了可用的条件代码、它们的含义以及测试标志的状态。

 我们可以使用下面的代码来研究我们执行条件加法的条件的实际用例。

.global main

main:
        mov     r0, #2     /* setting up initial variable */
        cmp     r0, #3     /* comparing r0 to number 3. Negative bit get's set to 1 */
        addlt   r0, r0, #1 /* increasing r0 IF it was determined that it is smaller (lower than) number 3 */
        cmp     r0, #3     /* comparing r0 to number 3 again. Zero bit gets set to 1. Negative bit is set to 0 */
        addlt   r0, r0, #1 /* increasing r0 IF it was determined that it is smaller (lower than) number 3 */
        bx      lr

      上面代码中的第一条CMP指令触发设置负位(2–3=-1),指示r0中的值低于数字3。随后,执行ADDLT指令,因为当V!=N(CPSR中的溢出位和负位的值不同)。在执行第二个CMP之前,我们的r0=3。这就是为什么第二个CMP清除负位(因为3–3=0,不需要设置负标志)并设置零标志(Z=1)。现在我们有V=0和N=0,这导致LT条件失败。结果,第二ADDLT不被执行,并且r0保持未被修改。程序退出,结果为3。

条件分支

     分支(又名跳转)允许我们跳转到另一个代码段。当我们需要跳过(或重复)代码块或跳转到特定函数时,这很有用。此类用例的最佳示例是IF和Loops。因此,让我们先来看看IF案例。

.global main

main:
        mov     r1, #2     /* setting up initial variable a */
        mov     r2, #3     /* setting up initial variable b */
        cmp     r1, r2     /* comparing variables to determine which is bigger */
        blt     r1_lower   /* jump to r1_lower in case r2 is bigger (N==1) */
        mov     r0, r1     /* if branching/jumping did not occur, r1 is bigger (or the same) so store r1 into r0 */
        b       end        /* proceed to the end */
r1_lower:
        mov r0, r2         /* We ended up here because r1 was smaller than r2, so move r2 into r0 */
        b end              /* proceed to the end */
end:
        bx lr              /* THE END */

 上面的代码只是检查哪个初始数字更大,并将其作为退出代码返回。类似C的伪代码如下所示:

int main() {
   int max = 0;
   int a = 2;
   int b = 3;
   if(a < b) {
    max = b;
   }
   else {
    max = a;
   }
   return max;
}

下面是我们如何使用条件分支和无条件分支来创建循环。

.global main

main:
        mov     r0, #0     /* setting up initial variable a */
loop:
        cmp     r0, #4     /* checking if a==4 */
        beq     end        /* proceeding to the end if a==4 */
        add     r0, r0, #1 /* increasing a by 1 if the jump to the end did not occur */
        b loop             /* repeating the loop */
end:
        bx lr              /* THE END */

类似C的伪代码如下所示:

int main() {
   int a = 0;
   while(a < 4) {
   a= a+1;
   }
   return a;
}

B / BX / BLX

   有三种类型的分支指令:

  • B    简单的跳到一个函数中
  • BL  保存(PC+4)的地址到LR中,然后跳到函数中
  • BX 和 BLX     

       与B/BL+交换指令集相同(ARM<->Thumb)  需要一个寄存器作为第一个操作数:BX/BLX reg

BX/BLX用于将指令集从ARM交换到Thumb。

.text
.global _start

_start:
     .code 32         @ ARM mode
     add r2, pc, #1   @ put PC+1 into R2
     bx r2            @ branch + exchange to R2

    .code 16          @ Thumb mode
     mov r0, #1

         这里的技巧是取实际PC的当前值,将其增加1,将结果存储到寄存器中,然后分支(+exchange)到该寄存器。我们看到,加法(加r2,pc,#1)只需取有效的pc地址(即当前pc寄存器的值+8->0x805C),然后加1(0x805C+1=0x805D)。然后,如果我们分支到的地址的最低有效位(LSB)为1(这种情况下,因为0x805D=10000000 01011101),则发生交换,这意味着地址不是4字节对齐的。分支到这样的地址不会导致任何错位问题。这就是GDB(GEF延期)的情况:

Conditional Branches

   分支也可以有条件地执行,并在满足特定条件的情况下用于分支到函数。让我们看一个非常简单的有条件分支起诉BEQ的例子。这段程序集除了将值移动到寄存器中并在寄存器等于指定值时分支到另一个函数之外,没有什么有趣的事情。

.text
.global _start

_start:
   mov r0, #2
   mov r1, #2
   add r0, r0, r1
   cmp r0, #4
   beq func1
   add r1, #5
   b func2
func1:
   mov r1, r0
   bx  lr
func2:
   mov r0, r1
   bx  lr

    

 

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

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

相关文章

结构体指针和结构体数组指针

结构体指针和结构体数组指针是不同的类型。 结构体指针定义&#xff1a;Student *stu 结构体指针的步长是一个结构体的大小&#xff1b; 结构体数组指针定义&#xff1a;Student (*stu)[] 结构体数组指针的步长是整个结构体数组的大小。 例程&#xff1a; #include <stdio…

机器学习理论笔记(二):数据集划分以及模型选择

文章目录 1 前言2 经验误差与过拟合3 训练集与测试集的划分方法3.1 留出法&#xff08;Hold-out&#xff09;3.2 交叉验证法&#xff08;Cross Validation&#xff09;3.3 自助法&#xff08;Bootstrap&#xff09; 4 调参与最终模型5 结语 1 前言 欢迎来到蓝色是天的机器学习…

java八股文面试[java基础]——面向对象特点

三大特点&#xff1a; 封装 继承 多态 面试题&#xff1a;java如何实现多继承&#xff08;除了使用接口之外&#xff09; 实现多继承有三个方法&#xff1a; 多层继承内部类接口 参考 java实现多继承的三种方式 多层继承 ​如果要直接继承类&#xff0c;子类是不可以直接多…

微信小程序的汽车租赁系统的l9k0e

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

开源文库系统moredoc

什么是 moredoc &#xff1f; moredoc 中文名 魔豆文库&#xff0c;是基于 golang 开发的类似百度文库、新浪爱问文库的开源文库系统&#xff0c;支持 TXT、PDF、EPUB、MOBI、Office 等格式文档的在线预览与管理&#xff0c;为 dochub 文库(github, gitee &#xff09;的重构版…

民族传统文化分享系统uniapp 微信小程序

管理员、用户可通过Android系统手机打开系统&#xff0c;注册登录后可进行管理员后端&#xff1b;首页、个人中心、用户管理、知识分类管理、知识资源管理、用户分享管理、意见反馈、系统管理&#xff0c;用户前端&#xff1b;首页、知识资源、用户分享、我的等。 本系统的使用…

初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法

初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法 在对经过修模的三维模型进行OBJ格式轻量化压缩处理的过程中&#xff0c;可能会遇到一些常见问题。以下是一些常见问题以及相应的处理方法&#xff1a; 1、顶点丢失和形状变形&#xff1a;在减小顶点数量的过程中…

自己实现 SpringMVC 底层机制 系列之-实现任务阶段 8- 完成返回 JSON 格式数据-@ResponseBody

&#x1f600;前言 自己实现 SpringMVC 底层机制 系列之-实现任务阶段 8- 完成返回 JSON 格式数据-ResponseBody &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0…

大数据风控介绍

众所周知&#xff0c;金融是数据化程度最高的行业之一&#xff0c;也是人工智能和大数据技术重要的应用领域。随着大数据收集、存储、分析和模型技术日益成熟&#xff0c;大数据技术逐渐应用到金融风控的各个环节。个推作为专业的数据智能服务商&#xff0c;拥有海量数据资源&a…

Android项目如何上传Gitee仓库

前言 最近Android项目比较多&#xff0c;我都是把Android项目上传到Gitee中去&#xff0c;GitHub的话我用的少&#xff0c;可能我还是更喜欢Gitee吧&#xff0c;毕竟Gitee仓库用起来更加方便 一. 创建Gitee仓库 1. 先创建一个Gitee账号&#xff0c;然后登录上去 2. 创建Androi…

基于JSP+Servlet+mysql养老院管理系统

基于JSPServletmysql养老院管理系统 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于JSPServlet的养老院管理系统 [yanglaoyuan] 当前版本&#xff1a;V1.0.0版本 难度等级&#xff1a;✩✩点…

恒运资本分析:科技股有哪些股票?

跟着科技的不断进步&#xff0c;科技职业越来越遭到人们的重视。在股市中&#xff0c;出资科技股票已经成为人们赚取高额收益的一种方法。那么科技股有哪些值得出资的股票呢&#xff1f;本文将从多个角度剖析科技股。 一、美股科技股票 在美股商场中&#xff0c;科技股票一向以…

QIIME 2教程. 29补充资源SupplementaryResources(2023.5)

补充资源 Supplementary resources https://docs.qiime2.org/2023.5/supplementary-resources/ 教学内容 Educational content 以下资源对于了解有关微生物组分析和生物信息学的更多信息很有用&#xff1a; 应用生物信息学导论 An Introduction to Applied Bioinformatics http…

三维模型OBJ格式轻量化压缩处理的数据质量提升方法分析

三维模型OBJ格式轻量化压缩处理的数据质量提升方法分析 在三维模型的OBJ格式轻量化压缩处理过程中&#xff0c;除了减小文件大小和提高加载速度之外&#xff0c;我们也需要考虑如何提升数据质量。以下是几种常见的方法&#xff1a; 1、优化顶点数据&#xff1a;顶点数据是三维…

三层架构与MVC模式区别

三层架构 三层即 视图层、业务逻辑层、持久层&#xff08;数据访问层&#xff09; MVC模式 MVC 即 Model&#xff08;模型&#xff09;&#xff0c;View&#xff08;视图&#xff09;&#xff0c;Controller&#xff08;控制控制器&#xff09;。 --------------------------…

fastapi集成elastic-apm,实现性能监控

fastapi集成elastic-apm&#xff0c;实现性能监控 本文适用于 Starlette/FastAPIStarlette/FastAPI SupportInstallationSetupFastAPIUsagePerformance metricsIgnoring specific routes Supported Starlette and Python versions 具体使用示例官网的配置项介绍各语言框架集成e…

33、在SpringBoot项目添加Web组件(Servlet、Filter 和 Listener) 的三种方法

通过Spring Bean 来添加 Servlet、Filter 和 Listener ★ 添加Web组件&#xff08;Servlet、Filter、Listener&#xff09;的三种方式&#xff1a; - 使用Spring Bean添加Servlet、Filter或Listener。- 使用XxxRegistrationBean手动添加Servlet、Filter或Listener。- 使用Clas…

Spring Cloud Alibaba-Sentinel--服务容错

1 高并发带来的问题 在微服务架构中&#xff0c;我们将业务拆分成一个个的服务&#xff0c;服务与服务之间可以相互调用&#xff0c;但是由于网络 原因或者自身的原因&#xff0c;服务并不能保证服务的100%可用&#xff0c;如果单个服务出现问题&#xff0c;调用这个服务就会出…

kafka--技术文档--架构体系

架构体系 Kafka的架构体系包括以下几个部分&#xff1a; Producer. 消息生产者&#xff0c;就是向Kafka broker发送消息的客户端。Broker. 一台Kafka服务器就是一个Broker。一个集群由多个Broker组成。一个Broker可以容纳多个Topic。Topic. 可以理解为一个队列&#xff0c;一…

从零开始的Hadoop学习(二)| Hadoop介绍、优势、组成、HDFS架构

1. Hadoop 是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题。广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念—Hadoop生态圈。 2. Hadoop 的优势 高可靠性&#xff1a;Hadoop底层维护多…