程序加载后堆栈情况: 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 //退出子函数
|