0
두 세트의 x64 어셈블리가 있으며, 그 중 하나는 segfaults이고, 다른 하나는 정상적으로 실행됩니다.왜이 어셈블리는 segfaulting입니까?
이 사람은 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
이 하나, 그러나 세그먼테이션 폴트 (segfault) (신호 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)에 segfaulting 있다고 추측해야만하지만, 왜 그런지는 알 수 없다. 왜 이런 일이 일어 났는지 설명 할 수 있습니까?
감사합니다.