【汇编】“转移”综述、操作符offset、jmp指令

文章目录

  • 前言
  • 一、转移综述
    • 1.1 :背景:
    • 1.2 转移指令
    • 1.3 转移指令的分类
      • 按转移行为
      • 根据指令对IP修改的范围不同
  • 二、操作符offset
    • 2.1 offset操作符是干什么的?
      • 标号是什么?
    • 2.2 nop是什么?
  • 三、jmp指令
    • 3.1 jmp指令的功能
    • 3.2 jmp指令:依据位移进行转移
    • 3.3 两种段内转移
      • 短转移
      • 近转移
    • 3.4 远转移:jmp far ptr 标号
      • 远转移jmp far ptr 标号
      • 近转移jmp near ptr 标号
    • 3.5 转移地址在寄存器中的jmp指令
    • 3.6 转移地址在内存中的jmp指令
      • jmp word ptr 内存单元地址
      • jmp dword ptr 内存单元地址
  • 总结


前言

在计算机编程的世界里,汇编语言扮演着一种特殊而重要的角色。它是一种低级语言,直接与计算机硬件进行交互,提供了对计算机体系结构底层操作的直接控制。在汇编语言中,“转移” 是一项基本而关键的操作,它使得程序能够灵活地改变执行的流程,实现分支和循环等基本结构。其中,offset 操作符和 JMP 指令是在汇编中常用于实现转移的两个关键元素。

汇编中的“转移”综述:

“转移” 在汇编语言中是一种机制,允许程序在执行过程中跳转到其他位置继续执行。这种能力使得程序能够根据不同的条件或需要,选择性地执行特定的代码块。在这个过程中,涉及到两个主要元素:offset 操作符和 JMP 指令。

操作符 offset:

offset 操作符用于获取标签或变量在代码段中的偏移量。这个偏移量表示标签或变量相对于代码段的起始地址的位置。通过 offset,程序能够动态地处理内存中的数据和执行跳转等操作。这为编程提供了更大的灵活性,使得代码能够更容易地适应不同的情境和需求。

JMP 指令:

JMP 指令是汇编语言中的跳转指令,用于改变程序的执行流程。通过 JMP,程序可以无条件地跳转到指定的地址,实现代码的非顺序执行。这是实现循环、条件分支等逻辑的基础,为程序的控制流提供了关键的控制点。


一、转移综述

1.1 :背景:

一般情况下指令是顺序地逐条执行的,而在实际中,常需要改变程序的执行流程。

1.2 转移指令

可以控制CPU执行内存中某处代码的指令
可以修改IP,或同时修改CS和IP的指令

1.3 转移指令的分类

按转移行为

段内转移:只修改IP,如jmp ax
段内转移(Jump within a Segment):

当我们只需要在当前代码段内进行跳转时,我们使用段内转移。这就像是在当前程序的一本书中的不同章节之间翻页。例如,jmp ax 指令就是一种段内转移。这里,ax 寄存器中存储的值将被直接加载到指令指针寄存器(IP),从而控制程序跳转到 ax 寄存器所指示的内存地址。

段间转移:同时修改CS和IP,如jmp 1000:0
段间转移(Jump between Segments):

有时候我们需要从一个代码段跳转到另一个代码段,就像是关闭一本书并打开另一本一样。这时,我们使用段间转移。例如,jmp 1000:0 指令就是一种段间转移。这里,1000 是新的代码段的地址,而 0 是该段内的偏移地址。同时,指令指针寄存器(IP)会被设置为 0,代码段寄存器(CS)则会被设置为 1000,这样程序就会从新的代码段开始执行。

总的来说,这些跳转指令是为了使程序能够按照我们的设计在不同的部分之间流动,从而实现更复杂的逻辑和功能。

根据指令对IP修改的范围不同

段内短转移:IP修改范围为-128~127

在汇编语言中,段内转移可以分为两种:短转移和近转移,它们主要是根据转移的范围不同而区分的。

段内短转移(Short Jump within a Segment):

短转移是一种限制在较小范围内的跳转,它的目的是在当前代码段内进行跳转。IP(指令指针寄存器)的修改范围是 -128 到 127。这就像是在一本小册子的一页上进行跳转,适用于相对较短的代码段。例如,jmp short label 就是一种短转移指令。这里 short 关键字表示这是一个短跳转。

段内近转移:IP修改范围为-32768~32767

段内近转移(Near Jump within a Segment):

近转移是一种更广泛的跳转,允许在当前代码段内进行更大范围的跳转。IP 的修改范围是 -32768 到 32767。这就像是在一本厚重的书中的章节之间进行跳转,适用于相对较大的代码段。例如,jmp near label 就是一种近转移指令。

总的来说,短转移和近转移的区别在于它们允许的跳转范围大小不同。选择使用哪一种取决于你的程序的结构和需求,以便更有效地管理程序的执行流程。

二、操作符offset

2.1 offset操作符是干什么的?

在汇编语言中,offset 操作符用于获取一个标签(label)或变量在代码段中的偏移量。这个偏移量表示标签或变量相对于代码段的起始地址的位置。

标号是什么?

在汇编语言中,标号(label)是一种用于标识代码位置的符号。你可以把标号看作是程序中的地标或标记,帮助程序员更容易地定位和引用特定的代码块或数据。

举个例子,如果你有一个循环的开始处,你可以在那里放置一个标号,类似于这样:

start_of_loop:; 这里是循环的代码; ...jmp start_of_loop ; 跳转回循环开始处

在这个例子中,start_of_loop 就是一个标号,它标识了循环的开始位置。当程序执行到 jmp start_of_loop 时,它会跳转回这个标号所标识的位置,实现循环的目的。

总的来说,标号是汇编语言中用于标记和引用代码位置的一种方式,使得程序结构更加清晰,易于理解和维护。

回到offset,举个例子,假设有一个标签为 myLabel,你可以使用 offset 操作符来获取它相对于代码段起始位置的偏移量,就像这样:
mov ax, offset myLabel

在这个例子中,ax 寄存器将被设置为 myLabel 相对于代码段的偏移量。这个偏移量可以在程序中用于计算地址或进行跳转等操作。
总的来说,offset 操作符是用于获取标签或变量在代码段中的位置信息,使程序能够动态地处理内存中的数据和执行跳转等操作。

2.2 nop是什么?

NOP 是汇编语言中的一个指令,它代表 “No Operation”,中文可以理解为“无操作”或“空操作”。这个指令在程序执行时不做任何有意义的操作,实际上就是告诉计算机处理器不要执行任何操作,只是简单地占用一个时钟周期。
为什么会需要这样的指令呢?有时候在编写汇编代码时,为了满足一些特定的要求,比如调整指令的对齐方式或者是占用一些字节的空间,我们可能会需要插入一些没有实际操作的指令。NOP 就是为了满足这种需要而设计的。
在汇编语言中,NOP 可以写作 NOP,也可以写作 NOOP,这两者是等效的。一个典型的使用场景是在调试或优化汇编代码时,通过插入一些 NOP 指令,可以方便地观察程序的行为或者调整指令的布局,而不改变实际的逻辑。

三、jmp指令

3.1 jmp指令的功能

无条件转移,可以只修改IP,也可以同时修改CS和IP

jmp指令要给出两种信息:
转移的目的地址
转移的距离

  • 段间转移(远转移): jmp 2000:1000
  • 段内短转移: jmp short 标号 ; IP的修改范围为 -128~127,8位的位移
  • 段内近转移: jmp near ptr 标号 ; IP的修改范围为 -32768~32767,16位的位移

3.2 jmp指令:依据位移进行转移

引子:常见指令中的立即数均在机器指令中有体现问题:
jmp short 指令中,转移到了哪里?
jmp short 的机器指令中,包含的是跳转到指令的相对位置,而不是转移的目标地址。

下边程序jmp short s指令的读取和执行:
(1)(IP)=0003,CS:IP指向EB 05(jmp 的
机器码)
(2)读取指令码EB 05进入指令缓冲器;
(3)(IP)=(IP)+所读取指令的长度
=(IP)+2=0005,CS:IP指向add ax, 0001;
(4)CPU执行指令缓冲器中的指令
EB05;
(5)指令EB 05执行后,
(IP)=(IP)+05=000AH,CS:IP指向inc ax

在这里插入图片描述

3.3 两种段内转移

短转移

短转移:“jmp short 标号”
功能:(IP)=(IP)+8位位移
原理
(1)8位位移=
“标号”处的地址-jmp指令
后的第一个字节的地址;
(2)short指明此处的位移为8位位移;
(3)8位位移的范围为-128~127,用补码
表示;
(4)8位位移由编译程序在编译时算出。

近转移

近转移:指令“jmp near ptr 标号”
功能: (IP)=(IP)+16位位移
原理
(1)16位位移=
“标号”处的地址-jmp指令
后的第一个字节的地址;
(2)near ptr指明此处的位移为16位位移,
进行的是段内近转移;
(3)16位位移的范围为 -32769~32767,
用补码表示;
(4)16位位移由编译程序在编译时算出。

3.4 远转移:jmp far ptr 标号

远转移jmp far ptr 标号

段间转移
far ptr指明了跳转到的目的地址,即包含了标号的段地址CS和偏移地址IP。
在这里插入图片描述

近转移jmp near ptr 标号

near ptr 指明了相对于当前IP的转移位移,而不是转移的目的地址。
在这里插入图片描述

3.5 转移地址在寄存器中的jmp指令

指令格式:jmp 16位寄存器
功能:IP =(16位寄存器)
举例:
jmp ax
jmp bx

3.6 转移地址在内存中的jmp指令

jmp word ptr 内存单元地址

段内转移
功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。

mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
执行后,(IP)=0123H
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]
执行后,(IP)=0123H

jmp dword ptr 内存单元地址

段间转移
功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。

mov ax,0123H
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
执行后,
(CS)=0
(IP)=0123H
CS:IP指向0000:0123
mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
执行后,
(CS)=0
(IP)=0123H
CS:IP指向0000:0123

总结

总体而言,汇编语言中的“转移”是编程中不可或缺的一部分。通过 offset 操作符和 JMP 指令,程序员能够以底层的方式控制程序的执行流程,实现更复杂和灵活的逻辑。这种能力为编程带来了更高的自由度,同时也要求程序员对计算机体系结构有更深入的理解。在深入学习汇编语言的过程中,理解和掌握这些“转移”的机制将成为编程技能中的重要一环。

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

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

相关文章

AD9361寄存器功能笔记之本振频率设定

LO的产生过程如图: 各个模块都有高灵活性。 1、参考时钟即是AD9361全局参考时钟,可以是外接晶振的片上DCXO,或是外部输入的有驱动能力的时钟信号。根据FM-COMMS5的设计,参考时钟可以使用时钟Buffer 40MHz晶振构成的参考频率源。 …

buildadmin+tp8表格操作(5)自定义组装搜索的查询

有时候我们会自定义组装一些数据,发送给后端,让后端来进行筛选,这里有一个示例 const onComSearchIdEq () > {// 展开公共搜索baTable.table.showComSearch true/*** 公共搜索表单赋值* 范围搜索有两个输入框,输入框绑定变量…

vscode设置前进、后退快捷键

前言 在我们使用vscode编写程序时,经常需要在不同的文件之间跳来跳去,如果只是依靠个人记忆去操作会显得非常不方便。本文介绍如何设置vscode的前进、后退快捷键。 1 vscode设置前进、后退快捷键 点击“设置”图标,然后点击“键盘快捷方式…

【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个带头双向循环链表: 该带头双向循环链表使用动态内存分配空间,可以用来存储任意数量的同类型数据. 带头双向循环链表结点(No…

ISP--Black Level Correction(黑电平矫正)

图像的每一个像素点都是由一个光电二极管控制的,由二极管将电信号,转换为数字信号。 那么,我们知道了,图像的像素值是与电信号强度相关的。但是,我们得知道,每一个光电二极管要想工作,都得有一定…

2023年亚太杯数学建模亚太赛ABC题思路资料汇总贴

下文包含:2023年亚太杯数学建模亚太赛A- C题思路解析、选题建议、代码可视化及如何准备数学建模竞赛(23号发) C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料,帮助大家取得好成绩。2…

【python】直方图正则化详解和示例

直方图正则化(Histogram Normalization)是一种图像增强技术,目的是改变图像的直方图以改善图像的质量。具体来说,它通过将图像的直方图调整为指定的形状,以增强图像的对比度和亮度。 直方图正则化的基本步骤如下&…

Unity中Shader法线贴图(下)理论篇

文章目录 前言一、采样出错的原因二、切线空间是什么?切线空间图解: 三、计算方式1、统一变换到切线空间下进行计算2、统一变换到世界空间下进行计算 四、一般统一变换到世界空间下的坐标进行计算1、求M^-1^2、求出n~w~ 前言 这篇文章,主要解…

【腾讯云云上实验室-向量数据库】探索腾讯云向量数据库:全方位管理与高效利用多维向量数据的引领者

目录 前言1 腾讯云向量数据库介绍2 向量数据库信息及设置2.1 向量数据库实例信息2.2 实例监控2.3 密钥管理2.4 安全组2.5 Embedding2.6 可视化界面 3 可视化界面4 Embedding4.1 embedding_coll精确查询4.2 unenabled_embedding_coll精确查询 5 数据库5.1 创建数据库5.2 插入数据…

openGauss学习笔记-128 openGauss 数据库管理-设置透明数据加密(TDE)

文章目录 openGauss学习笔记-128 openGauss 数据库管理-设置透明数据加密(TDE)128.1 概述128.2 前提条件128.3 背景信息128.4 密钥管理机制128.5 表级加密方案128.6 创建加密表128.7 切换加密表加密开关128.8 对加密表进行密钥轮转 openGauss学习笔记-12…

2023.11.17使用flask将多个图片文件上传至服务器

2023.11.17使用flask将多个图片文件上传至服务器 实现功能: 1、同时上传多个图片文件 2、验证文件扩展名 3、显示上传文件的文件名 4、显示文件上传结果 程序结构 main.py from flask import Flask, request, jsonify, render_template import osapp Flask(__n…

C#,数值计算——插值和外推,分段线性插值(Linear_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 分段线性插值 /// Piecewise linear interpolation object. /// Construct with x and y vectors, then call interp for interpolated values. /// </summary> …

矩阵的QR分解

矩阵的QR分解 GramSchmidt 设存在 B { x 1 , x 2 , … , x n } \mathcal{B}\left\{\mathbf{x}_{1},\mathbf{x}_{2},\ldots,\mathbf{x}_{n}\right\} B{x1​,x2​,…,xn​}在施密特正交化过程中 q 1 x 1 ∣ ∣ x 1 ∣ ∣ q_1\frac{x_1}{||x_1||} q1​∣∣x1​∣∣x1​​ q k …

Apache Airflow (十一) :HiveOperator及调度HQL

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

【Flask使用】全知识md文档,4大部分60页第3篇:状态cookie和session保持

本文的主要内容&#xff1a;flask视图&路由、虚拟环境安装、路由各种定义、状态保持、cookie、session、模板基本使用、过滤器&自定义过滤器、模板代码复用&#xff1a;宏、继承/包含、模板中特有变量和函数、Flask-WTF 表单、CSRF、数据库操作、ORM、Flask-SQLAlchemy…

汇编-loop循环指令

LOOP指令是根据ECX计数器循环&#xff0c;将语句块重复执行特定次数。 ECX自动作为计数器&#xff0c; 每重复循环一次就递减1。 语法如下所示&#xff1a; 循环目的地址必须在距离当前位置计数器的-128到127字节范围内 LOOP指令的执行有两个步骤&#xff1a; 第一步&…

Pandas数据集的合并与连接merge()方法_Python数据分析与可视化

数据集的合并与连接 merge()解析merge()的主要参数 merge()解析 merge()可根据一个或者多个键将不同的DataFrame连接在一起&#xff0c;类似于SQL数据库中的合并操作。 数据连接的类型 一对一的连接&#xff1a; df1 pd.DataFrame({employee: [Bob, Jake, Lisa, Sue], grou…

电容的耐压值是什么意思呢?

电容是什么&#xff1f; 电容是一种能以电荷的形式储存能量的装置。与同样大小的电池相比&#xff0c;电容能储存的能量要小得多&#xff0c;大约1w个电容存储的能量才顶一节电池存储的能量&#xff0c;但对于许多电路设计来说却足够使用了。 看下图的直插式电容&#xff0c;…

[github配置] 远程访问仓库以及问题解决

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于新西兰奥克兰大学攻读IT硕士学位。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。跨领域…

V100 GPU服务器安装CUDA教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…