正在将C转换为mips程序集,未对齐地址错误
我现在正在做一项作业,几乎完成了,但我一直在说 仪器/数据提取中未对齐的地址:0x10010016 第行:正在将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
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
读/写的数据必须对齐。时期如果它对你的问题不起作用,你必须找到一个解决办法。谢谢你的帮助。我发现我的代码中有不止一个问题,哈哈。这只是其中之一。无论如何,谢谢你。