基于x86_64汇编语言简单教程7:跳转

目录

跳转的分类

cmp指令

尝试:使用CMP指令写一个简单的循环

条件跳转


现在我们终于向更加复杂的程序迈出更加坚实的一步,下面我们来系统的聊聊跳转这个事情!

跳转的分类

汇编语言中的条件执行是通过几个循环和分支指令来完成的。这些指令可以更改程序中的控制流。在两种情况下观察到条件执行

  • 无条件跳转 - 这是通过JMP指令执行的。条件执行通常涉及将控制权转移到不遵循当前执行指令的指令的地址。控制权的转移可以是前进的(执行新的指令集),也可以是后退的(重新执行相同的步骤)。

  • 有条件跳转 - 这取决于条件由一组跳转指令j <condition>执行。条件指令通过中断顺序流程来转移控制,而它们通过更改IP中的偏移值来进行控制。

换而言之,一个是来了就跳转,看到jmp就三七二十一直接跑到label所在的地方继续执行。另一方面则是需要一定的条件——比如说必须小于7了才能跳转,等等!

cmp指令

cmp指令比较两个操作数。它通常用于条件执行中。该指令基本上从另一个操作数中减去一个操作数,以比较操作数是否相等。它不会干扰目标或源操作数。它与条件跳转指令一起用于决策。

cmp destination, source

cmp比较两个数字数据字段。目标操作数可以在寄存器中或在内存中。源操作数可以是常量(立即数)数据,寄存器或内存。

cmp DX, 00  ; 将DX值与0进行比较
je  L7      ; 如果等于,则跳转到标签L7
...
L7: ...  

cmp 通常用于比较计数器值是否已达到需要运行循环的次数。考虑以下典型条件-

INC     EDX
CMP     EDX, 10 ; 比较计数器是否达到10
JLE     LP1     ; 如果它小于或等于10,则跳转到LP1

换而言之,现在我们可以写循环了

尝试:使用CMP指令写一个简单的循环

程序需要循环9次打印一个字符串:I am looping lol,当然,前面需要加上当前打印剩余的次数:

charliechen@Charliechen:~/demo/demo10$ ./result 
9: I am looping lol
8: I am looping lol
7: I am looping lol
6: I am looping lol
5: I am looping lol
4: I am looping lol
3: I am looping lol
2: I am looping lol
1: I am looping lol

提示:哈?这个简单,不需要提示 :),非得要提示的话,那就是好好看看上面的阐述

答案如下:

​
​
​
; help announce a typical string
%macro ANNOUNCE_STRING 2%1 db %2%1_LEN equ $ - %1
%endmacro
​
; fast use of common value
%define MY_STDOUT       1
%define MY_SYS_WRITE    4
%define MY_STDIN        0
%define MY_SYS_READ     3
​
; print string in a simple way
%macro PRINT_STRING 2mov edx, %2mov ecx, %1mov ebx, MY_STDOUTmov eax, MY_SYS_WRITEint 0x80
%endmacro
​
%macro EASY_PRINT_STRING 1PRINT_STRING %1, %1_LEN 
%endmacro
​
%macro EXIT 0mov ebx, 0mov eax, 1int 0x80
%endmacro
​
section .data PR_TIMES equ 9ANNOUNCE_STRING TELL_TIMES, {": "}ANNOUNCE_STRING BUFFER, {"I am looping lol", 0xA}
​
section .bsscurrent_times resb 1current_times_for_print resb 1
​
section .textglobal _start
​
_start:mov ax, PR_TIMESmov [current_times], ax
​
_do_loop:mov ax, [current_times]add ax, '0'mov [current_times_for_print], axPRINT_STRING current_times_for_print, 1EASY_PRINT_STRING TELL_TIMESEASY_PRINT_STRING BUFFERdec byte [current_times]cmp byte [current_times], 0jne _do_loop                ; jmp out! if the counter goes 0EXIT

Bonus: 你可以试试看让用户控制循环次数?

条件跳转

如果在条件跳转中满足某些指定条件,则控制流将转移到目标指令。根据条件和数据,有许多条件跳转指令。以下是用于算术运算的有符号数据的条件跳转指令-

指令描述标志测试
JE/JZ跳转等于或跳转零ZF
JNE/JNZ跳转不等于或跳转不为零ZF
JG/JNLE跳转大于或跳转不小于/等于OF,SF,ZF
JGE/JNL跳转大于/等于或不小于跳转OF,SF
JL/JNGE跳转小于或不大于/等于OF,SF
JLE/JNG跳少/等于或跳不大于OF,SF,ZF

以下是对用于逻辑运算的无符号数据使用的条件跳转指令-

指令描述标志测试
JE/JZ跳转等于或跳转零ZF
JNE/JNZ跳转不等于或跳转不为零ZF
JA/JNBE跳转向上或不低于/等于CF,ZF
JAE/JNB高于/等于或不低于CF
JB/JNAE跳到以下或跳到不高于/等于CF
JBE/JNA跳到下面/等于或不跳到上方AF,CF

以下条件跳转指令有特殊用途,并检查标志的值-

指令描述标志测试
JXCZ如果CX为零则跳转没有
JC如果携带则跳CF
JNC如果不携带则跳转CF
JO溢出时跳转OF
JNO如果没有溢出则跳转OF
JP/JPE跳校验或偶校验PF
JNP/JPO跳转无奇偶校验或跳转奇偶校验PF
JS跳跃符号(负值)SF
JNS跳转无符号(正值)SF

笔者目前建议是:如果不是在优化阶段或者是确实需要,可以不理睬上面的绝大多指令!

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

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

相关文章

多模态大语言模型(MLLM)-Deepseek Janus

论文链接&#xff1a;https://arxiv.org/abs/2410.13848 代码链接&#xff1a;https://github.com/deepseek-ai/Janus 本次解读Janus: Decoupling Visual Encoding for Unified Multimodal Understanding and Generation 前言 Deepseek出品&#xff0c;必属精品。 创新点 传…

【javax maven项目缺少_Maven的依赖管理 引入依赖】

javax maven项目缺少_Maven的依赖管理 引入依赖 Maven的依赖管理 - 引入依赖依赖管理(引入依赖)导入依赖 https://blog.csdn.net/weixin_28932089/article/details/112381468 Maven的依赖管理 - 引入依赖 依赖管理(引入依赖) 能够掌握依赖引入的配置方式 导入依赖 导入依赖练…

【经管】比特币与以太坊历史价格数据集(2014.1-2024.5)

一、数据介绍 数据名称&#xff1a;比特币与以太坊历史价格数据集 频率&#xff1a;逐日 时间范围&#xff1a; BTC&#xff1a;2014/9/18-2024/5/1 ETH&#xff1a;2017/11/10-2024/5/1 数据格式&#xff1a;面板数据 二、指标说明 共计7个指标&#xff1a;Date、Open…

C#,自动驾驶技术,ASAM OpenDRIVE BS 1.8.0 规范摘要与C# .NET Parser

本文介绍自动驾驶技术的标准之一《ASAM OpenDRIVE》1.8.0 版本的规范摘要&#xff0c;及北京联高软件开发有限公司实现的 C# 版本 xodr 文件&#xff08;XML&#xff09; Parser 源代码。 本文档是 ASAM e.V. 的版权财产。 在更改常规许可条款时&#xff0c;ASAM 允许不受限制地…

HCIP--1

同一区域内的OSPF路由器拥有一致的 LSDB, 在区域内&#xff0c;OSPF 采用 SPF算法计算路由一个区域太多路由器&#xff0c;硬件资源跟不上&#xff0c;所以多划分区域 OSPF 路由计算原理 1. 区域内路由计算 LSA 在OSPF中&#xff0c;每个路由器生成 LSA&#xff0c;用于告诉…

git merge没有生成合并提交

有时候本地使用gitmerge命令的时候会发现&#xff0c;合并后的log里边并没有一次merge branch的log&#xff0c;而是把合并分支上的所有commit log都带过来。 这是因为当执行合并操作时&#xff0c;如果目标分支的提交历史是源分支的直接延续&#xff08;即&#xff0c;目标分支…

驱动开发系列23 - tasklet用法介绍

一:概述 Tasklet 是 Linux 内核中的一种轻量级任务调度机制,通常用于在中断上下文中执行短小的任务。它们在软中断处理过程中被调用,允许将较长的处理工作延后到一个较低优先级的上下文中,以减少中断处理的延迟。Tasklet 的使用可以帮助开发者更好地管理系统资源,提高性能…

Git Push(TODO)

最近经常碰到GIT push不上去的问题。到处求人解决也真是尴尬&#xff0c;想自己看看&#xff0c;所以刚刚在github上建了一个仓&#xff0c;试了下。结果如下&#xff1a; 暂时可能还不行&#xff0c;因为数据都是加密的&#xff0c;没法看到具体GIT的交互信息。。。 后面再想办…

CMOS 图像传感器:像素寻址与信号处理

CMOS image sensor : pixel addressing and signal processing CMOS image sensor 对于寻址和信号处理有三种架构 pixel serial readout and processingcolumn parallel readout and processingpixel parallel readout and processing 其中&#xff0c;图 (b) column paralle…

Pr 视频效果:自动重构

视频效果/变换/自动重构 Transform/Auto Reframe 自动重构 Auto Reframe效果是用于快速调整视频素材以适应不同长宽比的一项强大工具。 随着各种平台和设备的多样化&#xff0c;视频内容需要适应不同的屏幕尺寸和比例&#xff0c;如 16:9&#xff08;横屏&#xff09;、9:16&am…

html 公共路径标签base

使用 元素&#xff0c;我们就可以像 axios 那样&#xff0c;设置一个 baseURL,所有的公共路径指向这个标签 一个网页中&#xff0c;如果存在多个相对链接&#xff0c;使用标签可以确保这些相对链接都以相同的基础 URL 进行解析。这对于在不同环境中部署的网页非常有用&#xf…

算法的学习笔记—数字在排序数组中出现的次数(牛客JZ53)

&#x1f600;前言 在编程中&#xff0c;查找有序数组中特定元素的出现次数是一个常见的问题。本文将详细讲解这个问题的解决方案&#xff0c;并通过二分查找法优化效率。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 &#x1f970;数字在排序数组中出现的次数&#x…

js 基础补充3

1. 闭包 在函数内部定义的函数&#xff0c;可以访问改函数的属性和方法 私有属性 延长变量的生命周期&#xff0c;更好的避免命名冲突 缺点&#xff1a;内存消耗比较大&#xff0c;不建议频繁使用 2. js 原型 原型链 访问对像的属性方法&#xff0c;不光会在对象上查找还会在…

简单的 curl HTTP的POSTGET请求以及ip port连通性测试

简单的 curl HTTP的POST&GET请求以及ip port连通性测试 1. 需求 我们公司有一个演示项目&#xff0c;需要到客户那边进行项目部署&#xff0c;项目部署完成后我们需要进行项目后端接口的测试功能&#xff0c;但是由于客户那边么有条件安装类似于postman这种的测试工具&am…

计算机毕业设计Hadoop+大模型在线教育大数据分析可视化 学情分析 课程推荐系统 机器学习 深度学习 人工智能 大数据毕业设计

一、研究背景和意义 “互联网”和大数据带来了网络教育的蓬勃发展&#xff0c;学习分析技术和自适应学习也在近年内得到了重大突破。在线教育是互联网技术与传统教育的结合&#xff0c;是当前中国教育信息化发展最快的领域&#xff0c;而当下最迫切的是有效整合教育资源和互联…

Zabbix 监控自动化

一、网络自动发现 部署环境 zabbix server ZBX 192.168.27.152 CentOS7.9 zabbix server 6.4.8 zabbix agent agent01 192.168.27.154 CentOS7.9 zabbix agent 6.4.8 zabbix agent agent02 192.168.27.158 CentOS7.9 zabbix agent 6.4.8 1.搭建LNMP环境 2.安装配…

[linux]快速入门

学习目标 通过学习能够掌握以下的linux操作 操作系统 按照应用领域的不同, 操作系统可以分为几类 桌面操作系统服务器操作系统移动设备操作系统嵌入式操作系统 不同领域的主流操作系统 桌面操作系统 Windows(用户数量最多)MacOS(操作体验好&#xff0c;办公人士首选)Linux…

Java实现HTTP代理的技巧与方法

在互联网时代&#xff0c;代理IP已经成为了网络访问中不可或缺的一部分。无论是为了保护隐私&#xff0c;还是为了访问特定的网络资源&#xff0c;代理IP都能发挥重要作用。那么&#xff0c;如何在Java中实现HTTP代理呢&#xff1f;本文将带您逐步了解这个过程。 什么是HTTP代…

YOLO V3 网络构架解析

YOLO V3&#xff08;You Only Look Once version 3&#xff09;是由Joseph Redmon等人于2018年提出的一种基于深度学习的目标检测算法。它在速度和精度上相较于之前的版本有了显著提升&#xff0c;成为计算机视觉领域的一个重要里程碑。本文将详细解析YOLO V3的网络架构&#x…

如何防止服务器被渗透攻击

服务器作为企业和组织的重要基础设施&#xff0c;其安全性至关重要。一旦服务器被黑客渗透&#xff0c;不仅会导致数据丢失、服务中断等问题&#xff0c;还可能引发更严重的法律和财务后果。因此&#xff0c;采取有效的措施来预防服务器被渗透攻击是非常必要的。本文将介绍几个…