какие-либо идеи? Почему я добираюсь: Исключение на этапе выполнения в 0x00400020: выберите адрес, не выровненный на границе слова 0x00000007, проблемная строка: $s1,0 lw ($a1) #copy arg2 = размер массива
.data
.align 4 #added this, didnt work
size: .word 7
.align 4 #added this, didnt work
search: .word 30
.align 4 #added this,didnt work
array: .word 10,20,30,40,50,60,70
.align 4
.text
main:
la $a0,array #$a0 = address of array
lw $a1,size #a1 = size of array
lw $a2,search #$a2 = search key
COUNT:
lw $s0,0($a0) #copy arg1 = address array
addi $s1,$zero,7
lw $s1,0($a1) #copy arg2 = size of array
lw $s2,0($a2) #copy arg3 = search key (n)
addi $s2,$zero,30
COUNTLOOP:
add $v0,$zero,$zero #v0 = res
add $t0,$zero,$zero #$t0 = init i to 0
slt $t1,$t0,$s1 #check if i > size of array
beq $t1,$zero,DONECOUNT #i is n so end
sll $t2,$s0,2 #$t2 = get off set for a[i]
lw $t3,0($t2) #$t3 = get value of a[i]
bne $t3,$s2,CLOOPBTM #check if a[i] == seach key
addi $v0,$v0,1 #if above then increment res
CLOOPBTM:
addi $t0,$t0,1
j COUNTLOOP
DONECOUNT:
Проблема с кодом в том, что вы используете не адрес, где хранится размер, а сам размер:
Здесь вы загружаете адрес в A0 и размер (7) в A1:
la $a0,array
lw $a1,size #a1 = size of array
Здесь вы загружаете первое слово, хранящееся в вашем массиве (которое загрузит 10). Это не то, что вы задумали.
lw $s0,0($a0) #copy arg1 = address array
addi $s1,$zero,7
Здесь вы загружаете первое слово, хранящееся в месте 0x000007. (ваш размер). Этот вероятно, также не предусмотрено и вызовет исключение, потому что адрес не выровнен:
lw $s1,0($a1) #copy arg2 = size of array
и так далее.
Мне кажется, что вы неправильно понимаете, что делает инструкция LW. Она считывает ячейку памяти в регистр. То, что вы хотите в прологе вашего цикла - это сделать копии регистра.
Для этого вы можете использовать псевдоинструкцию move, если ваш ассемблер поддерживает ее. В противном случае используйте инструкцию OR для копирования регистров, как показано здесь:
COUNT:
or $s0, $a0, $a0 #copy arg1 = address array
addi $s1, $zero,7
or $s1, $a1, $a1 #copy arg2 = size of array
or $s2, $a2, $a2 #copy arg3 = search key (n)
addi $s2, $zero,30
COUNTLOOP:
...
Для полного примера цикла линейного поиска попробуйте следующее (не тестировалось и ожидается, что ассемблеру важны слоты задержки)
main:
la $a0,array # $a0 = address of array
lw $a1,size # $a1 = size of array
lw $a2,search # $a2 = search key
beq $a1, $zero, NOTFOUND # handle the size==0 case..
or $v0, $zero, $zero # init counter to zero
LOOP:
lw $s0, 0($a0) # load element
beq $s0, $a2, FOUND # branch if key found:
addiu $a0, $a0, 4 # increment array pointer
addiu $v0, $v0, 1 # increment loop counter
bne $v0, $a1, LOOP # repeat until we've processed the array.
NOTFOUND:
# --------------------------------------
# if you reach this, key does not exist:
# --------------------------------------
li $v0, -1 # load a -1 to signal key not found.
jr $lr # return to caller
FOUND:
# -----------------------------------------
# v0 now contains the position of the key.
# -----------------------------------------
jr $lr