从 c 到 mips 的翻译
translation from c to mips
你能帮我把这段代码从c翻译成mips吗?下周我要考试,但我不能做这部分,这对我来说很难:(
这是代码:
int A[4] = { 2, 3, 4, 5 };
int B[4] = { 1, 1, 2, 3 };
int C[4] = { 0, 0, 0, 0 };
void
main()
{
int actualizacion = 1;
updateValues(4);
actualizacion = actualizacion + 1;
}
void
updateValues(int var)
{
switch (var) {
case 4:
do {
var = var - 1;
A[var] = B[var] - C[var];
} while (var != 0);
break;
default:
var = var * 2;
break;
}
}
您没有提及您使用的 IDE(例如 spim
、mips
等)。所以,我用了 mars
.
在 C 中,当您对数组进行索引时,编译器会根据元素的大小 [以字节为单位] 计算偏移量(例如,对于 int
,这是 4)。所以,如果代码是:
x = C[var]
“有效”代码为:
x = *(int *) (((char *) C) + (var * 4));
在汇编程序中,我们必须做同样的事情。
这是带注释的代码:
.data
A: .word 2, 3, 4, 5
B: .word 1, 1, 2, 3
C: .word 0, 0, 0, 0
.text
.globl main
# s0 -- actualizacion
main:
li $s0,1 # actualizacion = 1
li $a0,4
jal updateValues
addi $s0,$s0,1 # actualizacion += 1
li $v0,10
syscall
.globl updateValues
# a0 -- var (array index)
# t0 -- var << 2 (byte offset)
# t1 -- array address
# t2 -- B value
# t3 -- C value
updateValues:
li $t0,4
bne $a0,$t0,update_default
update_loop:
addi $a0,$a0,-1 # var -= 1
sll $t0,$a0,2 # convert index into byte offset
la $t1,B # base address of B
addu $t1,$t1,$t0 # add in byte offset
lw $t2,0($t1) # load value
la $t1,C # base address of C
addu $t1,$t1,$t0 # add in byte offset
lw $t3,0($t1) # load value
sub $t2,$t2,$t3 # B - C
la $t1,A # base address of A
addu $t1,$t1,$t0 # add in byte offset
sw $t2,0($t1) # store value
bnez $a0,update_loop # loop until var == 0
b update_exit
update_default:
li $t0,2
mul $a0,$a0,$t0 # var = var * 2
update_exit:
jr $ra # return
你能帮我把这段代码从c翻译成mips吗?下周我要考试,但我不能做这部分,这对我来说很难:( 这是代码:
int A[4] = { 2, 3, 4, 5 };
int B[4] = { 1, 1, 2, 3 };
int C[4] = { 0, 0, 0, 0 };
void
main()
{
int actualizacion = 1;
updateValues(4);
actualizacion = actualizacion + 1;
}
void
updateValues(int var)
{
switch (var) {
case 4:
do {
var = var - 1;
A[var] = B[var] - C[var];
} while (var != 0);
break;
default:
var = var * 2;
break;
}
}
您没有提及您使用的 IDE(例如 spim
、mips
等)。所以,我用了 mars
.
在 C 中,当您对数组进行索引时,编译器会根据元素的大小 [以字节为单位] 计算偏移量(例如,对于 int
,这是 4)。所以,如果代码是:
x = C[var]
“有效”代码为:
x = *(int *) (((char *) C) + (var * 4));
在汇编程序中,我们必须做同样的事情。
这是带注释的代码:
.data
A: .word 2, 3, 4, 5
B: .word 1, 1, 2, 3
C: .word 0, 0, 0, 0
.text
.globl main
# s0 -- actualizacion
main:
li $s0,1 # actualizacion = 1
li $a0,4
jal updateValues
addi $s0,$s0,1 # actualizacion += 1
li $v0,10
syscall
.globl updateValues
# a0 -- var (array index)
# t0 -- var << 2 (byte offset)
# t1 -- array address
# t2 -- B value
# t3 -- C value
updateValues:
li $t0,4
bne $a0,$t0,update_default
update_loop:
addi $a0,$a0,-1 # var -= 1
sll $t0,$a0,2 # convert index into byte offset
la $t1,B # base address of B
addu $t1,$t1,$t0 # add in byte offset
lw $t2,0($t1) # load value
la $t1,C # base address of C
addu $t1,$t1,$t0 # add in byte offset
lw $t3,0($t1) # load value
sub $t2,$t2,$t3 # B - C
la $t1,A # base address of A
addu $t1,$t1,$t0 # add in byte offset
sw $t2,0($t1) # store value
bnez $a0,update_loop # loop until var == 0
b update_exit
update_default:
li $t0,2
mul $a0,$a0,$t0 # var = var * 2
update_exit:
jr $ra # return