x64: Por que esse código me fornece "Erro de limite de endereço"

Por que o seguinte assembly x64 me fornece "Erro de limite de endereço"? Isso só acontece quando adiciono código depoiscall _print_string. Suponho que parte do registro tenha sido modificada, mas eles não devem ser revertidos quando o_print_string função retorna?

Estou usando o Mac OS X

obj_size = 8

.data
    hello_world: .asciz "hello world!"

.text
    .globl _main


_main:

    pushq %rbp
    movq %rsp, %rbp
    leaq hello_world(%rip), %rdi
    callq _print_string

    subq obj_size, %rsp
    movq 1, %rax
    movq %rax, obj_size(%rsp)

    addq obj_size, %rsp


    leave
    ret

E o programa C é:

void
print_string(char *str) 
{
    printf("%s\n", str);
}

questionAnswers(1)

yourAnswerToTheQuestion