正在将C转换为mips程序集,未对齐地址错误

正在将C转换为mips程序集,未对齐地址错误,c,assembly,mips,C,Assembly,Mips,我现在正在做一项作业,几乎完成了,但我一直在说 仪器/数据提取中未对齐的地址:0x10010016 第行: lw $t3,0($a1) # get the value of b[k] and save it into t3 我在网上搜索,发现一个答案说我必须使用.align 2来解决这个问题,但这对我的问题不起作用 有人能给我一个提示吗,我真的花了6个小时在这上面 多谢各位 这是我的密码: # a -> $a0 # b -> $a1 # n -> $a2 # j

我现在正在做一项作业,几乎完成了,但我一直在说

仪器/数据提取中未对齐的地址:0x10010016

第行:

lw   $t3,0($a1)     # get the value of b[k] and save it into t3
我在网上搜索,发现一个答案说我必须使用.align 2来解决这个问题,但这对我的问题不起作用

有人能给我一个提示吗,我真的花了6个小时在这上面

多谢各位

这是我的密码:

# a -> $a0
# b -> $a1
# n -> $a2
# j -> $a3
# k -> $s0
# i -> $t0


.data

.align 2

arra:   .word 1,2,7,4,5
arrb:   .word 3,4,7,2,9



.text


    la $a0, arra        # we have array a[] = { 1,2,7,4,5}
    la $a1, arrb        # we have array b[] = {3,4,7,2,9}






    addi $a2,$zero,0        # n = 0
    addi $a2,$zero,3        # n = 3

    addi $a3,$zero,0        # j = 0
    addi $a3,$zero,3        # j = 3

    addi $s0,$zero,0        # k = 0
    addi $s0,$zero,2        # k = 2



g:

    addi $sp, $sp, -24

    sw   $ra, 20($sp)       # save $ra on stack
    sw   $s0, 16($sp)        # save $s0 (k) on stack
    sw   $a0, 12($sp)        # save a0(a) on stack
    sw   $a1, 8($sp)        # save a1(b) on stack
    sw   $a2, 4($sp)        # save a2(n) on stack
    sw   $a3, 0($sp)        # save a3(j) on stack


    move $a3,$s0            # set j = k
    jal    f            # f(a,b,n,k,k)

    add  $a1,$a1,$s0    # return the address of b[k]
    lw   $t3,0($a1)     # get the value of b[k] and save it into t3
    add  $v0, $t3,$zero # return the value


    lw  $a3,0($sp)
    lw  $a2,4($sp)
    lw  $a1,8($sp)
    lw  $a0,12($sp)
    lw  $s0,16($sp)
    lw  $ra,20($sp)

    addi $sp,$sp,24

    jr   $ra





f:
    bne  $a2, $zero, ELSE   # if (n != 0) go to ELSE


    addi $t0, $zero, 1  # set $t0 = 1
    sw   $t0, 0($a1)    # then set b[0] = 1

    addi $t0, $zero, 1  # set $t0 = 1
    sw   $t0, 0($a1)    # then set b[0] = 1

    addi $t0, $zero, 1  # set i = 1 for the loop

forLoop:
    slt $t1,$s0, $t0    # if k < i, end the loop, use $t1 to store the boolean value
    bne $t1, 1, forLoopDone
    add $a1, $a1, $t0       # b[i] address
    add $t2,$zero,$zero
    sw  $t2, 0($a1)         # b[i] = 0
    addi $t0, $t0, 1        # i = i + 1
    j    forLoop


ELSE:
    bne $a3, $zero, updateJ     # test if (j == 0), if not, j = j -1
    j    iteratef

updateJ:
    addi $a3, $a3, -1       # j = j -1
    j    iteratef

iteratef:
    addi $a2, $a2, -1       # iterate, n = n - 1
    j    f              # f(b, a, n-1, j_update, k)

    bne  $a3, $zero, forLoop1Ini    # if (j != 0), go to for_loop1_ini
    lw   $a0, 0($a0)        # there might be sth wrong here
    sw   $a1, 0($a1)        # set b[0] = a[0]
    addi $a3, $a3, 1        # j++


forLoop1Ini:
    addi $t0, $a3, 0        # set i = j

forLoop1Start:
    slt  $t1,$s0, $t0   
    bne  $t1, 1, forLoop1Done
    add  $a0, $a0, $t0      # get a[i] address
    lw   $t1, 0($a0)        # t1 = a[i]
    lw   $t2, -4($a0)       # get b[i]
    add  $a1, $a1, $t0      # get b[i] address
    add  $t1, $t1, $t2      # t1 = a[i-1] + a[i]
    sw   $t1, 0($t1)        # b[i] = a[i-1] + a[i]
    addi $t0, $t0, 1        # i++
    j    forLoop1Start

forLoop1Done:
    nop

forLoopDone:
    nop



    jr  $ra
#a->a0美元
#b->a1美元
#n->a2美元
#j->a3美元
#k->s0美元
#i->t0美元
.数据
.对齐2
阿拉:单词1,2,7,4,5
arrb:.单词3,4,7,2,9
.文本
la$a0,arra#我们有数组a[]={1,2,7,4,5}
la$a1,arrb#我们有数组b[]={3,4,7,2,9}
addi$a2,$0,0#n=0
addi$a2$0,3#n=3
addi$a3,$0,0#j=0
addi$a3,$0,3#j=3
addi$s0$0,0#k=0
addi$s0$0,2#k=2
g:
附加$sp,$sp,-24
sw$ra,20($sp)#在堆栈上节省$ra
sw$s0,16($sp)#在堆栈上节省$s0(k)
sw$a0,12($sp)#在堆栈上保存a0(a)
sw$a1,8($sp)#在堆栈上保存a1(b)
sw$a2,4($sp)#在堆栈上保存a2(n)
sw$a3,0($sp)#在堆栈上保存a3(j)
移动$a3,$s0#设置j=k
日本航空公司(a、b、n、k、k)
添加$a1、$a1、$s0#返回b[k]的地址
lw$t3,0($a1)#获取b[k]的值并将其保存到t3中
添加$v0、$t3、$0#返回值
lw$3,0($sp)
lw$a2.4($sp)
lw$1.8($sp)
lw$a0,12($sp)
lw$s0,16($sp)
lw$ra,20$sp
附加$sp,$sp,24
jr$ra
f:
bne$a2$零,否则#如果(n!=0)转到其他
addi$t0,$0,1#设置$t0=1
sw$t0,0($a1)#然后设置b[0]=1
addi$t0,$0,1#设置$t0=1
sw$t0,0($a1)#然后设置b[0]=1
addi$t0,$0,1#为循环设置i=1
forLoop:
slt$t1,$s0,$t0#如果k
您的问题是没有考虑数组中每个元素的大小。每个元素占用4个字节。 因此,不是发行,

  add  $a1,$a1,$s0    # return the address of b[k] 
应将索引乘以4(即元素的大小)以获得有效偏移量:

  sll $s1, $s0, 2     # Compute effective offset (i.e. multiply index by 4)
  add  $a1,$a1,$s1    # return the address of b[k]
  lw   $t3,0($a1)     # get the value of b[k] and save it into t3

读/写的数据必须对齐。时期如果它对你的问题不起作用,你必须找到一个解决办法。谢谢你的帮助。我发现我的代码中有不止一个问题,哈哈。这只是其中之一。无论如何,谢谢你。