Pointers 为什么下面的汇编代码会崩溃?
我是学校里的一个comp-sci学生学习大会。 我浏览了书中的一些问题,我看到一个问题,问为什么下面的代码会崩溃Pointers 为什么下面的汇编代码会崩溃?,pointers,assembly,crash,Pointers,Assembly,Crash,我是学校里的一个comp-sci学生学习大会。 我浏览了书中的一些问题,我看到一个问题,问为什么下面的代码会崩溃 /* 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
/*
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
,因为它将基本指针设置为堆栈上的四个字节,并且由于我们将堆栈指针设置为基本指针,它也将使堆栈指针向堆栈上的四个字节。但是我仍然不明白为什么这会使程序崩溃?
起初我认为这是因为返回语句,因为ret
将获取堆栈指针指向的任何值,并将其移动到指令指针。但是在我删除了add$4,%ebp
行之后,我删除了ret
station,一切都很好(这意味着ret
甚至不是必需的)。
那么是什么导致程序崩溃呢?
我正在使用MINGW 32位windows GAS编译器。
谢谢你的帮助
谢谢!!不同的汇编语言有不同的约定+语法。最好指定您的解释正确的语言。至于如果您删除
ret
,为什么它不会崩溃……您真幸运。