arrays - 将 C 数组访问转换为 MIPS
问题描述
问题是:
假设数组
A
和的基地址B
分别在寄存器$s6
和$s7
中。变量
f
和g
分别分配给寄存器$s0
,$s1
。以下 C 代码对应的 MIPS 汇编代码是什么:
f = g - A[B[4]];
我的想法是:
lw $t0, 16($s7) # $t0 = B[4]
lw $t1, 64($s6) # $t1 = A[B[4]]
sub $s0, $s1, $t1 # $s0 = $s1 - $t1
我在这个答案上错了,我不知道为什么。有人可以帮我一个想法或解释吗?
解决方案
很好的尝试,但是您的代码不正确,因为$t0
已加载但从未使用过。我也不确定数字 64 来自哪里,但基本上这应该是从B[4]
,中提取的值$t0
。
您可能会对嵌套数组访问感到困惑A[B[4]]
。从概念上讲,这是使用存储在中的值B[4]
作为索引A
。最好将其扩展并从每行单个操作的 C 代码开始:
t0 = B[4];
t1 = A[t0];
f = g - t1;
现在更容易提出:
lw $t0, 16($s7) # B_val = B[4]
sll $t0, $t0, 2 # B_val *= 4
addu $t2, $t0, $s6 # A_offset = B_val + A_base
lw $t1, ($t2) # A_val = A[A_offset]
sub $s0, $s1, $t1 # f = g - A_val
在这里,我假设该B
值需要乘以 4。
你总是可以编写一个程序来验证你的工作(至少,在考试之后):
.data
A: .word 1, 1, 1, 1, 24
B: .word 1, 1, 1, 1, 4
.text
main:
la $s6 A # A_base
la $s7 B # B_base
li $s1, 42 # g = 42
lw $t0, 16($s7) # B_val = B[4]
sll $t0, $t0, 2 # B_val *= 4
addu $t2, $t0, $s6 # A_offset = B_val + A_base
lw $t1, ($t2) # A_val = A[A_offset]
sub $s0, $s1, $t1 # f = g - A_val
li $v0, 1
move $a0, $s0
syscall # => should be 42 - 24 = 18
li $v0, 10
syscall
推荐阅读
- debugging - 在 VSCode 中触发扩展命令时,我如何知道执行了代码的哪一部分?
- azure - 无法访问 Azure 文件共享 | 端口 445
- firebase - Firestore 实时更新或 Sockets.io 用于实时聊天
- unity3d - Animator SetFloat(int 0) as Transition,现在是为了防止循环?
- java - 装饰器设计和工厂设计模式
- selenium-webdriver - 试图点击登录按钮,但它说元素不可交互
- java - Firebase Android Java - 无法获得孩子的价值
- python - 基于另一列的有序值汇总一列数据的python代码
- angular - 如何通过找到 ng-repeat 来选择下拉按钮?
- c# - 导入 TextMesh Pro 后编译器错误