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