【汇编】“转移”综述、操作符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.mzph.cn/news/153152.shtml

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

相关文章

【目标测距】雷达投影测距

文章目录 前言一、读取点云二、点云投影图片三、读取检测信息四、点云投影测距五、学习交流 前言 雷达点云投影相机。图片目标检测,通过检测框约束等等对目标赋予距离。计算消耗较大,适合离线验证操作。在线操作可以只投影雷达检测框。 一、读取点云 py…

校园报修抢修小程序系统开发 物业小区报修预约上门维修工单系统

开发的功能模块有: 1.报修工单提交:学生、教职员工等可以使用小程序提交报修请求。这通常包括选择报修的问题类型(如水漏、电器故障、照明问题等),地点,报修联系人,联系电话等,并提供…

【5k字长文 | Vue学习笔记】#1 认识Vue对象和基础语法

Vue是一个非常流行的渐进式JavaScript框架,渐进式指的是自底向上,从小组件逐渐向上构成整个项目,渐进式还可以理解为:用什么就拿什么,每个组件只做自己的事,尽可能解耦合。 本节我们将学习简单的Vue实例&a…

Thales安全解决方案:国家网络安全的关键

随着信息技术的飞速发展,网络安全问题日益凸显。在这个背景下,Thales安全解决方案正成为提高国家网络安全的关键。本文将探讨Thales安全解决方案如何为国家网络安全保驾护航。 一、Thales安全解决方案概述 Thales安全解决方案是一种全方位的网络安全防护…

upload-labs关卡11(双写后缀名绕过)通关思路

文章目录 前言一、回顾前几关知识点二、靶场第十一关通关思路1、看源代码2、bp抓包双写后缀名绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识,禁止用于做非法攻击。注意靶场是可以练习的平台,不能随意去尚未授权的…

细思极恐!5秒钟克隆你的声音

Mocking Bird 是开发者 babysor 开源的比较火的 AI 拟声开源项目,目前在 GitHub 已经获得了 32K 的 Star,它能在 5 秒内克隆你的声音并生成任意语音内容,支持中文普通话。 01 功能特性 支持中文普通话拟声,并且在多个中文数据集…

小程序授权获取头像

wxml <view class"header"><text>头像</text><button class"butt" plain"true" open-type"chooseAvatar" bind:chooseavatar"chooseAvatar"><image src"{{HeadUrl}}" mode"&quo…

初刷leetcode题目(5)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

工具及方法 - 多邻国: Duolingo

网站&#xff1a;Duolingo 有iOS和Android应用&#xff0c;在App Store和Google Play上都能下载。也可以使用网页版。我就在iOS上安装了付费版&#xff0c;为了小朋友学习英语&#xff0c;一年的费用&#xffe5;588。 目前学习中的课程是英语、日语和粤语。英语是小学课程&a…

GPU Microarch 学习笔记【3】Tensor Core

目录 1. 指令与架构 2. Load 3. 计算MMA 4. Set, Step 与thread group 5. OCTET 6. Tensor Core微架构 7. Final Nvidia自从Volta/Turing&#xff08;2018&#xff09;架构开始&#xff0c;在stream multi processor中加入了tensor core&#xff0c;用于加速矩阵计算。如…

代码随想录算法训练营Day36 —— 435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 思路&#xff1a; 按照左边排序&#xff0c;按照452引爆气球的思路即可&#xff0c;统计重叠区间个数就是最小删除个数&#xff0c; 直接改点就好。 代码&#xff1a; //手搓 class Solution { private:static bool cmp(const vector<int>& a, c…

用Java实现简单的俄罗斯方块

一、创建新项目 1.首先新建一个项目&#xff0c;并命名为俄罗斯方块。 2.其次新建一个类&#xff0c;命名为Main&#xff0c;或其他的。 二、运行代码package 俄罗斯方块; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java…

贝锐蒲公英路由器X4C如何远程访问NAS?

在目前网盘前路坎坷的情况下&#xff0c;私人云盘已然是一种新的趋势&#xff01;那自己打造一个私有云盘&#xff0c;是否需要高成本或是高门槛呢&#xff1f;其实并不用&#xff01;蒲公英针对个人玩家打造了全方位的私有云解决方案。 &#xff08;1&#xff09;入门级玩家只…

计算机毕业论文内容参考|基于深度学习的交通标识智能识别系统的设计与维护

文章目录 导文摘要前言绪论1课题背景2国内外现状与趋势3课题内容相关技术与方法介绍系统分析总结与展望导文 基于深度学习的交通标识智能识别系统是一种利用深度学习模型对交通标识进行识别和解析的系统。它可以帮助驾驶员更好地理解交通规则和安全提示,同时也可以提高道路交通…

全志H616开发版

开发板介绍&#xff1a; 二、开发板刷机 SDFormatter TF卡的格式化工具、Win32Diskimager 刷机工具 刷机镜像为&#xff1a;Orangepizero2_2.2.0_ubuntu_bionic_desktop_linux4.9.170.img 使用MobaXterm_Personal_20.3连接使用 网络配置&#xff1a;nmcli dev wifi 命令接入网…

策略模式在数据接收和发送场景的应用(升级版)

1.背景 在数据接收和发送场景打算使用了 if else 进行判断&#xff1a; if("A".equals(system)){ASystem.sync("向A同步数据"); } if("B".equals(system)){BSystem.sync("向B同步数据"); } ... 非常麻烦&#xff0c;需求多了很臃肿&…

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> …

Windows 安装 Docker

目录 前言安装 WSL2WSL2 简介系统要求安装步骤 安装 Docker Desktop下载安装验证 安装 Docker Compose结语开源项目 前言 下图展示了在 Windows 系统上安装 Docker&#xff0c;并利用Docker Compose一键搭建 youlai-mall 微服务商城所需的环境。本篇将先介绍 Windows 上如何安…

【Linux】指令详解(二)

目录 1. 前言2. 重新认识指令2.1 指令的本质2.1.1 which2.1.2 alias 3. 常见指令3.1 whoami3.2 cd3.2.1 cd -3.2.2 cd ~ 3.3 touch3.3.1 文件创建时间 3.4 stat3.5 mkdir3.5.1 创建一个目录3.5.2 创建路径 3.6 tree3.7 rm3.7.1 rm -f3.7.2 rm -r 3.8 man3.9 cp3.10 mv 1. 前言 …

Leetcode刷题详解——删除并获得点数

1. 题目链接&#xff1a;740. 删除并获得点数 2. 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获得 nums[i] 的点数。之后&#xff0c;你必须删除 所有 等于 nums[i] …