我有两组x64程序集,一组是分段故障,另一组是运行良好的程序集。
这个程序运行时没有问题,返回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)上有段错误,但我不明白为什么会这样。有人能解释一下为什么会发生这种事吗?
谢谢。
发布于 2014-11-28 23:17:30
原来calloc的参数是错误的,因为32位和64位指令的组合,所以它试图分配太多的空间,从而返回0。
https://stackoverflow.com/questions/27195700
复制相似问题