アセンブリでプログラムが終了してしまう の質問を投稿したものです
アセンブリでbmi(Body Mass Index) を計算するプログラムを練習のために書いているのですが途中でsegmentation faultを出して止まってしまいます。

なぜなのでしょうか?

OS: ubuntu16.04 x86_64
gcc -m32をつけて32bitとしてコンパイル


.data
emessage: .string "file open error\n"
your_height: .string "Please enter the your height  (m):  "
your_weight: .string "Please enter the your weight  (kg):  " 
newline: .string "\n"

.bss
tmp: .skip 128, 0x00

.text
.global main
main:
    push %ebp
    movl %esp, %ebp
    pushl $your_height
    call print
    call read
    pushl $your_weight
    call print
    call read
    movl %esp, %eax
    movl 20(%esp), %ebx
    divl %ebx
    divl %ebx
    pushl %eax
    call print
    call exit


read:
    movl $3, %eax
    movl $0, %ebx
    movl $tmp, %ecx
    movl $64, %edx
    int $0x80
    cmpl $-1, %eax
    je write_error_message
    movl $tmp, %esi
    pushl %esi
    ret

write_error_message:
    movl $4, %eax
    movl $1, %ebx
    movl $emessage, %ecx
    movl $16, %edx
    int $0x80
    call exit

exit:
    movl $1, %eax;
    xorl %ebx, %ebx;
    int $0x80

print:
    movl $4, %eax
    movl 4(%esp), %ecx
    movl $1, %ebx
    movl $1, %edx
write:
    cmpb $0x00, (%ecx)
    je ret_func
    movl $4, %eax
    int $0x80
    incl %ecx
    jmp write


ret_func:
    ret