【发布时间】:2023-04-10 14:09:05
【问题描述】:
我有这个练习
将以下 C 代码翻译成 RISC-V 汇编代码。假设 a、b、i 和 j 的值分别在寄存器 x5、x6、x7 和 x29 中。另外,假设寄存器 x10 保存着数组 D 的基地址。
for(i=0; i<a; i++){
for(j=0; j<b; j++){
D[4*j] = i + j;
}
}
我也有 cmets 的解决方案
Loop1:
addi x7, x0, 0 // i = 0
bge x7, x5, ENDi // while i < a
addi x30, x10, 0 // x30 = &D[0]
addi x29, x0, 0 // j = 0
Loop2:
bge x29, x6, ENDj // while j < b
add x31, x7, x29 // x31 = i + j
sd x31, 0(x30) // D[4*j] = x31
addi x30, x30, 32 // x30 = &D[4*(j+1)]
addi x29, x29, 1 // j++
jal x0, LOOP2
ENDj:
addi x7, x7, 1 // i++
jal x0, LOOP1
ENDi:
我不明白的地方
sd x31, 0(x30) // D[4*j] = x31
addi x30, x30, 32 // x30 = &D[4*(j+1)]
sd x31, 0(x30) 不是表示我将 x31 的值存储在数组 30 的第 0 位吗?突然的4*j是从哪里来的?
addi x30, x30, 32 不是表示 x30 = x30+32 吗?第一个循环中没有定义 x30 = &D[0] 吗? j怎么突然接触到x30了?
【问题讨论】: