2014-11-28 1 views
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 있다고 추측해야만하지만, 왜 그런지는 알 수 없다. 왜 이런 일이 일어 났는지 설명 할 수 있습니까?

감사합니다.

답변

0

32 비트 및 64 비트 명령어 조합으로 인해 calloc에 ​​대한 인수가 잘못되어 너무 많은 공간을 할당하려고 시도 했으므로 0을 반환했습니다.