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

news2025/1/11 6:51:02

文章目录

  • 前言
  • 一、转移综述
    • 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.coloradmin.cn/o/1232335.html

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

相关文章

Vue移动 HTML 元素到指定位置 teleport 标签

teleport 标签&#xff1a;用于将组件中的 HTML 元素移动到任意的位置。 使用 teleport 标签移动 HTML 元素&#xff1a; <!-- 将 teleport 中的内容移动到 body 标签中 --> <teleport to"body"><div><h3>我是第三层组件的标题</h3>…

腾讯云轻量数据库1核1G性能测评、租用费用和详细介绍

腾讯云轻量数据库服务采用腾讯云自研的新一代云原生数据库 TDSQL-C&#xff0c;融合了传统数据库、云计算与新硬件技术的优势&#xff0c;100%兼容 MySQL&#xff0c;实现超百万级 QPS 的高吞吐&#xff0c;128TB 海量分布式智能存储&#xff0c;保障数据安全可靠。腾讯云百科t…

Android Termux安装MySQL,内网穿透实现公网远程访问

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…

【Linux】:进程间通信和日志模拟

进程间通信 一.基本概念二.简单的通信-管道(匿名管道)1.建立通信信道2.通信接口 三.命名管道三.模拟命名管道通信&#xff08;加上日志&#xff09;1.完整代码2.基本使用 一.基本概念 是什么 两个或多个进程实现数据层面的交互。 因为进程独立性的存在&#xff0c;导致进程间…

【前段基础入门之】=>CSS3新特性 BFC

什么是BFC( 概念) W3C 上对 BFC 的定义&#xff1a; MDN 上对 BFC 的定义&#xff1a; 简而言之 开启了BFC能解决什么问题 元素开启 BFC 后&#xff0c;其子元素不会再产生 margin 塌陷问题元素开启 BFC 后&#xff0c;自己不会被其他浮动元素所覆盖元素开启 BFC 后&#xff0…

【Java】多线程-wait/notify

1、wait和notify Java的多线程中&#xff0c;线程的执行顺序和时间都是不定的。为了控制线程的调度顺序&#xff0c;前面我们引入了join()方法。 但是join()只能在线程执行完后&#xff0c;才能执行其他线程&#xff0c;有没有什么方法可以在线程执行顺序中来调度其他线程呢&…

代码随想录 Day50 单调栈 LeetCodeT503 下一个最大元素II T42接雨水

前言 前面我们说到了单调栈的第一题,下一个最大元素I,其实今天的两道题都是对他的变种,知道第一个单调栈的思想能够想清楚,其实这道题是很简单的 考虑好三个状态,大于等于小于,其实对于前面这些题目只要细心的小伙伴就会发现其实小于和等于的处理是一样的都是直接入栈,只有大于…

灵魂拷问std::enable_shared_from_this,揭秘实现原理

灵魂拷问std::enable_shared_from_this&#xff0c;揭秘实现原理 引言 在C编程中&#xff0c;使用智能指针是一种安全管理对象生命周期的方式。std::shared_ptr是一种允许多个指针共享对象所有权的智能指针。然而&#xff0c;当一个对象需要获取对自身的shared_ptr时&#xff0…

中贝转债上市价格预测

中贝转债-113678 基本信息 转债名称&#xff1a;中贝转债&#xff0c;评级&#xff1a;A&#xff0c;发行规模&#xff1a;5.17亿元。 正股名称&#xff1a;中贝通信&#xff0c;今日收盘价&#xff1a;49.2元&#xff0c;转股价格&#xff1a;32.8元。 当前转股价值 转债面值…

JavaScript中的random小案例

前言 Math对象是JavaScript的内置对象&#xff0c;而random是Math对象属性 Math.random&#xff08;&#xff09;函数返回一个浮点数&#xff0c;伪随机数在范围从0 到小于1&#xff0c;也就是说&#xff0c;从 0&#xff08;包括 0&#xff09;往上&#xff0c;但是不包括 1&a…

Python编程技巧 – 使用字典

Python编程技巧 – 使用字典 Python Programming Skills – Using Dictionary Dictionary, 即字典&#xff0c;这是Python语言的一种重要的数据结构&#xff1b;Python字典是以键&#xff08;key&#xff09;值(value)对为元素&#xff0c;来存储数据的集合。 前文提到Python列…

春秋云境靶场CVE-2022-30887漏洞复现(任意文件上传漏洞)

文章目录 前言一、CVE-2022-30887描述和介绍二、CVE-2021-41402漏洞复现1、信息收集2、找可能可以进行任意php代码执行的地方3、漏洞利用找flag 总结 前言 此文章只用于学习和反思巩固渗透测试知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随…

【电路笔记】-星三角变换(Star-Delta Transformation)

星三角变换&#xff08;Star-Delta Transformation&#xff09; 文章目录 星三角变换&#xff08;Star-Delta Transformation&#xff09;1、概述1.1 单相配置1.2 多相配置 2、三相连接2.1 Y配置2.2 Δ配置 3、Y-Δ 和 Δ-Y 变换3.1 Y-Δ变换3.2 Δ-Y变换3.3 应用 4、总结 本文…

使用ssh在本地环境(Windows)连接虚拟机以及其中的docker容器

配置虚拟机防火墙 防火墙的一系列操作需要root权限&#xff0c;默认是没有root密码的&#xff0c;所以首先需要设置root密码&#xff1a; sudo passwd root按提示完成root密码设置 切换到root账户 su root启用22端口并重启防火墙 firewall-cmd --permanent --add-port22/tc…

【zabbix监控四】zabbix之监控tomcat服务报警

一、监控tomcat服务是否正常运行 1、客户端部署 首先要在zabbix-agent客户端上安装tomcat服务&#xff0c;并能正常启动和关闭 1.1 客户端编写脚本 vim /opt/tomcat.sh#!/bin/bash anetstat -natp |grep 8080|awk {print $6}|grep LISTEN if [[ $a LISTEN ]];thenecho &qu…

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

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

HandBrake :MacOS专业视频转码工具

handbrake 俗称大菠萝&#xff0c;是一款免费开源的视频转换、压缩软件&#xff0c;它几乎支持目前市面上所能见到的所有视频格式&#xff0c;并且支持电脑硬件压缩&#xff0c;是一款不可多得的优秀软件 优点 ∙Windows, Linux, Mac 三平台支持 ∙开源、免费、无广告 ∙支…

SSM2

DataSource mybatis与Spring整合 事务加载业务层上面 开启事务驱动 上面都是声明式开启事务 图书管理系统 命名规范: java命名规范:驼峰命名法类:大驼峰变量,属性名.方法名:小驼峰 常量使用下划线分割:全大写,单词与单词之间下划线分割数据库命名规范:常用命名规范:下划线…

Python将原始数据集和标注文件进行数据增强(随机仿射变换),并生成随机仿射变换的数据集和标注文件

Python将原始数据集和标注文件进行数据增强&#xff08;随机仿射变换&#xff09;&#xff0c;并生成随机仿射变换的数据集和标注文件 前言前提条件相关介绍实验环境生成随机仿射变换的数据集和标注文件代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#x…

基于单片机K型热电偶温度采集报警系统

**单片机设计介绍&#xff0c; 基于单片机K型热电偶温度采集报警系统 文章目录 一 概要简介系统特点系统组成工作原理应用领域 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 基于单片机K型热电偶温度采集报警系统介绍 简介 该系统是基于单片…