我们先来看看上面这段代码的汇编语句:
//*******************************************start*********************************************//
.file "push.c"
.text
.globl print
.type print, @function
print:
pushl %ebp
movl %esp, %ebp
popl %ebp
ret
.size print, .-print
.section .rodata
.LC0:
.string "fdsafdsafdsafdsafdsafdsafdsa"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $64, %esp
movl %gs:20, %eax
movl %eax, 60(%esp)
xorl %eax, %eax
movl $0, 44(%esp)
movl $0, 40(%esp)
movl $.LC0, 36(%esp)
movb $102, 51(%esp)
movl $32, 8(%esp)
movl $43, 12(%esp)
movl $3, 16(%esp)
movl $567, 20(%esp)
movl $987, 24(%esp)
movl $21, 28(%esp)
movl $56, 32(%esp)
call print
movl $0, %eax
movl 60(%esp), %edx
xorl %gs:20, %edx
je .L3
call __stack_chk_fail
.L3:
leave
ret
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
.section .note.GNU-stack,"",@progbits
//*******************************************end*********************************************//
看看上面的汇编代码,我们的重点放在红色字体部分,在函数的开头部分都有这么两行代码:
pushl %ebp --------------------------->保存上一个函数的栈底
movl %esp, %ebp --------------------------->用来保存当前堆栈指针的值
ebp存放当前函数栈低的地址,就是说ebp可以看做一个指针,指向栈顶,而其实栈顶存放的数据就是上一个函数的ebp的值,即就是main函数的栈底。
明白了上面的内容,那么我们就可以实现题目的要求了。代码如下所示: |