以下の乗算を行なうmipsのコードをqtspimで実行しようとしたところ、
Exception occurred at PC=0x00000000
Bad address in text read: 0x00000000
Attempt to execute non-instruction at 0x80000180
といったエラーメッセージが続き、実行できません。
どういったことが原因として考えられるでしょうか?

    .data
    str:
    .asciiz "\nEnter two positive integer a,b "
    .text
    .globl main
main:
    addi $sp,$sp,-16 #スタック上で4語分のスペースを取る
    sw $s0,12($sp) #$s0を退避する
    sw $s1,8($sp) #$s1を退避する
    sw $s2,4($sp) #$s2を退避する
    sw $ra,0($sp) #$raを退避する
    add $s0,$zero,$zero #$s0 = 0
L1:
    li $v0,4 #print_stringのシステムコールコード4を$v0にロード
    la $a0,str #asciizで保存した文字列のアドレスを$a0に格納
    syscall #実行

    li $v0,5 #read_intのシステムコード5を$s1にロード
    syscall #実行
    add $a1,$zero,$v0
    add $s1,$zero,$v0

    li $v0,5 #read_intのシステムコード5を$s2にロード
    syscall #実行
    add $a2,$zero,$v0
    add $s2,$zero,$v0

    jal multp #multへジャンプする
    j L1 #L1へジャンプする
End:
multp:
    bne $t0,$zero,end2 #$t0 ≠ 0 ならラベルendに行く
    add $s0,$s0,$s2 #r = r + y
    addi $t1,$zero,1 #$t1 = 1
    beq $s1,$t1,end1 #$s1 = 1ならラベルend1に行く
end1:
    lw $ra,0($sp) #$raを戻す
    lw $s2,4($sp) #$s2を戻す
    lw $s1,8($sp) #$s1を戻す
    lw $s0,12($sp) #$s0を戻す
    add $v0,$s0,$zero #$v0 = $s0
end2:
    jal half #halfへジャンプ
    add $s2,$s2,$s2 #$s2 = $s2 + $s2
    lw $ra,0($sp) #$raを戻す
    lw $s2,4($sp) #$s2を戻す
    lw $s1,8($sp) #$s1を戻す
    lw $s0,12($sp) #$s0を戻す
    j $ra
odd:
    andi $t0,$s0,0x1 #$t0 = $s0 & 0x1
    jr $ra
half:
srl $s1,$s1,1 #$s1を右に1シフト
    jr $ra