我正在为我的班级编写代码,尽管我认为我已经接近目标,但我一直在比我应该做的事情上付出更多的努力。每当我到达
lh
命令时,它就会终止。我确信(至少我认为我是对的)我转移不正确并试图加载一个不存在的地址。我知道问题出在 lh
;我只是不知道如何解决它。
我们应该编写 10 个不同的步骤来解决数独,但我陷入了第二步。这是在 64 位 RISC-V 处理器中。这是我的代码:
# get_used(board, group) -> used #s1:board s2:group s3:group_index s4:elt
get_used: #s0: used t0:g_index a3:9 t1:g_elt_add t2: b_index
#t3: scaled_b_index t4: b_elt_add t5:elt
addi sp, sp, -48
sd ra, 40(sp)
sd s0, 32(sp)
sd s1, 24(sp)
sd s2, 16(sp)
sd s3, 8(sp)
sd s4, 0(sp)
mv s0, a0
mv s1, a1
li s2, 0
li s3, 0
loop:
li t0, 9
bge s3, t0, end_loop
slli t1, s3, 3
add t1, s1, t1
ld t2, 0(t1)
slli t2, t2, 1
add t3, s0, t2
** lh s4, 0(t3)** #line where it quits
mv a0, s4
jal ra, count_bits
mv t4, a0
li t5, 1
beq t4, t5, add_to_used
j next_iter
add_to_used:
or s2, s2, s4
next_iter:
addi s3, s3, 1
j loop
end_loop:
mv a0, s2
ld ra, 40(sp)
ld s0, 32(sp)
ld s1, 24(sp)
ld s2, 16(sp)
ld s3, 8(sp)
ld s4, 0(sp)
addi sp, sp, 48
ret
这是我的第一步供参考:
count_bits:
li a2, 0
li a1, 0
li t1,10
1: bge a1, t1, 2f
srl t0, a0, a1
andi t0, t0, 1
beqz t0, 3f
addi a2, a2, 1
3: addi a1, a1, 1
j 1b
2: mv a0, a2
ret
在这一点上我已经尝试了很多,但我很困难。我不断遇到一个又一个的问题。
没有足够的信息来说明问题所在,但它涉及到您的数据结构。使用 64 位项目作为索引有点不寻常,所以也许可以研究一下。
用 C 语言编写一些代码并进行测试以确保其有效。然后在汇编中复制它。
研究您的数据,了解好的地址是什么样的。 (在 C 和汇编版本中执行。)
编写小型汇编测试程序,以熟练地访问汇编中的数据。