• Call指令和Ret指令讲解01 零基础入门学习汇编语言48


    第十章:Call指令和Ret指令讲解01

     

    让编程改变世界

    Change the world by program


     

    引言

      想想程序之间的加载返回过程。 call和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP。 它们经常被共同用来实现自程序的设计。 这一章,我们讲解call和ret 指令的原理。  

    ret指令和retf指令

     

    ret指令用栈中的数据,修改IP的内容,从而实现近转移

    CPU执行ret指令时,进行下面两步操作:

    (IP)=((ss)*16+(sp))

    (sp)=(sp)+2

     

    retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移

    CPU执行retf指令时,进行下面两步操作:

    (IP)=((ss)*16+(sp))

    (sp)=(sp)+2

    (CS)=((ss)*16+(sp))

    (sp)=(sp)+2

     

    可以看出,如果我们用汇编语法来解释ret和retf指令,则:

    CPU执行ret指令时,相当于进行:

    pop IP

    CPU执行retf指令时,相当于进行:

    pop IP

    pop CS

     

    分析源码

     

    ret指令(源代码下载

    程序中ret指令执行后,(IP)=0,CS:IP指向代码段的第一条指令。  

    retf指令(源代码下载

    程序中retf指令执行后,CS:IP指向代码段的第一条指令。  

    检测点10.1

     

    call指令

     

    call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作:

    将当前的 IP 或 CS和IP 压入栈中

    转移(jmp)

      call 指令不能实现短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同。 下面的几个小节中 ,我们以给出转移目的地址的不同方法为主线,讲解call指令的主要应用格式。  

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

      call 标号(将当前的 IP 压栈后,转到标号处执行指令) CPU执行此种格式的call指令时,进行如下的操作:

    (1) (sp) = (sp) – 2

    ((ss)*16+(sp)) = (IP)

    (2) (IP) = (IP) + 16位位移

     

    call  标号

      16位位移=“标号”处的地址-call指令后的第一个字节的地址 16位位移的范围为 -32768~32767,用补码表示 16位位移由编译程序在编译时算出。  

    演示:

    [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2011/01/10_依据位移进行转移的call指令.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] Get Adobe Flash player [/kml_flashembed] 从上面的描述中,可以看出,如果我们用汇编语法来解释此种格式的call指令。  

    CPU 执行指令“call 标号”时,相当于进行:

    push IP

    jmp near ptr 标号

     

    检测点10.2

    [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LZOCVNFQQEFE']视频下载[/Downlink]
  • 相关阅读:
    [Knowledge-based AI] {ud409} Lesson 8: 08
    [Knowledge-based AI] {ud409} Lesson 7: 07
    [Knowledge-based AI] {ud409} Lesson 6: 06
    [Knowledge-based AI] {ud409} Lesson 5: 05
    [Knowledge-based AI] {ud409} Lesson 4: 04
    [Knowledge-based AI] {ud409} Lesson 3: 03
    [Knowledge-based AI] {ud409} Lesson 2: 02
    [Knowledge-based AI] {ud409} Lesson 1: 01
    [Software Development Process] {ud805} excerpt
    [Machine Learning for Trading] {ud501} Lesson 25: 03-05 Reinforcement learning | Lesson 26: 03-06 Q-Learning | Lesson 27: 03-07 Dyna
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846035.html
Copyright © 2020-2023  润新知