2014-02-11 3 views
1

В MIPS я смущен тем, как заставить мод работать. Ниже приведен код, который я привел до сих пор. У меня может быть больше ошибок, кроме мода, но я чувствую, что эти ошибки являются результатом недопонимания мод. Все, что я пытаюсь сделать, чтобы получить рабочий код (Python) здесь:Как правильно использовать оператор mod в MIPS?

i = 1 
k = 0 
while i < 9: 
if i % 2 != 0: 
    k = k + i 
i += 1 
print(k) 

быть правильно переведены на MIPS. Это мой первый выстрел при сборке, так что может быть больше, чем мода ошибок, которые отключающие меня в коде ниже:

# Takes the odd integers from 1 to 9, adds them, 
# and spits out the result. 
# main/driver starts here 
    .globl main 

main: 

#data segment 
.data 

Li:  .byte 0x01 # i = 1 
Lj:  .byte 0x09 # j = 9 
Lk:  .byte 0x00 # k = 0 
Ltwo: .byte 0x02 # 2 for mod usage 

# text segment 
.text 

lb $t0, Li  # temp reg for i 
lb $t1, Lj  # j 
lb $t2, Lk  # k 
lb $t3, Ltwo  # 2 

L1: beq $t0, $t1, L2 # while i < 9, compute 
    div $t0, $t3  # i mod 2 
    mfhi $t6  # temp for the mod 
    beq $t6, 0, Lmod # if mod == 0, jump over to L1 
    add $t2, $t2, $t0 # k = k + i 
Lmod: add $t0, $t0, 1  # i++ 
    j L1   # repeat the while loop 


L2: li $v0, 1  # system call code to print integer 
lb $a0, Lk  # address of int to print 
syscall 

li $v0, 10 
syscall 
+1

Вы не объяснили, в чем проблема. Как код ведет себя иначе, чем вы ожидали? Однако эти инструкции 'sb' выглядят подозрительными; целью 'sb' является запись младшего байта регистра в память. – Michael

+0

Ты был прав. Я застрелил там фунт, и теперь код по крайней мере до такой степени, что я могу точно определить проблему. Проблема возникает во время 7-й итерации i. k увеличивается до этой точки. k = 9 при i = 6, что верно. Но следующая итерация приведет к 10 вместо правильного ответа. 16. Проблема может заключаться в том, как я объявил k, но я не уверен. – kcmallard

ответ

3

Вы читаете регистры спят в шестнадцатеричном формате. Шестнадцатеричный 10 является десятичным 16.

+0

Yup. Измененный регистр, показывающий от hex до dec, сделал это. – kcmallard

1

После разработки перегибов код ниже работает как шарм. Чтобы правильно использовать оператор mod в MIPS, нужно использовать HI и LO. Мне нужно было i% 2 == 0 для утверждения, поэтому mfhi пригодился. Ссылка на приведенный ниже код для рабочих результатов:

# Takes the odd integers from 1 to 9, adds them, 
# and spits out the result. 
# main/driver starts here 
    .globl main 

main: 

#data segment 
.data 

Li:  .byte 0x01 # i = 1 
Lj:  .byte 0x0A # j = 10 
Lk:  .byte 0x00 # k = 0 
Ltwo: .byte 0x02 # 2 for mod usage 


# text segment 
.text 

lb $t0, Li  # temp reg for i 
lb $t1, Lj  # j 
lb $t2, Lk  # k 
lb $t3, Ltwo  # 2 

L1:  beq $t0, $t1, L2 # while i < 9, compute 
     div $t0, $t3  # i mod 2 
     mfhi $t6   # temp for the mod 
     beq $t6, 0, Lmod # if mod == 0, jump over to Lmod and increment 
     add $t2, $t2, $t0 # k = k + i 
Lmod: add $t0, $t0, 1  # i++ 
     j L1    # repeat the while loop 


L2:  li $v0, 1  # system call code to print integer 
     move $a0, $t2  # move integer to be printed into $a0 
     syscall 

     li $v0, 10  # close the program 
     syscall 
Смежные вопросы