MIPS — Загрузить целое число в массив — адрес хранилища не выровнен по границе слова

#arrays #assembly #mips #mips32 #mars-simulator

#массивы #сборка #mips #mips32 #mars-симулятор

Вопрос:

     .data

p1: .asciiz "nEnter the data for a sorted array: "
p2: .asciiz "nEnter a value to search for:  "
p3: .asciiz " is not found"
p4: .asciiz " is found at "
array:  .space 404

    .text

main:
    la  $t0, array  # a1 = addr of first int

#Store Array Values
store:
li  $v0, 4      # system call code for print_str
la  $a0, p1     # address of string to print
syscall         # print the first prompt
li  $v0, 5      # system call for read_int
syscall         # read int to store
move    $t1, $v0    # store int
beq $t1, 0, bsearch # once sentinel val hit, go to search
sub $t9, $t0, 4 # set index to the first bit of the last number
j   storeVal    # store s0 in array

storeVal:
    sw  $t1, array($t0) # store value in array
    addi    $t0, $t0, 4 # inc index
    j   store       # continue to add integers

#Binary Search
bsearch:

    li  $v0, 4      # system call code for print_str
    la  $a0, p2     # address of string to print
    syscall         # print the second prompt
    li  $v0, 5      # system call for read_int
    syscall         # read int to find
    move    $a0, $v0    # store int to find
    beq $a0, 0, end # once sentinel val hit, go to end prog
    la  $a2, array  # a1 = addr of first int
    la  $a2, ($t9)  # a2 = addr of last int
    subu    $sp, $sp, 4 # 4 bytes 4 stack
    sw  $ra, 4($sp) # save return addr

    subu    $t0, $t9, $s0   # size of array
    bnez    $t0, searchVal  # if not 0, search

    move    $v0, $a1    # addr of only entry
    lw  $t0, ($v0)  # load entry
    beq $a0, $t0, found # if = to int, print found
    j   notFound    # not found

searchVal:

    sra $t0, $t0, 3 # comp offset of middle m:
    sll $t0, $t0, 2 # t0 = 4(t1/8)
    addu    $v0, $a1, $t0   # middle m
    lw  $t0, ($v0)  # t0 = m
    beq $a0, $t0, found # if = to int, print found
    blt $a0, $t0, left  # search left
    j   right       # search right

right:

    addu    $a1, $v0, 4 # search right
    jal bsearch
    beq $a0, $t0, found # if = to int, print found
    j   notFound    # not found

left:

    move    $a2, $v0    # search left of m
    jal     bsearch
    beq $a0, $t0, found # if = to int, print found
    j   notFound    # not found

#Print
found:

    li  $v0, 1      # system call code for print_int
    move    $a0, $s2    # integer to print (counter
    syscall         # print it

    li  $v0, 4      # system call code for print_str
    la  $a0, p4     # address of string to print
    syscall         # print the answer part 2

    j   bsearch     # continue to search for more integers

notFound:

    li  $v0, 1      # system call code for print_int
    move    $a0, $s2    # integer to print (counter)
    syscall         # print it

    li  $v0, 4      # system call code for print_str
    la  $a0, p3     # address of string to print
    syscall         # print the answer part 2

    j   bsearch     # continue to search for more integers

#END PROG
end:
    li $v0, 10
    syscall
  

При попытке загрузить слова в свой массив я продолжаю получать сообщение об ошибке «Ошибка в строке 58 / .. / Proj.asm: исключение во время выполнения в 0x00400040: адрес хранилища не выровнен по границе слова 0x200200c2.

 57) storeVal:
    58) sw  $t1, array($t0) # store value in array
    59) addi    $t0, $t0, 4 # inc index
    60) j   store       # continue to add integers 
  

Строка 58 — это sw $ t1, массив ($ t0). Я попытался установить t0 (строка сразу после .main) показанным способом и установить его равным нулю с помощью

 addi $t1, $zero, 0
  

ни один из вариантов не позволит мне поместить элемент в массив, и я не могу найти руководство или туториал, которые спасли бы мне жизнь… Также, пока мы этим занимаемся, кто-нибудь может посмотреть, близка ли остальная часть кода? Спасибо!

Комментарии:

1. Даже если это спасет вам жизнь, я отказываюсь считать до 58-й строки. Можете ли вы извлечь ту часть кода, где это происходит?

2. Мои навыки публикации очень низки, форматирование — это то, чего я еще не понял. Дайте мне знать, если это выглядит лучше и его легче понять.