MIPS到C的翻译

MIPS到C的翻译,c,assembly,mips,translate,C,Assembly,Mips,Translate,我需要将一些MIPS汇编指令翻译成C代码。我想我明白了,但这似乎违反直觉。有什么帮助吗?变量f、g、h、i、j分别存储在寄存器$s0、s1、s2、s3和$s4中。数组A和B的基分别存储在$s6和$s7中。4字节字。代码中的注释是我自己的 addi $t0, $s6, 4 # $t0 = A[1] add $t1, $s6, $0 # $t1 = A[0] sw $t1, 0($t0) # $t0 = A[0] lw $t0, 0($t0) # $t0 = A[0] add

我需要将一些MIPS汇编指令翻译成C代码。我想我明白了,但这似乎违反直觉。有什么帮助吗?变量f、g、h、i、j分别存储在寄存器$s0、s1、s2、s3和$s4中。数组A和B的基分别存储在$s6和$s7中。4字节字。代码中的注释是我自己的

addi $t0, $s6, 4   # $t0 = A[1]
add $t1, $s6, $0   # $t1 = A[0]
sw $t1, 0($t0)     # $t0 = A[0]
lw $t0, 0($t0)     # $t0 = A[0]
add $s0, $t1, $t0  # f = A[0] + A[0]
我只是觉得我错了。如果我们从不使用它,为什么要先把t0美元变成[1]美元呢

sw $t1, 0($t0)     # $t0 = A[0]
你把这个背对背。它是一个商店,因此被用于:


我想这是对的

A[1] = A[0] 
f= A[1] + A[1]

只是对前面的答案稍加补充:
存储字意味着您无法再访问$t1,因为它被复制到内存中。至少您不应该使用store word指令中的$t1。您应该使用前面的一个(
添加$t1、$s6、$0
)。这意味着答案是
f(在$s0中)=&A[0](寄存器$t1中的基址)+A[1](字索引为1的数组的值,在寄存器$t0中)

我认为您完全错了

addi$t0,$s6,4#$t0=A[1]

在addi之后,寄存器
$t0
成为A[1]的内存地址,它将是
&A[1]
,而不是
A[1]
。要获取A[1]的值,您需要在完成
addi


lw$t0,0($t0)#$t0=A[1]
Mnush的答案不正确

A[1] = A[0] 
f= A[1] + A[1]
最后一行是添加$t1和$t0

$t1=A[0]和

$t0=A[1]

有适当的评论:

addi $t0, $s6, 4   # $t0 = &A[1]
add $t1, $s6, $0   # $t1 = &A[0]
sw $t1, 0($t0)     # A[0] = A[1]
lw $t0, 0($t0)     # $t0 = A[0]
add $s0, $t1, $t0  # f = A[0] + A[1]
C代码:

A[1] = A[0];
f = A[0] + A[1];

实际上,您正在使用[1]两次,如图所示:

  • 寄存器$t0携带来自第一条指令的数组地址

    sw $t1, 0($t0)    #  A[1] = $t1  =>  A[1] = &A[0]
    
  • 将地址($t0+0)的值加载到寄存器$t0中

    lw $t0, 0($t0)   # $t0 = A[1]
    
  • 本质上=>

    $t0 = &A[0]
    

我不这么认为。我的修订更改了第四行的含义。考虑到这一点,你会得到什么?这就是添加地址<代码>f=&A[0]+&A[1]。这毫无意义,在C语言中需要强制转换到
(uintpttr\u t)
,但asm实际上就是这样做的。那么这是正确的答案@PeterCordes吗<代码>A[1]=A[0];f=(unitptr_t)(&A[0]+&A[1])否,不能在C语言中的两个指针之间执行
+
。必须将至少一个操作数强制转换为
+
,而不是转换结果。也不是,
A[1]=A[0]不正确。存储前没有加载,只需处理计算/副本。对相同的奇怪代码进行了正确的分析,带有正确的注释,如
&A[0]
,而不是
A[0]