
























我们在使用高级语言编程的时候都用过函数(有些语言叫“方法”),函数能够帮助我们将程序分块,实现结构化,从而让代码更为清晰可懂。而在汇编语言中,由于我们是直接对硬件编程,CPU提供了一套指令帮助我们快速实现程序的结构化。
首先,我们要回想一下函数中有哪些要素:参数、执行代码和返回值(可看我写的C++函数教程)。高级语言中的数据存在变量中,但是我们使用的汇编并没有这一抽象出来的概念。我们可以使用寄存器或内存单元来存放参数及返回值,至于程序编写,在程序的主体实现部分,我们已经有了相当多的经验。而在调用函数时,应使用CPU提供的call和ret/retf指令。
我们先看这两条指令的执行过程。
call 标号 指令执行时,步骤如下:
将IP压栈
转移到标号处(原理同jmp near ptr)
call far ptr 标号指令:
将CS:IP压栈
转移到标号处(原理同jmp far ptr)
call 16位寄存器 指令:
将IP压栈
转移到指定的地址(原理同jmp 16位寄存器)
call word ptr 指令:
将IP入栈
jmp word ptr 内存单元
call dword ptr 指令:
将CS:IP入栈
jmp dword ptr 内存单元
ret指令:将IP出栈(从而实现近转移)
retf指令:将CS:IP出栈(从而实现段间转移)
可以看出,call和ret/retf配合使用,即可完成函数的调用与返回。
在执行函数代码时,我们不希望丢失主程序的数据,因此,在使用主程序占用的寄存器之前,应将其先入栈。由此,我们得到了函数的代码过程:
主程序数据入栈
函数实现过程
主程序数据出栈
返回主程序(ret/retf)
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。