汇编简单教程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/pingmian/56894.shtml

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

相关文章

UG NX12.0建模入门笔记:1.2 鼠标的基本操作

文章目录 前言&#xff1a;鼠标的操作1.鼠标左键&#xff1a;单击—>单选&#xff1b;长按并滑动—>框选。2.鼠标右键&#xff1a;在不同的地方单击弹出不同的菜单。3.鼠标中键&#xff1a;滚动中键—>放大缩小【镜头拉近拉远】。4.鼠标中键&#xff1a;摁住鼠标中键&…

下载 jdk 历史版本的方法

先访问Oracle官网 Oracle | Cloud Applications and Cloud Platform 点击Products展示所有的铲平 选择 Java 这里有所有的版本&#xff0c;自己选择需要的版本 Java Archive | Oracle 如果返回 Request Header Or Cookie Too Large 可以通过以下方法清除Cookies

StarRocks大批量数据导入方案-使用 Routine Load 导入数据

本文详细介绍如何使用Routine Load 导入数据 一、准备工作 1.1 安装基础环境 主要是安装StarRocks和Kafka&#xff0c;本文直接跳过不做详细介绍~ 二、概念及原理 2.1 概念 导入作业&#xff08;Load job&#xff09; 导入作业会常驻运行&#xff0c;当导入作业的状态为 R…

python之selenium接管打开的谷歌浏览器窗口——隐藏爬虫特征,跳过登陆弹窗验证

文章目录 引言使用selenium接管打开的谷歌浏览器总结 引言 我们知道通过selenium打开的浏览器与本地电脑上打开的浏览器是不同的&#xff0c;selenium通过插件打开浏览器页面会显示爬虫特征信息&#xff0c;且在访问某些网站时&#xff0c;很容易被检测出是一个爬虫机器&#x…

linux 环境运行 jenkins.war包,有可能会出现字体问题,jdk版本:11 jenkins 版本:2.420

jenkins的目录&#xff1a; /usr/jenkins 启动命令 java -Djava.awt.headlesstrue sudo timedatectl set-timezone Asia/Shanghai-Xmx1024m -jar jenkins.war --httpPort8090 任意目录启动&#xff1a; nohup java -Djava.awt.headlesstrue -Xms1024m -Xmx1024m -jar /usr/j…

QT--QPushButton设置文本和图标、使能禁能、信号演示

按钮除了可以设置显示文本之外&#xff0c;还可以设置图标 文本 可以获取和设置按钮上显示的文本 // 获取和设置按钮的文本 QString text() const void setText(const QString &text)该属性&#xff0c;既可以在 Qt 设计师右侧的属性窗口中修改&#xff0c;也可以在代码…

OQE-OPTICAL AND QUANTUM ELECTRONICS

文章目录 一、征稿简介二、重要信息三、服务简述四、投稿须知五、联系咨询 一、征稿简介 二、重要信息 期刊官网&#xff1a;https://ais.cn/u/3eEJNv 三、服务简述 四、投稿须知 1.在线投稿&#xff1a;由艾思科蓝支持在线投稿&#xff0c;请将文章全文投稿至艾思科蓝投稿系…

linux环境下C程序的编译过程以及makefile的简单使用

在windows下&#xff0c;很多用来进行编程软件对于写好的文件&#xff0c;点击编译即可生成想要文件。如.exe可执行文件&#xff0c;.hex文件或者.bin文件等等。软件为我们省略了很多事。但是对于linux初学者来说&#xff0c;初次接触linux系统&#xff0c;面对命令行黑框框有点…

NetSuite Comparative Income Statement Amount如何选取自定义期间?

最近用户有一个关于自定义报表的需求也帮我们又增加了一个关于Report的忽略点&#xff0c;即如何在自定义报表比较利润表Comparative Income Statement的时候能够让相对金额Comparative Amount实现和金额Amount实现同比的关系。也就是当金额显示为 Jan 2024-Oct 2024时&#xf…

(38)MATLAB分析带噪信号的频谱

文章目录 前言一、MATLAB仿真代码二、仿真结果画图总结 前言 本文给出带噪信号的时域和频域分析&#xff0c;指出频域分析在处理带噪信号时的优势。 首先使用MATLAB生成一段信号&#xff0c;并在信号上叠加高斯白噪声得到带噪信号&#xff0c;然后对带噪信号对其进行FFT变换&…

从头预训练一只迷你 LLaMA 3_llama3 预训练预处理

我将向你展示如何使用 LLama 3.1&#xff08;一个本地运行的模型&#xff09;来执行GraphRAG操作&#xff0c;总共就50号代码。。。 首先&#xff0c;什么是GraphRAG&#xff1f;GraphRAG是一种通过考虑实体和文档之间的关系来执行检索增强生成的方式&#xff0c;关键概念是节…

AndroidLogger 使用问题

Q1&#xff1a;解压zip后&#xff0c;启动Notepad未看到AndroidLogger工具栏 请检查plugins下安装位置是否正确&#xff0c;必须与下图一致&#xff0c;再确认Notepad 是否为 x64 &#xff1f; Q2&#xff1a;使用 adb 可以显示已连接&#xff0c;但是获取不到日志 暂时不确定问…

理工科考研想考计算机,湖南大学、重大、哈工大威海、山东大学,该如何选择?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 计算机对理工科同学来说&#xff0c;还是性价比很高的&#xff0c;具有很大的优势&#xff01; 一、就业前景广阔 高需求行业 在当今数字化时代&#xff0c;计算机技术几乎渗透到了各个领域&#xff0c;无论是互联网…

Spring Boot实现接口限流

API限流是一种重要的策略&#xff0c;用于控制对API的访问速率&#xff0c;以保护后端服务免受过载和滥用。以下是API限流的必要性&#xff1a; 防止服务过载&#xff1a; 当API的请求量突然激增时&#xff0c;如果没有限流措施&#xff0c;可能会导致服务器资源耗尽&#xff0…

【部署篇】RabbitMq-03集群模式部署

一、准备主机 准备3台主机用于rabbitmq部署&#xff0c;文章中是在centos7上安装部署rabbitmq3.8通过文章中介绍的方式可以同样在centos8、centos9上部署&#xff0c;只需下载对应的版本进行相同的操作。 主机IP角色说明192.168.128.31种子节点192.168.128.32普通节点192.16…

2.Node.js 缓冲器(Buffer)

二、常用模块 2.1Buffer(缓冲器) 2.1.1概念 Buffer是一个类似于数组的对象&#xff0c;用于表示固定长度的字节序列 Buffer本质是一段内存空间&#xff0c;专门用来处理二进制数据 2.2.2特点 Buffer大小固定无法调整&#xff1b; Buffer性能较好&#xff0c;可以直接操…

科技云报到:大模型时代下,向量数据库的野望

科技云报到原创。 自ChatGPT爆火&#xff0c;国内头部平台型公司一拥而上&#xff0c;先后发布AGI或垂类LLM&#xff0c;但鲜有大模型基础设施在数据层面的进化&#xff0c;比如向量数据库。 在此之前&#xff0c;向量数据库经历了几年的沉寂期&#xff0c;现在似乎终于乘着Ch…

Linux驱动开发——设备树

文章目录 1 什么是设备树&#xff1f;2 DTS、DTB和DTC3 DTS语法3.1 dtsi头文件3.2 设备节点3.3 标准属性3.4 根节点compatible属性3.5 向节点追加或修改内容 4 创建小型模板设备树5 设备树在系统中的体现6 绑定信息文档7 设备树常用OF操作函数7.1 查找节点的OF函数7.2 查找父/子…

Unity Meta Quest 开发调试工具 Immersive Debugger

XR 开发者社区链接&#xff1a; 赠送原版GPT、完整课程、项目下载、项目孵化宣发、答疑、投融资&#xff08;YY&#xff09; 此工具可以在头显当中对 Unity 脚本的参数进行调整&#xff08;相当于在编辑器 Inspector 里调整脚本参数&#xff09;&#xff0c;并且还可以查看 Un…

免费送源码:Java+B/S+MySQL springboot电影推荐系统 计算机毕业设计原创定制

摘 要 随着互联网与移动互联网迅速普及&#xff0c;网络上的电影娱乐信息数量相当庞大&#xff0c;人们对获取感兴趣的电影娱乐信息的需求越来越大,个性化的电影推荐系统成为一个热门。然而电影信息的表示相当复杂&#xff0c;己有的相似度计算方法与推荐算法都各有优势&#…