【汇编】“转移”综述、操作符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 指令,程序员能够以底层的方式控制程序的执行流程,实现更复杂和灵活的逻辑。这种能力为编程带来了更高的自由度,同时也要求程序员对计算机体系结构有更深入的理解。在深入学习汇编语言的过程中,理解和掌握这些“转移”的机制将成为编程技能中的重要一环。
相关文章:
【汇编】“转移”综述、操作符offset、jmp指令
文章目录 前言一、转移综述1.1 :背景:1.2 转移指令1.3 转移指令的分类按转移行为根据指令对IP修改的范围不同 二、操作符offset2.1 offset操作符是干什么的?标号是什么? 2.2 nop是什么? 三、jmp指令3.1 jmp指令的功能3.2 jmp指令&…...
Java格式化类Format
文章目录 Format介绍Format方法- format(格式化)- parseObject(解析) 格式化分类日期时间格式化1. DateFormat常用方法getInstancegetDateInstancegetTimeInstancegetDateTimeInstance 方法入参styleLocale 2. SimpleDateFormat常…...
力扣每日一题-美化数组的最少删除数-2023.11.21
力扣每日一题:美化数组的最少删除数 开篇 今天的力扣每日一题居然写出来了,好开心,迫不及待地把题目分享出来,希望你也能把它狠狠拿下。 题目链接: 2216.美化数组的最少删除数 题目描述 代码思路 创建一个list集合来保存数组&a…...
【练习】检测U盘并自动复制内容到电脑的软件
软件作用: 有U盘插在电脑上后,程序会检测到U盘的路径。 自己可以提前设置一个保存复制文件的路径或者使用为默认保存的复制路径(默认为桌面,可自行修改)。 检测到U盘后程序就会把U盘的文件复制到电脑对应的…...
【计算机毕业设计】Springboot高校论文管理系统 -96280,免费送源码,【开题选题+程序定制+论文书写+答辩ppt书写-原创定制程序】
SpringBoot论文管理系统 摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,高校当然也不例外。论文管理系统是以实际运用为开发背景,运用软件工程原理和开发方…...
nginx 代理接口报404 问题排查
今天遇到一个nginx代理后端接口请求报404的问题,问题是这样的,后端由于服务器没有环境,但是需要和前端联调,于是采用cpolar内网穿透的方式,穿出来了。但是前端请求跨域,于是前端用nginx代理了一下后端接口&…...
JVM 调优指南
文章目录 为什么要学 JVM一、JVM 整体布局二、Class 文件规范三、类加载模块四、执行引擎五、GC 垃圾回收1 、JVM内存布局2 、 JVM 有哪些主要的垃圾回收器?3 、分代垃圾回收工作机制 六、对 JVM 进行调优的基础思路七、 GC 情况分析实例 JVM调优指南 -- 楼兰 JV…...
澳洲猫罐头如何?我亲自喂养过的优质猫罐头分享
猫罐头要符合三点:营养配方完整均衡、原料新鲜优质、生产工艺科学可靠。只有具备这些特点,才是品质上乘的猫罐头。 猫罐头的三个要素,一个都不能少。配方不均衡,营养就不足;原料不新鲜,生产出来的猫罐头就…...
CISP练习测试题
免责声明 文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 某公司准备在业务环境中部署一种新的计算机产品,下列哪一项…...
2023下半年软件设计师考试知识点大全思维导图
软件设计师考试知识点大全思维导图 2023年下半年第一次机考 复习资料 以上是我在学习过程中根据自己的知识结构的特点及刷到的考题 做的导图,有需要的可以留言发原版的 mmap格式文件 方便自己拓展. 软考资料 这是网上找的资料 汇总免费放在这里 吧![ 链接&#x…...
[C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数
📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…...
Android Binder 跨进程通信的优势是什么
Android Binder 跨进程通信的优势是什么 Android Binder 是 Android 系统中用于实现跨进程通信的底层机制,具有以下优势: 高效性:Android Binder 使用共享内存技术,在进程间传递数据时不需要进行数据拷贝,从而提高了传…...
HashMap的详细解读
HashMap是Java语言中的一个重要数据结构,它实现了Map接口,允许我们存储键值对,并且可以根据键直接访问对应的值。 特性 键值对存储:HashMap存储的是键值对数据,可以方便的通过键来获取值。无序:HashMap中…...
10个好用的Mac数据恢复软件推荐—恢复率高达99%
如果您正在寻找最好的 Mac 数据恢复软件来检索意外删除或丢失的文件,那么这里就是您的最佳选择。 我们理解,当您找不到 Mac 计算机或外部驱动器上保存的一些重要文件时,会感到多么沮丧和绝望。这些文件非常珍贵,无论出于何种原因…...
EtherCAT从站EEPROM分类附加信息详解:RXPDO(输入过程数据对象)
0 工具准备 1.EtherCAT从站EEPROM数据(本文使用DE3E-556步进电机驱动器)1 分类附加信息——RXPDO(输入过程数据对象) 1.1 分类附加信息规范 在EEPROM字64开始的区域存储的是分类附加信息,这里存储了包括设备信息、SM配置、FMMU配置在内的诸多信息。每个信息在一段连续的…...
释放锁流程源码剖析
1 释放锁流程概述 ReentrantLock的unlock()方法不区分公平锁还是非公平锁。 首先调用unlock()方法。 unlock()底层使用的是Sync.release(1)方法 public void unlock() {<!-- --> sync.release(1); } release(1)方法会调用tryRelease(1)去尝试解锁。 public fin…...
ComText让机器人有了情节记忆
为了让人类与机器人更好地交流,MIT 计算机科学与人工智能实验室的研究员开发了一个名为 ComText 的程序。这款程序给机器人增加了情节记忆,让它们能够接受更加复杂的命令。目前,他们已经在机器人 Baxter 上测试了程序。 机器人没有情景化的记…...
【Leetcode合集】13. 罗马数字转整数
13. 罗马数字转整数 13. 罗马数字转整数 代码仓库地址: https://github.com/slience-me/Leetcode 个人博客 :https://slienceme.xyz 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符…...
centos oracle11g开启归档模式
要在 CentOS 上停止 Oracle 11g 数据库,你可以按照以下步骤操作: 1.登录到操作系统 首先,使用具有足够权限的用户登录到 CentOS 操作系统。通常情况下,你需要以具有 oracle 用户权限的用户登录。 使用 SYSDBA 权限连接到数据库…...
【数据结构初阶】双链表
双链表 1.双链表的实现1.1结口实现1.2申请结点1.3初始化双链表1.4打印双链表1.5尾插1.6尾删1.7头插1.8头删1.9计算大小1.10查找1.11pos位置插入1.12删除pos位置1.12删除双链表 全部码源 1.双链表的实现 1.1结口实现 #include<stdio.h> #include<stdlib.h> #inclu…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...
AWS vs 阿里云:功能、服务与性能对比指南
在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...
CppCon 2015 学习:Simple, Extensible Pattern Matching in C++14
什么是 Pattern Matching(模式匹配) ❝ 模式匹配就是一种“描述式”的写法,不需要你手动判断、提取数据,而是直接描述你希望的数据结构是什么样子,系统自动判断并提取。❞ 你给的定义拆解: ✴ Instead of …...
