Адрес выборки MIPS не выровнялся на границе слова, используемом .align 4, тем не менее никакие не идут

какие-либо идеи? Почему я добираюсь: Исключение на этапе выполнения в 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:
8
задан bep 26 February 2010 в 04:23
поделиться

1 ответ

Проблема с кодом в том, что вы используете не адрес, где хранится размер, а сам размер:

Здесь вы загружаете адрес в 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
7
ответ дан 5 December 2019 в 21:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: