2014-02-11 3 views
1

MIPS에서 mod를 작동시키는 방법을 혼동합니다. 아래는 제가 지금까지 생각 해낸 코드입니다. 내가 모드 이외의 더 많은 오류가있을 수 있습니다,하지만 그 오류는 MOD 오해의 결과라고 생각합니다. 내가하려는 것은 working 코드 (파이썬)를 여기에 가져 오는 것입니다.MIPS에서 mod 연산자를 올바르게 사용하려면 어떻게해야합니까?

정확하게 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

당신은 정확하게 맞았습니다. 나는 거기에 파운드의 샷, 그리고 코드는 적어도 내가 문제를 정확하게 지적 할 수있는 시점입니다. 문제는 i의 7 번째 반복 동안 발생합니다. k는 그 시점까지 정확하게 증가합니다. i = 6 인 동안 k = 9, 이는 맞습니다. 그러나 다음 반복은 정답 인 16 대신 k를 10으로 만듭니다. 문제는 내가 k를 선언 한 방법에있을 수 있지만 확실하지 않습니다. – kcmallard

답변

3

당신은 진수에 SPIM 레지스터를 볼 수 있습니다. 16 진수 10은 10 진수입니다.

+0

예. 16 진수에서 10 진수로 표시되는 레지스터를 변경하면됩니다. – kcmallard

1

꼬임 문제를 해결 한 후 아래 코드는 매력처럼 작동합니다. MIPS에서 mod 연산자를 올바르게 사용하려면 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