实模式函数调用

函数调用使用call指令,同时需要存入返回地址;当函数返回的时候需要使用ret指令族,使用ret还是retf根据call指令是近调用(只改变IP寄存器的值)还是原调用(同时改变CS和IP寄存器的值)来判断,ret使得sp指针+2,将2字节内容放入到IP寄存器中;retf使得sp指针+4,将4字节内容分别放入CS和IP寄存器中。

call指令先从右到左压入实参,在压入返回地址,然后备份ebp,将esp赋值给ebp,因此ebp可以用来栈中寻址,然后根据函数的信息在栈中开辟相应的空间。
退出的时候需要将ebp重新复制给esp来跳过局部变量的空间,然后pop ebp,再ret返回即可

call调用:相对代表增量,直接代表立即数,间接代表寄存器/内存
1.相对近调用,call 偏移量
2.间接绝对近调用,call 寄存器地址/内存寻址(2字节)
3.直接绝对原调用,call far 段基址(立即数):段内偏移地址(立即数)
4.间接绝对远调用,call far 内存寻址(4字节)

jmp调用不返回
1.相对短转移 操作数为-128~127
2.相对近转移 操作数为-32768~32767
3.间接绝对近转移
4.直接绝对远转移 jmp立即数形式的段基址:立即数形式的段内偏移地址
5.间接绝对远转移

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,665评论 1 19
  • 计算机通过执行指令序列来使机器得以工作,所以对于每一系列的计算机都有指定的一组指令集供计算机使用,这组指令...
    未来科技工作室阅读 8,077评论 1 10
  • 首先寄存器使用惯例:eip :指令地址寄存器,保存程序计数器的值,当前执行的指令的下一条指令的地址值,16位中为i...
    扎Zn了老Fe阅读 1,999评论 0 0
  • 计算机系统漫游 代码从文本到可执行文件的过程(c语言示例):预处理阶段,处理 #inlcude , #defin...
    willdimagine阅读 3,618评论 0 5
  • 已经断去多久不再联络 ,不联络并不代表我已经将你忘记。等夜色的光蕴温在黑夜里,落叶被风的无情弥散在城市的喧嚣中...
    星星不会说话阅读 197评论 0 0