为什么这个集会是分段的?

时间:2014-11-28 20:48:27

标签: x86 x86-64

我有两套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)的方式进行分段,但我不明白为什么会这样。任何人都可以解释为什么会这样吗?

感谢。

1 个答案:

答案 0 :(得分:0)

事实证明,由于32位和64位指令的组合,calloc的参数是错误的,所以它试图分配太多空间,从而返回0。