我正在研究 c 到 x86 编译器,实际上我正在生成一些代码行,但是当我尝试启动它时我遇到了分段错误,我无法找出错误的根源。这是代码:
.file "test.c"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $32, %esp
movl $2, %eax
movl %eax, -4(%ebp)
movl $3, %eax
movl %eax, -8(%ebp)
movl -4(%ebp), %eax
popl %ecx
addl %ecx, %eax
pushl %eax
movl -8(%ebp), %eax
movl %eax, -12(%ebp)
段错误似乎出现在第一条指令"pushl %ebp"中
好吧,假设您告诉我们的内容是正确的,那么对于可能出错的原因,大致有两种解释:
忽略完全"在那里"的解释,例如"您的 CPU 坏了",push
指令上的段错误可能由于两个原因而发生:
- 堆栈设置不正确,因此指令试图将数据推送到只读或未映射的地址,或者
- 包含指令本身的内存页未标记为可执行文件。
从给出的信息来看,不可能说出这两者中的哪一个导致了问题。你必须确定这一点。(或者给我们一些更多信息,例如,关于代码是如何执行的)