2.2 C和Pascal调用规范
有了前面栈帧的基本概念,再来讨论x86的函数调用规范就很好理解了,基本上有两种调用规范:C和Pascal调用规范。二者的栈帧概念是一样的,区别在于参数入栈的次序和函数调用时栈指针的调整方式,下面分别作下比较。
(1) Pascal调用规范
函数参数从左到右依次入栈
假设调用函数func(A,B,C),那么caller中汇编代码如下:
函数返回时,栈指针的调整由callee来实现。解释如下:
比如前面caller调用已经push 3个参数入栈,函数调用完了,实际这3个参数就没有用了,就需要把栈指针(即esp的值)加上12(假设每个参数占4字节),这里的意思就是这个加12的操作由callee来实现。 具体的实现是采用汇编指令ret x,即ret后面带一个数值,这里就应该是12。这样不仅能函数返回,还能调整栈指针。
注:如果不进行栈指针调整,显然经过多次函数调用后就会产生栈溢出,肯定就会触发系统异常。
(2) C调用规范…
最新评论