我有两套x64程序集,其中一组是segfaults,另一组运行得很好。
这个没有问题,返回0:
.global main
main:
SUBQ $56, %rsp
PUSH %rax
MOVQ $0, %rax
MOVQ $3, %r10
CMPL %eax, %r10d
POP %rax
JGE .L3
MOVQ $11, %rdi
CALL raise
MOVQ %rax, 40(%rsp)
.L3:
MOVL $3, 32(%rsp)
ADDL $1, 32(%rsp)
MOVQ 32(%rsp), %rdi
MOVQ $8, %rsi
CALL calloc
MOVQ %rax, 40(%rsp)
MOVQ 40(%rsp), %r10
MOVL $3, (%r10)
MOVQ 40(%rsp), %r10
MOVQ %r10, 24(%rsp)
MOVQ $0, %rax
ADDQ $56, %rsp
RET
然而,这个是段错误(信号11):
.global main
main:
SUBQ $72, %rsp
PUSH %rax
MOVQ $0, %rax
MOVQ $3, %r10
CMPL %eax, %r10d
POP %rax
JGE .L3
MOVQ $11, %rdi
CALL raise
MOVQ %rax, 40(%rsp)
.L3:
MOVL $3, 32(%rsp)
ADDL $1, 32(%rsp)
MOVQ 32(%rsp), %rdi
MOVQ $8, %rsi
CALL calloc
MOVQ %rax, 40(%rsp)
MOVQ 40(%rsp), %r10
MOVL $3, (%r10)
MOVQ 40(%rsp), %r10
MOVQ %r10, 24(%rsp)
MOVL $200, 48(%rsp)
MOVQ $0, %rax
ADDQ $72, %rsp
RET
如您所见,唯一的区别是行MOVL $ 200,48(%rsp)以及开头和结尾的堆栈指针的加/减。我不得不假设它以48(%rsp)的方式进行分段,但我不明白为什么会这样。任何人都可以解释为什么会这样吗?
感谢。
答案 0 :(得分:0)
事实证明,由于32位和64位指令的组合,calloc的参数是错误的,所以它试图分配太多空间,从而返回0。