• 转移指令jmp和跳转指令call


    【-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 内存单元地址
      

      这里写图片描述

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

  • 相关阅读:
    006_linux驱动之_ioremap函数使用
    004_linux驱动之_class_create创建一个设备类
    003_linux驱动之_file_operations函数
    002_linux驱动之_register_chrdev注册字符设备
    001_linux驱动之_驱动的加载和卸载
    007_linuxC++之_构造函数的初级应用
    006_linuxC++之_引用
    005_linuxC++之_指针的引入
    004_linuxC++之_函数的重载
    003_linuxC++之_namespace使用
  • 原文地址:https://www.cnblogs.com/pacoson/p/4893176.html
Copyright © 2020-2023  润新知