我是一名学生在学校学习集会。 我正在浏览书中的一些问题,我看到一个问题,为什么以下代码会崩溃?
/*
gcc -o crashCity.exe crashCity.s
*/
.text
.global _main
_main:
nop
pushl %ebp
movl %esp, %ebp
addl $4, %ebp
movl $0, %eax
movl %ebp, %esp
popl %ebp
ret
我知道导致程序崩溃的行是addl $4, %ebp
,因为它将基本指针设置为堆栈的四个字节,并且因为我们将堆栈指针设置为基指针,所以它也将使堆栈指针向上移动4个字节。但是我仍然不明白为什么会导致程序崩溃?
起初我认为这是因为返回语句,因为ret
将获取堆栈指针指向的值,并将其移动到指令指针。但是在我删除add $4, %ebp
行之后,我删除了ret
声明,一切正常(意味着ret
甚至不是必需的。
是什么导致程序崩溃?
我正在使用MINGW 32位Windows GAS编译器。
任何帮助表示赞赏
谢谢!