详解ARM汇编条件标志

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

条件标志

在 ARM 指令集中,条件标志是控制指令执行的一种机制,它们用于实现条件分支、比较和其他逻辑操作。

我们平时使用 IDA 调试程序时,在 general registers 窗口中看到的条件标志
image.png

ARM 处理器通常使用四个主要的条件标志,它们的状态影响指令的执行。这些条件标志包括:

1. N (Negative): 负标志,用于指示最后一次操作的结果是否为负值。若结果为负,则 N 被置为 1;否则为 0。

2. Z (Zero): 零标志,用于指示最后一次操作的结果是否为零。如果结果为零,则 Z 被置为 1;否则为 0。

3. C (Carry): 进位标志,用于指示加法操作是否产生了进位或减法操作是否没有借位。对于加法,若产生进位,则 C 被置为 1;对于减法,若没有借位,则 C 被置为 1。

4. V (Overflow): 溢出标志,用于指示最后一次算术操作是否发生了溢出。当两个有符号数相加或相减时,如果结果的符号与操作数的符号不一致,表示发生了溢出,V 被置为 1。

在 ARM 指令中,条件执行可以通过附加条件码实现,例如:

  • EQ (Equal): 当 Z = 1 时执行(相等)。

  • NE (Not Equal): 当 Z = 0 时执行(不相等)。

  • GT (Greater Than): 当 Z = 0 且 N = V 时执行(大于)。

  • LT (Less Than): 当 N ≠ V 时执行(小于)。

  • GE (Greater Than or Equal): 当 N = V 时执行(大于或等于)。

  • LE (Less Than or Equal): 当 Z = 1 或 N ≠ V 时执行(小于或等于)。

这些条件标志和条件码使得 ARM 架构能够高效地进行复杂的控制流和决策逻辑,从而优化程序的执行效率。

条件标志如何影响指令的执行

下面以一段汇编代码解释条件标志的变化过程,以及如何通过条件码用于指令影响汇编指令的走向。

    .data
a:  .word 5       // 定义变量 a,值为 5
b:  .word 10      // 定义变量 b,值为 10
max_value: .word 0 // 存储最大值的变量.text.global _start_start:// 读取 a 和 b 的值LDR R0, =a        // 将 a 的地址加载到 R0LDR R1, [R0]      // 将 a 的值加载到 R1 (R1 = 5)LDR R0, =b        // 将 b 的地址加载到 R0LDR R2, [R0]      // 将 b 的值加载到 R2 (R2 = 10)// 比较 a 和 bCMP R1, R2        // 比较 R1 (a) 和 R2 (b)// 根据 R1 和 R2 的值,设置条件标志// 如果 R1 < R2://   N = 1, Z = 0, C = 1, V = 0// 如果 R1 == R2://   N = 0, Z = 1, C = 1, V = 0// 如果 R1 > R2://   N = 0, Z = 0, C = 0, V = 0// 根据比较结果设置最大值BEQ a_equals_b    // 如果 Z = 1 (相等),跳转到 a_equals_bBGT a_greater      // 如果 N = 0 且 Z = 0,(a > b),跳转到 a_greater// 如果到这里,说明 b > aSTR R2, =max_value // b 是最大值,存储 b 的值B end              // 跳转到 enda_equals_b:// a 和 b 相等STR R1, =max_value // 存储任一值,a 或 b 都可以B end              // 跳转到 enda_greater:// a 大于 bSTR R1, =max_value // 存储 a 的值end:// 结束程序MOV R7, #1        // 系统调用号,退出SWI 0             // 触发系统调用

CMP 指令是如何影响条件标志

在 ARM 汇编中,CMP 指令用于比较两个寄存器的值。具体来说,CMP R1,R2 指令会将寄存器 R1 的值减去寄存器 R2 的值,但不会将结果存储在任何寄存器中。这一操作的主要目的是更新条件标志,以便后续的条件执行指令可以根据比较结果做出决策。

我们可以在执行比较 CMP R1, R2 时观察到条件标志的变化。

步骤R1 (a)R2 (b)N (Negative)Z (Zero)C (Carry)V (Overflow)说明
读取 a 的值5-----加载 a 的值到 R1
读取 b 的值510----加载 b 的值到 R2
比较 R1 和 R25101010执行 CMP R1, R2 ,结果 5 - 10(借位)
BEQ 检查5101010Z = 0(不相等),不跳转到 a_equals_b
BGT 检查5101010N = 1,Z = 0(a 不大于 b),不跳转到 a_greater
存储最大值-101010存储 b 的值到 max_v

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

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

相关文章

Navicat Premium安装卸载及使用教程教程

Navicat Premium 17 安装卸载及使用教程教程 0. 卸载 没安装过 Navicat 直接跳过本步骤即可。 正常卸载顺序即可&#xff0c;网上很多教程&#xff0c;这里不演示了 如果怕卸载不干净&#xff0c;最后时候可以执行一下压缩包里面的无限试用 Navicat.bat 即可成功删除Navicat…

Backbone网络详解

Backbone 网络&#xff08;主干网络&#xff09;是深度学习模型中的一个重要组成部分&#xff0c;尤其在计算机视觉任务中。Backbone 网络的主要作用是从输入数据中提取有用的特征&#xff0c;为后续的任务&#xff08;如分类、检测、分割等&#xff09;提供强大的特征表示。常…

Jenkins找不到maven构建项目

有的可能没有出现maven这个选项 解决办法&#xff1a;需要安装Maven项目插件 输入​Maven Integration plugin​

【339】基于springboot的新能源充电系统

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;新能源充电系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解…

Godot Zelda教程练习1

提示&#xff1a;B站链接&#xff1a;Godot Zelda教程练习 资产链接&#xff1a;项目资产 Godot版本&#xff1a;4.3 文章目录 一、新建项目1、创建项目2、设置项目标签3、项目基本设置4、导入资产 二、图块集和自动平铺1、创建TileMapLayer2、创建Terrian Set1、Match Siders(…

【案例】旗帜飘动

开发平台&#xff1a;Unity 6.0 开发工具&#xff1a;Shader Graph 参考视频&#xff1a;Unity Shader Graph 旗帜飘动特效   一、效果图 二、Shader Graph 路线图 三、案例分析 核心思路&#xff1a;顶点偏移计算 与 顶点偏移忽略 3.1 纹理偏移 视觉上让旗帜保持动态飘动&a…

Android亮屏Job的功耗优化方案

摘要: Job运行时会带来持锁的现象,目前灭屏放电Job的锁托管已经有doze和绿盟标准监管,但是亮屏时仍旧存在过长的持锁现象,故为了优化功耗和不影响用户体验下,新增亮屏放电下如果满足冻结和已运行过一次Job,则进行job限制,当非冻结时恢复的策略 1.现象: (gms_schedu…

Java面试经典 150 题.P55. 跳跃游戏(009)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public boolean canJump(int[] nums) {int…

源码解析篇 | YOLO11:计算机视觉领域的新突破 !对比YOLOv8如何 ?

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在2024年9月27日盛大举行的YOLO Vision 2024活动上&#xff0c;Ultralytics公司震撼发布了YOLO系列的最新成员—YOLO11。作为Ultralytics YOLO系列实时目标检测器的最新迭代&#xff0c;YOLO11凭借尖端的准确性、速度和效率…

mac m1 docker本地部署canal 监听mysql的binglog日志

mac m1 docker本地部署canal监听mysql的binglog日志(虚拟机同理) 根据黑马视频部署 1.docker 部署mysql 1.docker拉取mysql 镜像 因为m1是arm架构.需要多加一条信息 正常拉取 docker pull mysql:tagm1拉取 5.7的版本. tag需要自己指定版本 docker pull --platform linux/x…

复现LLM:带你从零训练tokenizer

1. 引言 分词器是每个大语言模型必不可少的组件&#xff0c;但每个大语言模型的分词器几乎都不相同。如果要训练自己的分词器&#xff0c;可以使用huggingface的tokenizers框架&#xff0c;tokenizers包含以下主要组件&#xff1a; Tokenizer: 分词器的核心组件&#xff0c;定…

Nginx防盗链配置

1. 什么是盗链? 盗链是指服务提供商自己不提供服务的内容&#xff0c;通过技术手段绕过其它有利益的最终用户界面&#xff08;如广告&#xff09;&#xff0c;直接在自己的网站上向最终用户提供其它服务提供商的服务内容&#xff0c;骗取最终用户的浏览和点击率。受益者不提供…

DAY53|| 42. 接雨水|84.柱状图中最大的矩形

42. 接雨水(超经典款&#xff09; 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2…

字节跳动(抖音)软件测试月薪23K岗、技术二面面试题最新出炉

测试人员在测试中的任务是什么&#xff1f; ① 尽可能早地找出系统中的bug&#xff1b; ② 避免软件开发过程中缺陷的出现&#xff1b; ③ 协助开发定位bug.以及后续bug跟踪 ④ 一切以用户的需求为标准&#xff0c;确保软件的质量 HTTP与HTTPS协议的区别&#xff1f; …

新160个crackme - 091-DOSKEY-CRACKME2

运行分析 需破解Name和Password PE分析 upx壳&#xff0c;32位 手动脱壳 x32dbg打开程序&#xff0c;按一下F8&#xff0c;根据ESP定律&#xff0c;在此处下断点按一下F9&#xff0c;两下F8&#xff0c;来到OEP处00401000打开Scylla&#xff0c;点击转储保存文件点击IAT自动搜索…

Python(包和模块)

包 定义 包是将模块以文件夹的组织形式进行分组管理的方法&#xff0c;以便更好地组织和管理相关模块。 包是一个包含一个特殊的__init__.py文件的目录&#xff0c;这个文件可以为空&#xff0c;但必须存在&#xff0c;以标识目录为Python包。 包可以包含子包&#xff08;子…

ClickHouse安装

一&#xff0c;ClickHouse介绍 ClickHouse 是一个开源的列式数据库管理系统&#xff08;Column-Oriented DBMS&#xff09;&#xff0c;由俄罗斯的 Yandex 公司开发。它最初是为 Yandex 的 Metrica 分析服务设计的&#xff0c;用于处理大规模的数据分析任务。ClickHouse 能够提…

网络设置:静态IP与动态IP,何去何从?

在配置网络设备时&#xff0c;一个基础而重要的选择便是决定使用静态IP地址还是动态IP地址。这一决策直接影响到网络的连接性、管理便捷性以及安全性。静态IP与动态IP各有其独特的优势与适用场景&#xff0c;选择何种方式&#xff0c;需根据实际需求与网络环境来权衡。本文旨在…

po、dto、vo的使用场景

现在项目中有两类模型类&#xff1a;DTO数据传输对象、PO持久化对象&#xff0c;DTO用于接口层向业务层之间传输数据&#xff0c;PO用于业务层与持久层之间传输数据&#xff0c;有些项目还会设置VO对象&#xff0c;VO对象用在前端与接口层之间传输数据&#xff0c;如下图&#…

不用买PSP,画质甚至更好,这款免费神器让你玩遍经典游戏

作为掌机游戏爱好者的福音&#xff0c;PPSSPP模拟器为玩家带来了前所未有的PSP游戏体验&#xff0c;彻底改变了掌机游戏的体验方式。这款精湛的软件不仅完美复刻了PSP主机的游戏体验&#xff0c;更通过先进的模拟技术&#xff0c;将经典游戏提升到了全新的高度。对于那些珍藏PS…