Hoe gebruik ik de mod-operator correct in MIPS?

In MIPS weet ik niet hoe ik de mod moet laten werken. Hieronder staat de code die ik tot nu toe heb bedacht. Ik heb misschien meer fouten dan de mod, maar ik denk dat die fouten het gevolg zijn van het misverstand van de mod. Het enige wat ik probeer te doen is de werkende code (python) hier te krijgen:

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

om correct te vertalen naar MIPS. Dit is mijn eerste kans op assemblage, dus er kunnen meer dan mod-fouten zijn die me doen struikelen in de onderstaande code:

# 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

Antwoord 1, autoriteit 100%

U bekijkt SPIM-registers in hex. Hexadecimaal 10 is decimaal 16.


Antwoord 2, autoriteit 100%

Nadat de knikken zijn opgelost, werkt de onderstaande code als een tierelier. Om de mod-operator correct te gebruiken in MIPS, moet men HI en LO gebruiken. Ik had i% 2 == 0 nodig voor de verklaring, dus mfhi kwam goed van pas. Referentie onderstaande code voor werkresultaten:

# 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

Other episodes