进入时
push %ebpmov %esp,%ebp
退出时
leaveret
然后我在_start上尝试了gdb,得到了以下内容
xor %ebp,%ebppop %esimov %esp,%ecxand xfffffff0,%esppush %eaxpush %esppush %edxpush x80484d0push x8048470push %ecxpush %esipush x8048414call 0x8048328 <__libc_start_main@plt>hltnopnopnopnop
我无法理解这些线条以及这背后的逻辑.
有人可以提供任何指导来帮助解释_start的代码吗?
解决方法 以下是您发布的代码 assembly source的评论.总结一下,它做了以下事情:
>建立一个ebp = 0的哨兵堆栈帧,这样走遍堆栈的代码就可以轻松找到它的结尾
>将命令行参数的数量d出到esi中,这样我们就可以将它们传递给__libc_start_main
>将堆栈指针与16位的倍数对齐,以符合ABI.在某些版本的linux中不能保证这种情况,因此必须手动完成以防万一.
> __libc_csu_fini,__ libc_csu_init的地址,参数向量,参数个数和main的地址被作为参数推送到__libc_start_main
> __libc_start_main被调用.此函数(源代码here)设置一些glibc内部变量,最终调用main.它永远不会回来.>如果由于任何原因__libc_start_main应该返回,则会在之后放置一条hlt指令.用户代码中不允许使用此指令,并且应该导致程序崩溃(希望如此).>最后一系列nop指令是汇编程序插入的填充,因此下一个函数以16字节的倍数开始,以获得更好的性能.在正常执行中永远不会达到它.
以上是内存溢出为你收集整理的linux – 了解C程序中的汇编语言_start标签全部内容,希望文章能够帮你解决linux – 了解C程序中的汇编语言_start标签所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)