转载自:http://blog.youkuaiyun.com/lazyclough/article/details/5346308
程序加载后堆栈情况: ss为堆栈的首地址, sp为堆栈的长度,当sp=0时堆栈满;入栈时向低地址伸展(sp先减2再写值),出栈时向高地址伸展。
使用bp寄存器
bp为基址寄存器,一般在函数中用来保存进入函数时的sp的栈顶基址
sp是栈顶指针,它每次指向栈顶。
每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复sp和bp的值。像下面这样:
在函数进入时:
push bp //保存bp指针
mov bp,sp //将sp指针传给bp,此时bp指向sp的基地址。这个时候,如果该函数有参数,则[bp]是原先bp的值,[bp+2]是调用前下一条指令地址(ip的值),[bp+4]则是该子函数的第一个参数,[bp+6]则是该子函数的第二个参数,以此类推,有多少个参数则[bp+4+2^n]。以上是近调用的情况,如果是远调用(调用时cs先入栈,ip后入栈),则[bp+2]是ip的值,[bp+4]是cs的值,[bp+6]是第一个参数的值,依此类推。(注意,调用时应当是最后一个参数先压栈)
.....
.....
函数结束时:
mov sp,bp //将原sp指针传回给sp
pop bp //恢复原bp的值。
ret //退出子函数