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。
代码:
在寄存器
对于
这是加载到
与上面一样,只不过这次它加载到寄存器
这就是它在代码中执行加法的地方。它等于
这将存储先前添加到
~~~~~~~~~~~
如果您正在寻找您所拥有的代码的一些引用,我找到了这个MIPS instruction set reference useful和,当然,Matt Godbolt's interactive compiler。
如果您想了解使用交互式编译器执行什么操作的代码,只需将代码包装在
想改进这个问题吗添加细节并通过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
中添加并存储寄存器s6
和s0
中的任何内容。因为您已经指出f
存储在s0
中,而A
的基址存储在s6
中,所以这将添加地址,以准备以后的寄存器间接加载。更简单的是,在C中A[f] == *(A + f)
,这是为以后的(A + f)
去引用做准备。add $t1, $s7, $s1
对于
B
和g
也会发生同样的事情。添加它们的内容并将其存储在中间寄存器中,以便以后用作基于地址的解引用目标。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汇编,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36105540/
10-11 16:46