mips - MIPS 保存到地址为变量的寄存器
问题描述
所以我正在做作业,一个问题是要求我将指令保存到寄存器中。这就是问题。
假设 a、b、i 和 j 的值分别在寄存器 $s0、$s1、$t0 和 $t1 中。此外,假设寄存器 $s2 保存数组 D 的基地址。
for(i=0; i<a; i++)
for(j=0; j<b; j++)
D[4*j] = i + j;
必须在 MIPS 中写这个,我几乎有 90%,我遇到的问题是将 i+j 的结果保存到 D[4*j]。这是我在嵌套循环中的代码。
add $t2, $t0, $t1 # add i to j and store to temp
sll $t3, $t1, 4 # offset of j*4
add $t3, $s2, $t3 #add offset with base of D
通常,其他问题会给我地址的值,例如 B[8],所以我只使用常量 32。但是使用变量保存时,我不确定如何执行此操作,因为它需要一个常量。我几乎可以肯定那sw $t2, 0($t3)($s2)
是行不通的。我只是错过了显而易见的事情吗?
解决方案
最简单的解决方案是将地址增加 4*4(如果D
是 s 数组int
)。
这对应于这个 C 代码:
for(int i=0; i<a; i++)
for(int j=0, int *pd=&D[0]; j<b; j++,pd+=4)
*pd=i+j;
mips 实现可能与您的假设一致
假设 a、b、i 和 j 的值分别在寄存器 $s0、$s1、$t0 和 $t1 中。此外,假设寄存器 $s2 保存数组 D 的基地址。
add $t0,$r0,$r0 #j=0
loopi:
addi $t1,$r0,$r0 #j=0
mov $t3,$s2 #$t3=@D
loopj:
add $t2, $t0, $t1#add i to j and store to temp
sw $t2, 0($t3) #store result in *t3
addi $t3, 16 #t3+=4
addi $t1, 1 #j++
blt $t1,$s1,loopj#j<b?
addi $t0,1 #i++
blt $t0,$s0,loopi#i<a?
顺便说一句,j
循环将D
连续写入先前的值,ì
并且只有最后一个值将保留在D
. 也许你的代码是错误的。或者可以替换为
for(int j=0; j<b; j++)
D[4*j]=a-1+j;
推荐阅读
- ios - 我来自 firebase 数据库的数据没有加载到我的 tableview 中
- azure - VM 上未安装 Azure Log Analytics 代理
- flutter - 扩展小部件中的平面按钮未正确舍入
- kendo-ui - Kendo Grid 分页:当前页面在中间
- python - 将 dpi 添加到 seaborn 或使用给定的 dpi 导出它们
- sql - 如何维护 T-SQL 中动态填充列的字段大小
- php - Laravel 调试栏在我在 chrome 中取消后没有显示,但在 firefox 上工作
- sql - SQL - 使用 string_agg 两次
- ssl - Nginx Stream SSL 连接到 Synology 时出现错误 500
- lua - io.read() 是读取字符吗?