首页 > 其他分享 >转移指令的原理

转移指令的原理

时间:2023-04-15 11:33:20浏览次数:52  
标签:字节 -- jmp 地址 指令 原理 转移

转移指令有如下:

1.无条件转移指令(如:jmp)

2.条件转移指令

3.循环指令(如:loop)

4.过程

5.中断

操作符offset(取得标号的偏移地址)

jmp指令 --> 可以只修改IP ,也可以同时修改 CS 和 IP(实际是根据位移来转移的指令)

怎么计算位移

位移:该 jmp 要跳转到的标号内的第一个指令的偏移地址 减去(-)jmp 指令下一指令的偏移地址

机器码的字节数一般为 2 ~ 3 个字节 --> 机器本身的字节(1个字节) + 值的字节(寄存器的字节为2,al,ah等的字节为1)(值分为1字节值,如:21h --> (转化成汇编里的值)21 等,2字节值,如:2000h --> (转化成汇编里的值)0020),用来计算当前指令下一指令的偏移地址

jmp后的偏移地址为(即IP的值): jmp 下一条指令的偏移地址 + 位移(可能为正也可能为负)

https://fishc.com.cn/thread-27458-1-1.html
(借鉴的网站)

这里注意,此位移的计算只能适用于原有的语句,经过复制后得到的语句位移不变,即复制过后的语句的执行后的 ip == 该语句之下的一条语句 + 原有语句计算出来的位移

如:

首先我们能计算出 jmp short s 的 位移量 为 0008-0018 = -10(注意这里是十六进制的-10 --> (二进制)-16)
则执行 jmp short s 后ip 应该 == 0018 + (-10) == 0008 --> 恰好对应 s 的偏移地址
其次我们也能计算处 jmp short s1 的 位移量 为 0018-0022 = -10(注意这里是十六进制的-10 --> (二进制)-16)
由于 s 中的 jmp short s1 是复制过去的所以位移量不变 == 0018-0022 = -10 所以当执行 s 中的 jmp short s1 时
ip == 000A + (-10) = 0
可能的问题:s 中不是有两个 nop(nop指,这是一条空语句) 吗?为什么复制过后一个都没了呢? --> 这个跟机器码所占的字节有关,nop 所占的字节为 1,两个恰好是2字节,而jmp short s1 这条指令所占的字节为2字节,刚好覆盖了两个nop

需要:

转移的目的地址

转移的距离(段间转移,段内短转移,段内近转移)

jmp short 标号(转到标号处执行指令)

此种格式的jmp指令实现的是段内短转移
对IP的修改范围为 -128 ~ 127
即向前转移最多可以越过128个字节
向后转移最多可以越过127个字节

jmp near ptr 标号

该实现的是段内近转移
对IP的修改范围为 -32769 ~ 32767
即向前转移最多可以越过32769个字节
向后转移最多可以越过32767个字节

以上两种转移都是基于当前的IP的转移

jmp far ptr 标号

实现的是段间转移 --> 远转移

far ptr 指明了指令用标号的段地址和偏移地址,修改CS和IP

jmp 16为寄存器

功能:IP = (16位寄存器所存的值)
(1)jmp word ptr 内存单元地址(段内转移)
该内存单元地址处开始存放着一个字(数据),该字(数据)就是转移的目的偏移地址
(2)jmp dword ptr 内存单元地址(段间转移)
该内存单元地址处开始存放着一个两个字(数据),高地址处的字(数据)是转移的目的的段地址,低地址处的字(数据)是转移的目的的偏移地址(第一个字(数据)为低地址,第二个字(数据)为高地址)

所有的有条件转移指令都是段转移,对IP的修改范围都为 -128 ~ 127

jcxz指令(有条件转移指令)

格式:jcxz 标号

如果 cx = 0 那么转移到标号处执行
反之,则执行该语句的下一条指令,即跳过jcxz指令

loop指令(有条件转移指令)

格式 loop 标号

如果 cx != 0 那么转移到标号处执行
反之,则执行该语句的下一条指令,即跳过jcxz指令

值得注意的是,loop的指令执行时,首先dec cx,后才判断cx是否为0 --> 是否继续循环 (可以利用这个判断机制完成9.3的检测(不需要jcxz指令))

标签:字节,--,jmp,地址,指令,原理,转移
From: https://www.cnblogs.com/TFOREVERY/p/17318266.html

相关文章

  • 【Spring Cloud】Ribbon工作原理源码剖析
    Ribbon调用流程Ribbon工作原理为什么@LoadBalanced注解能赋予RestTemplate负载均衡的能力?Ribbon组件在启动时,会自动加载RibbonAutoConfiguration这个配置类,如下图RibbonAutoConfiguration加载于EurekaClientAutoConfiguration之前,加载于LoadBalancerAutoConfiguration之后......
  • Dataguard原理
    Dataguard原理 1.DataGuard概要​OracleDataGuard是Oracle自带的数据同步功能,基本原理是将日志文件从原数据库传输到目标数据库,然后在目标数据库上应用这些日志文件,从而使目标数据库与源数据库保持同步,是一种数据库级别的高可用性方案。DataGuard可以提供Oracle数据库的......
  • 状态对象、状态转移表、状态条件表、状态行为表
    笔记软件在2023/4/159:56:38推送该笔记状态对象、状态转移表、状态条件表、状态行为表classstateMachine{//状态机名称staticstateMachineName=''//当前状态staticcurrentState=''//状态对象(状态集合)staticStateTable:{/......
  • r0capture 原理分析
    r0capture是比较好用的抓包工具仅限安卓平台,测试安卓7、8、9、10、11、12可用;无视所有证书校验或绑定,不用考虑任何证书的事情;通杀TCP/IP四层模型中的应用层中的全部协议;通杀协议包括:Http,WebSocket,Ftp,Xmpp,Imap,Smtp,Protobuf等等、以及它们的SSL版本;通杀所有应用层框......
  • golang 必会之 pprof 监控系列(5) —— cpu 占用率 统计原理
    golangpprof监控系列(5)——cpu占用率统计原理大家好,我是蓝胖子。经过前面的几节对pprof的介绍,对pprof统计的原理算是掌握了七八十了,我们对memory,block,mutex,trace,goroutine,threadcreate这些维度的统计原理都进行了分析,但唯独还没有分析pprof工具是如何统计cpu使用情......
  • Linux内核进程管理原理详解(代码演示)
    **前言:**Linux内核里大部分都是C语言。建议先看《Linux内核设计与实现(LinuxKernelDevelopment)》,RobertLove,也就是LKD。Linux是一种动态系统,能够适应不断变化的计算需求。Linux计算需求的表现是以进程的通用抽象为中心的。进程可以是短期的(从命令行执行的一个命令),也可以是......
  • 17.6归并排序原理及实战
    #include<stdio.h>#include<stdlib.h>#defineN7typedefintElemType;voidMerge(ElemTypeA[],intlow,intmid,inthigh){staticElemTypeB[N];//加static的目的是无论函数执行多少次,都只有一个B[N]inti,j,k;for(i=low;i<=high;i++){......
  • Redis主从复制模式原理及演进
    一、主从模式主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主......
  • 【MySQL】主从复制实现原理详解
      目录一、概要1.1mysql复制的优点1.2Mysql复制解决的问题二、MySQL主从复制的概念三、MySQL主从复制的主要用途3.1读写分离3.2数据实时备份,当系统中某个节点发生故障时,可以方便的故障切换(主从切换)3.3高可用(HA)3.4架构扩展四、MySQL主从形式一主一从......
  • SpringCloud Netflix 组件 的核心/原理
     1.Eureka:服务注册、续约、注销、心跳机制,集群的数据采用弱一致方案AP,分区的概念, https://blog.csdn.net/qq_22270363/article/details/1276690232.Ribbon:客户端(请求发起端)的负载均衡组件,核心有 --服务列表、负载均衡策略IRule、服务可用性检查IPing,负载均衡策略......