• 用call和ret实现子程序


    ret和call是另外两种转移指令,它们与jmp的主要区别是,它们还包含入栈和出栈的操作。具体的原理如下:
    ret操作相当于:pop ip(直接将栈顶元素赋值给ip寄存器)

    call s的操作相当于:push ip
    jmp s(先将ip的值压栈,再跳转)

    retf的操作相当于:pop ip
    pop cs

    call dword ptr s相当于:push cs
    push ip
    这两组指令为我们编写含子函数的程序提供了便利,一般的格式如下:
    main:
    ………
    call s
    …….. a
    s: ……..
    call s1
    ………. b
    ret
    s1: ……….
    call s2
    ……… c
    ret
    s2: ……… d
    call s3
    ret
    s3: ……..
    ret
    分析以上的程序,假设call的下一条指令的偏移地址分别为:a、b、c、d
    随着程序的执行,ip指向call指令,CPU将这条指令放入指令缓冲器,执行上一条指令,然后ip指向下一条指令,ip = a。执行call指令,根据call的原理先执行a入栈,此时栈中的情况如下
    这里写图片描述
    然后跳转到s,执行到call指令处时,ip = b,b首先入栈,然后跳转到s1
    这里写图片描述
    执行到s1处的call指令时,ip = c,c入栈,然后跳转到s2
    这里写图片描述
    执行到s2处的call指令时,ip = d,d入栈,然后跳转到s3
    这里写图片描述
    执行到s3处的ret指令时,栈顶元素出栈,ip = d,程序返回到s2中,到ret时,ip = c,程序返回到s1,再次执行ret,ip = b,程序返回到s,执行ret,ip = a,程序返回到main中,接下来正常执行main中的代码,知道整个程序结束。

  • 相关阅读:
    C# 多线程 异步加载 窗体
    C# 多线程 异步加载 窗体
    C#中的Debug类
    C#中的Debug类
    C# DataGridView:为行头添加行号
    C# DataGridView:为行头添加行号
    向SqlParameter内动态添加参数
    向SqlParameter内动态添加参数
    C# params关键字
    C# params关键字
  • 原文地址:https://www.cnblogs.com/lanuage/p/7725722.html
Copyright © 2020-2023  润新知