gpt4 book ai didi

MIPS提取地址未在字边界上对齐,已使用.align 4,仍然无法执行

转载 作者:行者123 更新时间:2023-12-04 08:00:29 25 4
gpt4 key购买 nike

有任何想法吗?为什么我得到:
运行时异常位于0x00400020:提取地址未在字边界0x00000007上对齐
问题行是:lw $ s1,0($ 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

关于MIPS提取地址未在字边界上对齐,已使用.align 4,仍然无法执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2339488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com