分享

汇编使用堆栈传参是子程序获取参数的写法

 zhouADNjj 2014-04-29

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多