转移指令jmp和跳转指令call

原创 2015年07月07日 00:17:10

【-1】写在前面

以下内容文字描述来自于 王爽老师的《汇编语言》教材,建议大家都买一本,哈哈。不是我打广告,确实人家写的好,应该支持。我只是附上了自己的图片和理解而已。

【0】先上干货

只修改ip,称为段内转移,如jmp ax
修改cs和ip,称为段间转移,如 jmp 1000:0

【1】分类

转移指令分为:
无条件转移,如jmp
条件转移
循环指令, loop
过程
中断

【2】我们的jmp

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

对ip的修改范围在-128~127;

[attention] : cpu在执行jmp指令时,并不需要转移的目的地址, 而是包含转移的位移;
这里写图片描述

2.2) jmp near ptr 标号

它实现的是段内近转移, 只不过对ip的修改范围在 -32768~32767;
这里写图片描述

2.3)jmp far ptr 标号

它实现的是段间转移,又称远转移; far ptr 指明了指令用标号的段地址和偏移地址修改cs和ip;
这里写图片描述

2.4)转移地址在内存中

  • 2.4.1)jmp word ptr 内存单元地址(段内转移)
    function:从内存单元地址处开始存放一个字,是转移的目的偏移地址;
    如,

    mov ax,0123h
    mov [bx], ax
    jmp word ptr [bx]
    执行后, (ip) = 0123h
    

    这里写图片描述

  • 2.4.2)jmp dword ptr 内存单元地址(段间转移)
    功能:内存中存放两个字,高地址处的字存放转移的目的段地址;低地址处存放目的偏移地址;
    (cs) = 内存单元地址 + 2
    (ip) = 内存单元地址
    如:

    mov ax,0123h
    mov ds:[0], ax
    mov word ptr ds:[2],0
    jmp dword ptr ds:[0]
    执行后, (cs) = 0; (ip) = 0123h 。
    

    这里写图片描述
    [Complementary]
    MOV AX, WORD PTR [BX] ; 要有逗号
    将DS:BX指向的内存地址中的16位数读到AX里面。
    MOV是数值传送指令,AX是目的操作数,WORD PTR表示后面的储存单元是字类型,[BX]表示用BX的值来寻址,默认段地址是DS的值。

【3】我们的call

3.0)谈谈ret和retf

  • 3.0.1)执行ret 相当于执行:

    (ip) = (ss) * 16+ (sp);
    (sp) = (sp) + 2;
    
  • 3.0.2)执行retf, 相当于执行:

    (ip) = (ss) * 16+ (sp) ;
    (sp) = (sp) + 2 ;
    cs = ss * 16 + sp ;
    sp = sp + 2 ;
    
  • 3.0.3)执行ret,相当于执行 pop IP

    这里写图片描述

  • 3.0.4)执行retf,相当于执行 pop IP; pop CS
    这里写图片描述
    (所以retf 返回的时候要先将cs压栈)

3.1)依据位移进行转移的call 指令

相当于——将当前的IP或CS和IP压入栈,然后转移;
call指令除了不能实现短转移之外,其他和jmp相同;

  • 3.1.1)cpu执行call时,相当于进行:

    push ip
    jmp near ptr 标号
    
  • 3.1.2)also, 相当于:

    sp = sp - 2
    ss *16 +sp = ip
    ip = ip + 16位位移
    

    这里写图片描述
    这里写图片描述

3.2)转移的目的地址在指令中的call指令

call far ptr 标号实现的是段间转移;
  • 3.2.1)cpu 执行call far ptr 标号时,相当于进行

    push cs
    push ip
    jmp far ptr 标号
    
  • 3.2.2)also 相当于

    sp = sp - 2
    ss * 16 + sp = cs
    sp = sp - 2
    ss * 16 + sp = ip
    cs = 段基地址
    ip = 偏移地址
    

    这里写图片描述

3.3)转移地址在register中的call指令

指令格式:call 16为reg
功能:

sp = sp -2
ss * 16 + sp = ip
ip = 16位reg

also 相当于
push ip
jmp 16位reg

这里写图片描述

3.4)转移地址在内存中的call指令

  • 3.4.1)call word ptr 内存单元地址
    相当于

    push ip
    jmp word ptr 内存单元地址
    
  • 3.4.2)call dword ptr 内存单元地址
    相当于:

    push cs
    push ip
    jmp dword ptr 内存单元地址
    

    这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

JMP - 跳转

JMP - 跳转 操作码 指令 说明 EB cb JMP rel8 相对短跳转,位移量相对于下一条指...
  • linuxheik
  • linuxheik
  • 2012年06月12日 09:36
  • 1427

JMP段的跳转short、near、far

无条件转移指令jmp: 这种跳转指令有三种方式:短(short),近(near)和远(far)。短是指要跳至的目标地址与当前地址前后相差不超过128字节。近是指跳转的目标地址与当前地址在用一个段...
  • u011686226
  • u011686226
  • 2015年01月14日 20:49
  • 1187

几种跳转指令和对应的机器码

几种跳转指令和对应的机器码 0xE8    CALL    后面的四个字节是地址 0xE9    JMP    后面的四个字节是偏移 0xEB    JMP    后面的二个字节是偏...
  • wzsy
  • wzsy
  • 2013年12月06日 11:12
  • 5337

汇编语言 call和ret指令 的具体执行

call和ret指令 call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。 它们经常被共同用来实现子程序的设计。   ret和retf ret指令用栈中的数据,修改IP的...
  • DRLVROS
  • DRLVROS
  • 2016年03月02日 11:02
  • 4452

转移地址在内存中的JMP指令

jmp word ptr 内存单元地址(段内转移) 功能 :从内存单元地址处开始存放着一个字(16位),是转移的目的偏移地址(IP)。 内存单元地址可以用寻址方式的任意给出。 ;2016...
  • u012997311
  • u012997311
  • 2016年12月05日 16:57
  • 546

call指令用法

CPU执行call指令时,进行两步操作: 1、将当前的IP或CS和IP压入栈中; 2、转移; call指令不能实现短转移。与jmp指令实现转移的原理相同。     1、依据位移进行转移的c...
  • brk1985
  • brk1985
  • 2014年06月12日 14:33
  • 978

正确区分LJMP、AJMP、SJMP、JMP跳转指令

正确区分LJMP、AJMP、SJMP、JMP指令 MCS-51的控制转移类指令,共17条,分为无条件转移指令、条件转移指令、子程序调用和返回指令、空操作指令等四类。 无条件转移指令...
  • zhu2695
  • zhu2695
  • 2013年11月18日 23:07
  • 7757

汇编JMP寻址时short,near,far区别

jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。 jmp指令要给出两种信息: (1)转移的目的地址 (2)转移的距离(段间转移、段内转移、段内近转移) 不同的给出目的地址的方法,和不...
  • IT_faquir
  • IT_faquir
  • 2014年12月02日 16:36
  • 3222

jmp near ptr 标号

指令“jmp near ptr 标号“的功能为 (IP)=(IP)+16位位移(段内近转移) -32769  32767 上一篇的 jmp short 标号 (段内短转移) (IP)=(IP)+8...
  • u012997311
  • u012997311
  • 2016年12月04日 22:01
  • 282

跳转指令的学习

CMP 该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结构并不保存到第一个操作数中。只是根据相减的结果来改变零标志位的,当两个操作数相等的时候,零标志位置1。 零标志位z JZ指令...
  • gacmy
  • gacmy
  • 2016年04月09日 18:05
  • 386
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:转移指令jmp和跳转指令call
举报原因:
原因补充:

(最多只允许输入30个字)