首页
学习
活动
专区
圈层
工具
发布

汇编转移指令jmp原理

在根本上,将cs,ip寄存器所指向的内存当做代码,指令转移就是修改cs,ip寄存器的指向,汇编中提供了一种修改它们的指令——jmp。...jmp s所对应的机器码为”EB01”,在“Inc ax”后面再加其他的指令(加两个 nop指令)此时jmp所对应的机器码为”EB03”,每一个nop指令占一个字节,在添加或删除它们之间的代码可以看到jmp...指令所对应的机器码占两个字节,第一个字节的机器码并不发生改变,改变的是第二个字节的内容,并且第二个字节的内容存储的是跳转目标指令所在内存与jmp指令所在内存之间的位移。...其实cup在执行jmp指令时并不会记录标号所在的内存地址,而是通过标号与jmp指令之间的位移,假设jmp指令的下一条指令的地址为org,位移为idata,则目标的内存地址为dec = org + idata...jmp指令所占的空间为2个字节,一个保存jmp本省的机器码,EB,另一个保存位移。

2K10

X64汇编之指令格式解析

最近由于项目组内要做特征码搜索的东西,便于去Hook一些未导出函数,你懂得...于是就闲着学习了一下x86/x64的汇编指令格式。...总要有人来完成剩下的工作吧,这里我就把研究一天的x64汇编指令格式共享给大家。 一.首先打开Inter手册,看到x64汇编指令格式有多大改动,不多说,看图。 ?...W标识改变默认操作数大小,比如现在x64有个汇编代码mov r8,r10。一般很多指令都是默认32位操作数的,只有在CS.L==1&&CS.D==0的时候才会是64位操作数(我没见过)。...比如说一个简单的例子,x64下的绝对跳转0xFF25 + 0x0000 + [8字节绝对地址]。我们去搜索Inter手册的jump指令看一下: FF /4 JMP r/m32 M N.S....其实很多人不明白0xFF25 为什么后面要加4个0x00.现在工作机上没x64内联汇编环境验证不了,我理解这个其实是一个偏移指示这条指令之后多远的地方存放着一个64位地址,然后再jump到这个64位地址上去

4.6K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Android 逆向】x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )

    文章目录 一、call 子函数调用指令 二、jmp 跳转指令 三、lea 加载指令 四、mov 数据传送指令 总结 一、call 子函数调用指令 ---- call 指令是 子函数调用指令 , 调用的指令的下一条指令地址入栈..., 会自动跳转到 子函数 目标地址中 , 该地址可能存储在寄存器中 , 也可能是一个常量 ; 二、jmp 跳转指令 ---- jmp 跳转指令 , 默认情况下是无条件跳转 ; 如果想要附加条件跳转 ,...; n : negative , 反条件 ; o : 对应 溢出标志 , 减法操作是否会导致溢出 ; ( 与运算不存在进位 , 没有溢出 ) p : 对应 奇偶 位 , 运算结果 的...---- mov 指令是数据传送指令 ; mov a1 , a2 指令的作用是 , 将 a2 中的值写入到 a1 中 ; 总结 ---- align 字节对齐 , db 声明字符 / 字符串 , nop...空指令 cmp 比较 , test 比较 call 子函数调用指令 , jmp 跳转指令 ( 可选参数 a , b , c , g , l , o , p , s , z , e , n) lea

    1.8K10

    【汇编语言】转移指令的原理(二) —— 一步到位:jmp 指令的四种跳转方式

    1.3 寻找 jmp short 标号 的原理 1.3.1 观察机器指令 汇编指令jmp short s对应的机器指令应该是什么样的呢? 我们先看一下别的汇编指令和其对应的机器指令。...可以看到,在一般的汇编指令中,汇编指令中的idata(立即数),不论它是表示一个数据还是内存单元的偏移地址,都会在对应的机器指令中出现,因为CPU执行的是机器指令,它必须要处理这些数据或地址。...令人奇怪的是,汇编指令jmp short s中,明明是带有转移的目的地址(由标号s表示)的,可翻译成机器指令后,怎么目的地址就没了呢?没有了目的地址,CPU如何知道转移到哪里呢?...这个位移,是编译器根据汇编指令中的“标号”计算出来的,具体的计算方法如下图所示。 实际上,指令“jmp short 标号”的功能为:(IP)=(IP)+8位位移。...转移地址在寄存器中的jmp指令 指令格式:jmp 16位 reg 功能:(IP)=(16 位 reg) 这种指令我们在前面的内容中已经讲过,这里就不再详述,详细内容见: 【汇编语言】寄存器(CPU工作原理

    1.6K10

    汇编跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    一、无条件跳转: JMP ;无条件跳转 二、根据CX、ECX寄存器的值跳转: JCXZ ;CX 为 0 则跳转 JECXZ;ECX 为 0 则跳转 三、根据 EFLAGS 寄存器...根据标志位跳转的指令: JE ;等于则跳转 同JZ JNE ;不等于则跳转 同JNZ JA ;无符号大于则跳转 JNA ;无符号不大于则跳转 JAE ;无符号大于等于则跳转 同JNB JNAE...7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF 溢 出 方 向 中 断 陷 阱 符 号 零 未 用 辅 助 未 用 奇 偶 未 用 进 位 影响标志位的汇编指令...指令类型 助记符 对标志寄存器的影响 备注 ZF CF PF SF OF AF DF IF TF 数据传送类 通用 MOV 不影响标志位 交换 XCHG 堆栈操作 PUSH POP 地址传送...WAIT 交权 ESC 总线锁定前缀 LOCK JMP 测试 ; Test28_1.asm; .386 .model flat, stdcall include windows.inc

    13.9K20

    16位汇编第九讲汇编指令以及逆向中的花指令

    16位汇编第九讲汇编指令以及逆向中的花指令 一丶LOOP指令(循环指令) 作用:   循环指令利用cx计数器自动减1,方便实现计数循环的程序结构...返回指令回到主程序继续执行 如果懂C语言或者别的更高级的语言的请看   这个其实就是函数,为了代码的重用性,可利用性研究出来的,否则汇编代码一多就会很乱,比如有效的管理代码 比如ret指令,其实就是平衡栈的...我们发现jmp的地方下面申请了一个字节,但是在汇编的时候,这1个字节和mov的机器码在一起了 因而产生的汇编代码就出错了,花指令混淆就是这样,这段代码还是可以正常执行的 对抗手法 1.如果是动态的调试,...那么花指令是没用的(动态调试就是一步一步走)为什么,因为为了保证汇编代码不出错 每走一次代码都会重新反汇编 2.花指令主要对抗的是静态调试,因为病毒是不能运行的,只能看二进制和汇编,这个时候怎么办 我们发现了...然后发现花指令去除了,这个就是最简单的花指令,当然这个可以通过寻找jmp的跳转的字节数,把里面的内容依次修改为NOP,所以就有了花指令去除工具 注意,这里是最简单的花指令,还有更复杂的,道高一尺魔高一丈

    1.9K100

    远看像乱序执行,近看是内存屏障的BUG是如何被解决的

    具体如下: 未加if的汇编结果 0000000000499400 : 499400: eb 00 jmp 499402...如下图: 指令/时刻 T1 T2 T3 T4 T5 ADD 取指 译码 取操作数 执行 取结果 为了缩短指令执行的晶体震荡周期,芯片设计人员参考了工厂流水线机制的提出了指令流水线的想法,由于取指、译码这些模块其实在芯片内部都是独立的...,完成可以在同一时刻并发执行,那么只要将多条指令的不同步骤放在同一时刻执行,比如指令1取指,指令2译码,指令3取操作数等等,就可以大幅提高CPU执行效率: 指令/时刻 T1 T2 T3 T4 T5 T6...T7 T8 指令1 取指 译码 取操作数 执行 取结果 指令2 取指 译码 取操作数 执行 取结果 指令3 取指 译码 取操作数 执行 取结果 指令4 取指 译码 取操作数 执行...取结果 指令5 取指 译码 取操作数 执行 指令6 取指 译码 取操作数 指令7 取指 译码 指令8 取指 以上图流水线为例 ,在T5时刻之前指令流水线以每周期一条的速度不断建立

    82000

    汇编语言中的call指令和ret指令

    call指令是调用函数的意思,让处理器从新的内存地址开始执行,过程使用RET来返回,让处理器回到调用点上。 call会将返回地址压入堆栈,然后再将要被调用的地址复制到IP寄存器里。...当RET指令被执行的时候,就会从堆栈中弹出返回地址到IP寄存器内。 调用和返回示例 假设在 main 过程中,CALL 指令位于偏移量为 0000 0020 处。...通常,这条指令需要 5 个字节的机器码,因此,下一条语句(本例中为一条 MOV 指令)就位于偏移量为 0000 0025 处: main PROC 00000020 call MySub 00000025...ret MySub ENDP 当 CALL 指令执行时如下图所示,调用之后的地址(0000 0025)被压入堆栈,MySub 的地址加载到 EIP。...执行 MySub 中的全部指令直到 RET 指令。当执行 RET 指令时,ESP 指向的堆栈数值被弹岀到 EIP(如下图所示,步骤 1)。

    1.8K40

    CPU工作原理

    搭建开发测试环境(MacOS) 1.1 安装一些必要工具 # 安装汇编编译器 brew install nasm # 安装虚拟机 brew install qemu 1.2 测试代码 该代码的功能是在屏幕上打印...print.S # 创建虚拟机镜像 qemu-img create -f raw vm1.raw 1G # 将编译后的汇编程序写入第一个扇区 dd if=print.bin of=vm1.raw bs...: 指令寄存器IR 指令译码器ID 操作控制器OC 当我们的应用程序(也就是指令)被加载至内存以后,指令指针寄存器IP指向内存中下一条待执行的指令,该指令被送上地址总线以后,控制单元会获取指令 然后将其加载到指令寄存器...IR中,此时的指令只是一串数字和字母,CPU如果要知道其真正的执行含义必须借助指令译码器ID对这串数字和字母按照 指令的格式进行解码分析。...IA32(x86)指令格式如下: ? 前缀在指令格式中是可选模块,操作码对着我们应用程序中的mov,jmp等,寻址方式又分为基址寻址、变址寻址等(后续细讲),操作数类型记录的是 使用的寄存器。

    95130

    学 Linux 必会的 ARM 汇编指令

    学习 Linux 系统启动流程,必须熟悉几个汇编指令,总结给大家。 这里不是最全的,只列出一些最常用的汇编指令。...二.转移指令 【跳转指令】 B 跳转指令 BL 带返回的跳转指令 BLX 带返回和状态切换的跳转指令 BX 带状态切换的跳转指令 三.程序状态寄存器访问指令 1、【MRS指令】 MRS 通用寄存器...【AREA】 一个汇编程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段,因此在汇编程序的开头,我们一般的语句会用到AREA。...ENTRY 伪指令用于指定汇编程序的入口点。...在一个完整的汇编程序中至少要有一个 ENTRY (也可以有多个,当有多个 ENTRY 时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个 ENTRY (可以没有)。

    4.8K10

    16位汇编中的伪指令

    汇编中的伪指令(基于汇编编译器MASM讲解) 一丶什么是伪指令,以及作用 首先我们用汇编开发效率低,如何才能开发效率高,甚至开发速度比C语言或这个高级语言快 答案: 伪指令 什么是伪指令   伪指令是汇编编译器提供的...,比如昨天我们写的汇编代码,假设调用一个Call我们每次都要手工处理 保存栈底,开辟就变量空间,保存寄存器环境....每次都要做,特别麻烦,所以编译器帮我们提供了伪指令,只要我们 按照汇编编译器的语法去写...4 ;平栈 我们发现这些代码都要我们自己去写,我们可不可以只写我们的核心代码,而这些教给编译器去完成 下面开始汇编子程序(函数)的伪指令的编写 二丶汇编中函数伪指令的详细用法...,伪指令对应的汇编都会自动完成 add ax,cx ret ;平衡栈 MY_ADD endp  这里使用了伪指令,...五丶伪指令之汇编中的结构体 我们以前定义数据的时候都是在全局数据区去定义,但是这样不好,如果数据一多就不好整理了,现在伪指令提供了一个struct的关键字,让我们去定义 ?

    1.8K80

    Carbon:交互式反汇编工具

    Cerbero Suite是为x86/x64设计的一款交互式反汇编工具。最初的目的是为了让我们的用户能够检查内存转储中的代码以及shellcode。...特性介绍 Flat 反汇编视图 Carbon带有一个显示文件中所有指令的Flat 反汇编视图。我不排除将来可能会有图表视图,但它不是我优先考虑的事情。 ?...未来的挑战将是保持速度,同时增加更多的分析段落。 x86/x64 支持 Carbon同时支持x86和x64代码。将来会支持更多架构。 实际上,Carbon的设计允许在相同的反汇编视图中混合架构。...正如你所看到的,它最初都是未定义的数据: ? 在第一个字节按“C”后,我们得到一些初始指令: ? 但是,正如我们所看到的,突出显示的跳转无效。...通过“jmp”之前的“jne”,我们可以看到我们实际上在“jmp”指令之后跳转了一个字节。所以我们要做的是在“jmp”上按“U”,然后在地址0xA的字节上按“C”。 ?

    1.7K20

    【汇编语言】call 和 ret 指令(一) —— 探讨汇编中的ret和retf指令以及call指令及其多种转移方式

    前言 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。...本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。 想想程序之间的加载返回过程。...jmp 指令的原理相同。...3.2 理解指令 从上面的描述中,可以看出,如果我们用汇编语法来解释此种格式的 call指令,则: CPU 执行指令“call 标号”时,相当于进行: push IP jmp near ptr 标号...sp)) = (IP) (IP) = (16位寄存器) 4.2 理解指令 用汇编语法解释此种格式的 call 指令, CPU执行“call 16位 reg”时,相当于进行: push IP jmp

    1.1K10

    (九)汇编语言——转义指令的原理

    (九)汇编语言——转移指令的原理 文章目录 (九)汇编语言——转移指令的原理 转移指令 作用 分类 转移行为 转移距离 转移指令 操作符offset jmp指令 功能 原理 段间转移 段内转移 短转移...原理 长转移 原理 位移越界 转移地址 寄存器 内存 段内转移 段间转移 jcxz指令 功能 loop指令 功能 loop指令 功能 总结 接下来我们要介绍的是有关汇编语言里面的转移指令,其实对于转移指令我们已经接触过了...指令 jmp指令的话,我们之前简单介绍过,接下来,我们来详细的介绍一下这个指令。...但是呢,我们使用jmp指令的话,需要给出两种信息:第一就是转移的目的地址,其次就是转移的距离,具体分为以下三种: 段间转移(远转移):jmp 2000:1000 段内短转移:jmp short 标号...长转移 近转移:指令“jmp near ptr 标号”;功能:(IP)=(IP)+16位位移 原理 16位位移=“标号”处的地址 - jmp指令后的第一个字节的地址也就是位移); near ptr

    77020

    汇编语言篇——转移指令的原理

    一 实验目的和要求1、理解并掌握CPU转移指令的原理; 2、掌握特定功能的编程:显示字符串 。...在上面程序可以知道mov di,offset s;mov si,offset s2;mov ax,cs:[si];mov cs:[di],ax这四条指令就是把s2处的第一条指令对应的机器码复制到s处,而...s2处的指令会改变ip值使ip减去16位移到s1处的ip,也就是是说该jmp就是改变当前ip去实现跳转。...当程序执行到s0处时,跳到s处执行而s处由于刚才复制了s2处的机器码,因此s处的指令会将ip继续跳到程序第一条指令,mov ax,4c00h,使得程序得以结束。...四 实验分析这两次实验还是很值得去推敲和思考的,jmp指令的原理和寻址方式的使用,还有栈和寄存器值的灵活使用我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

    41410

    关于CPU的内部架构和工作原理

    控制单元 控制单元是整个CPU的指挥控制中心,由指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)和操作控制器OC(Operation...它根据用户预先编好的程序,依次从存储器中取出各条指令,放在指令寄存器IR中,通过指令译码(分析)确定应该进行什么操作,然后通过操作控制器OC,按确定的时序,向相应的部件发出微操作控制信号。...原理解说 控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址(这个地址是在内存里的)送到地址总线上去,然后CPU将这个地址里的指令读到指令寄存器进行译码。...操作码就是汇编里的mov、add、jmp等符号码;操作数地址说明该指令需要的操作数所在的地方,是在内存里还是在CPU的内部寄存器里。...译指 指令寄存器中的指令经过译码,决定该指令应进行何种操作(就是指令里的操作码)、操作数在哪里(操作数的地址)。 执行指令 分两个阶段“取操作数”和“进行运算”。

    1.9K52
    领券