4.6 offset指令,jmp short指令,far,dword ptr各种跳转指令

4.6 offset指令,jmp short指令,far,dword ptr各种跳转指令

可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括的讲,转移指令就是可以控制CPU执行内存中某处代码的指令

1. 转移指令

1.1 8086CPU的转移行为有以下几类

  • 只修改IP时,称为段内转移,比如:jmp ax
  • 同时修改CS和IP时,称为段间转移,比如:jmp 1000:0

1.2 段内转移又分为:短转移和近转移

  • 短转移IP的修改范围为-128-~127
  • 近转移IP的修改范围为-32768~32767

1.3 8086CPU的转移指令分为以下几类

  • 无条件转移指令(如:jmp)
  • 条件转移指令
  • 循环指令(如:loop)
  • 过程
  • 中断

2. jmp short指令

  • jmp short 标号(转到标号处执行指令),这种格式的jmp指令实现的是段内短转移
  • 它对IP的修改范围为-128~127个字节
  • 转移指令结束后,CS:IP应该指向标号处的指令
  • 这里jmp存的不是目标地址,而是位移距离
assume cs:codesg  
codesg segmentstart:mov ax,0jmp short sadd ax,1s:inc axcodesg ends
end start

image.png

image.png

image.png

3. jmp far ptr指令

  • 当超出jmp short 范围时,编译会报错

image.png

  • 此时使用jmp far ptr指令即可
assume cs:codesg  
codesg segmentstart:mov ax,0mov bx,0inc cxjmp far ptr sdb 256 dup(0)s:inc axcodesg ends
end start

image.png

  • 注意:此时jmp记录的不是偏移量,而是整个地址,因为位移太大不好计算,直接记录cs:ip地址

image.png

4. 转换地址在内存中的jmp指令有两种格式

4.1 jmp word ptr 内存单元地址(段内转移)

  • 功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址;就是把指定内存单元的地址的数据拿过来作为跳转的地址
  • 例如:
assume cs:codesg  
codesg segmentstart:mov ax,0123hmov ds:[0],ax    jmp word ptr ds:[0]    //ds为段地址,[0]处的数据为偏移地址,将ip改为该地址codesg ends
end start

image.png

4.2 jmp dword ptr 内存单元地址(段间转移)

  • 如果要cs:ip同时更改,可以用这个
  • 功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址
  • cs = 内存单元地址 + 2;ip = 内存单元地址
assume cs:codesg  
codesg segmentstart:mov ax,0123hmov ds:[0],ax            //把ax的值赋给该地址的内存数据mov word ptr ds:[2],0    //把该地址处的内存数据改为0000jmp dword ptr ds:[0]     //跳转到cs:ip即0000:0123这个位置codesg ends
end start

image.png

image.png

image.png

  • cs为内存地址+2即ds:[2],0000
  • ip为内存地址即ds:[0],0123

5. jcxz指令

image.png

  • cx为0就跳转

6. 操作符offset指令

操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址

assume cs:codesg  
codesg segmentstart:mov ax,offset startmov dx,offset ss:mov bx,cxinc bxcodesg ends
end start

image.png

image.png

  • start 标号是0,所以offset取出start的偏移地址赋给ax
  • s 标号是6,所以offset取出s的偏移地址赋给dx

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

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

相关文章

“帮助“Java成长的世界级大师不简单!

文章目录 初探编程:“天啊,真酷,程序真的能学习。”哺育Java成长,成为Java幕后英雄出书《Effective Java》斩获Jolt图书大奖 是谁?作品一出版就获得著名的Jolt图书大奖,每一版本豆瓣评分均超9.0&#xff01…

Windows虚拟主机如何创建数据库和导入数据库

看到有网友咨询想要知道Windows虚拟主机上如何使用数据库,由于是新手,对于主Plesk面板使用不是很了解,想要知道如何使用数据库,这边了解到他当前使用的是Hostease 的Windows 虚拟主机,首先,登录你的Plesk面板,这里有一…

如何保护IP地址?安全匿名上网的方法

当互联网成为每个家庭的重要组成部分后,IP地址就成了你的虚拟地址。您的请求从该地址开始,然后 Internet 将消息发送回该地址。那么,您担心您的地址被泄露吗? 对于安全意识高或者某些业务需求的用户,如果您正在寻找保护…

生存分析笔记

生存分析(英语:Survival analysis)是指根据试验或调查得到的数据对生物或人的生存时间进行分析和推断,研究生存时间和结局与众多影响因素间关系及其程度大小的方法,也称生存率分析或存活率分析,例如生物有机…

VIVADO固化程序步骤

VIVADO固化程序步骤 1烧录bit文件 1、正确的将FPGA专用下载器与调试板卡或者产品连接,检查无误后打开电源上电。注:严禁带电操作。 2、打开VIVADO18.3软件,如下所示: 3、点击Open Hardware Manager,界面如下所示: 4…

Python网络爬虫(三):Selenium--以携程酒店为例

1 Selenium简介 Selenium是一个用于网站应用程序自动化的工具,它可以直接运行在浏览器中,就像真正的用户在操作一样。它相当于一个机器人,可以模拟人类在浏览器上的一些行为,比如输入文本、点击、回车等。Selenium支持多种浏览器&…

基于Springboot + MySQL + Vue 大学新生宿舍管理系统 (含源码)

目录 📚 前言 📑摘要 📑操作流程 📚 系统架构设计 📚 数据库设计 💬 管理员信息属性 💬 学生信息实体属性 💬 宿舍安排信息实体属性 💬 卫生检查信息实体属性 &…

SD-WAN国际网络专线:高效、合规且可靠的跨境连接解决方案

在数字化时代,企业对跨境网络连接的需求日益增长。SD-WAN技术作为一种新兴的解决方案,正逐渐成为构建跨境网络连接的首选。本文将探讨SD-WAN国际网络专线的发展现状、合规性要求以及选择时需要考虑的关键因素。 SD-WAN技术:跨境网络连接的新…

兔子洞里有什么?揭开BunnyLoader 3.0恶意软件的神秘面纱

本文将重点针对最新上线的恶意软件BunnyLoader 3.0进行详细介绍和深入分析,并探索BunnyLoader的基础架构和功能。BunnyLoader是一款一直在发展和进化的恶意软件,威胁行为者可以利用BunnyLoader窃取用户数据、凭证和加密货币,并向目标用户传递…

使用minikube安装使用单机版K8S(docker)

前置:作为一个开发,工作之余想玩一下k8s,但是搭建成本太高,所以就找到了minikube这个工具,快速搭建单机版k8s,下面是个人搭建流程,基于centos7,仅供参考。 1.下载kubectl&#xff0…

C++中的List容器用法详解

文章目录 C中的List容器用法详解List 的特点List 的重要接口用法介绍1.创建和初始化Listlist 2.插入元素push_backpush_forntinsert 删除元素pop_backpop_fontclearerase 遍历List迭代器遍历范围for遍历 排序Listsort 反转Listreverse 转移Listsplice 去重unique 合并merge 总结…

【JVM】如何定位、解决内存泄漏和溢出

目录 1.概述 2.堆溢出、内存泄定位及解决办法 2.1.示例代码 2.2.抓堆快照 2.3.分析堆快照 1.概述 常见的几种JVM内存溢出的场景如下: Java堆溢出: 错误信息: java.lang.OutOfMemoryError: Java heap space 原因:Java对象实例在运行时持…