Closed. This question needs details or clarity. It is not currently accepting answers. Learn more
想改进这个问题吗添加细节并通过editing this post澄清问题。
三年前关闭。
我试图解决这个问题并将其转换为MIPS程序集代码
但是书中的答案让我很困惑。那么,有人能解释一下这段代码是如何在c语言中得到这个结果的吗?
B[g]=A[f]+A[f+1];
我已经插入了我认为正确的评论,如果我错了,请纠正我。
假设变量f、g、h、i、j分别存储在$s0、s1、s2、s3和$s4中。假设数组A和B的基址分别为$s6和$s7。
代码:
add $t0, $s6, $s0  #This will add f bytes to the base address and it's not equal to A[f].
add $t1, $s7, $s1  #This will add g bytes to the base address and it's not equal to B[g]
lw $s0, 0($t0)     #This will point to the value in (f +base address of A +0) bytes
lw $t0, 4($t0)     #This will point to the value in (f +base address of A +4) bytes
add $t0, $t0, $s0
sw $t0, 0($t1)

最佳答案

你编译的片段由我注释:

add $t0, $s6, $s0

在寄存器t0中添加并存储寄存器s6s0中的任何内容。因为您已经指出f存储在s0中,而A的基址存储在s6中,所以这将添加地址,以准备以后的寄存器间接加载。更简单的是,在C中A[f] == *(A + f),这是为以后的(A + f)去引用做准备。
add $t1, $s7, $s1

对于Bg也会发生同样的事情。添加它们的内容并将其存储在中间寄存器中,以便以后用作基于地址的解引用目标。
lw $s0, 0($t0)

这是加载到s0寄存器,使用cpu的register-indirect寻址模式,即t0指向的地址加上0字节。在c中,这等于s0 = *(A + f)
lw $t0, 4($t0)

与上面一样,只不过这次它加载到寄存器t0中指向t0的任何内容加上4个字节。等于Ct0 = *(A + f + 1)
add $t0, $t0, $s0

这就是它在代码中执行加法的地方。它等于A[f] + A[f + 1]的C代码片段。
sw $t0, 0($t1)

这将存储先前添加到t1所指地址的结果。
~~~~~~~~~~~
如果您正在寻找您所拥有的代码的一些引用,我找到了这个MIPS instruction set reference useful和,当然,Matt Godbolt's interactive compiler
如果您想了解使用交互式编译器执行什么操作的代码,只需将代码包装在void函数中,选择as the compilerx86 clang并在编译器选项中选择--target=mips。然后从过滤器中应用colorise,您将能够看到什么C代码生成什么程序集代码,得到如下图片
c - C到MIPS汇编-LMLPHP

关于c - C到MIPS汇编,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36105540/

10-11 16:46