Мне нужна помощь с этой последней частью этой проблемы. Я в основном пытаюсь перевести код C ++ на язык ассемблера MIPS.
Предположим, что a находится в $ s0, b в $ s1, c в $ s2, x в $ s4, y в $ s5 и z в $ s6.
Я закончил почти все из них, но я застрял на этих двух, я знаю некоторые части этого, но у меня есть проблемы, соединяющие это в целом. За частями, которые я знаю, последуют хэштеги с кодом сборки. Спасибо за любую помощь.
1.
for(x = 0; x <= z; x++) # x = 0; is: addi $s4, $0, 0
y = y + 1; # addi $s5, $s5, 1
y = 0; # addi $s5, $0, 0
2.
if(y > z)
x = 0; # addi $s4, $0, 0
else x = 1; # else: addi $s4, $0, 1
Вот оригинальные проблемы без хэштегов, если я ошибаюсь:
1.
for(x = 0; x <= z; x++)
y = y + 1;
y = 0;
2.
if(y > z)
x = 0;
else x = 1;
Еще раз спасибо.
Попытка на 2, не уверен, если правильно.
ifLoop:
add $s5, ? , $s6
addi $s4, $0, 0
ifLoop
else:
addi $s4, $0, 1
else
Практика: (Предположим, что массив p находится в $ s7)
p[0] = 0;
int a = 2;
p[1] = a;
p[a] = a;
Моя попытка:
sw $0, 0($s7)
addiu $s0, $0, 2
sw $s0, 4($s7)
sll $t0, $s0, 2
addu $t1, $t0, $s7
sw $s0, 0($t1)
Редактировать: 1. К счастью, это не так уж много отличается без псевдо-инструкций.
addi $s4, $0, 0
forLoop: sle $t1, $s4, $s6 #if x <= z, set $t1 to 1, else 0
addi $s5, $s5, 1
addi $s5, $0, 0
addi $s4, $s4 1
bne $t1, $0, forLoop #repeat loop while $t1 is not 0
Вот # 2. Я просто хотел, чтобы вы попробовали, прежде чем я просто дал ответ. Вы хотите использовать инструкцию slt для установки регистра в 1 или 0. Если 1, сравнение истинно (y> z). Затем используйте bne, чтобы определить, куда перейти. Сравнивая bne с 0, истинный код заканчивается непосредственно под инструкцией bne. В противном случае, перейти к метке.
slt $t2, $s6, $s5 # if z < y, set $t2 to 1, else 0
bne $t2, $0, else # if $t2==1, do the code below, if not, go to else
addi $s4, $0, 0
j continue # need the jump instruction to skip the else below
else:
addi $s4, $0, 1
continue:
# rest of code/program
Других решений пока нет …