MIPS програма не може зрозуміти MIPS/MFLO/SW

Я хотів написати програму, яка перетворює десяткове число в двійкове. Для цього я мав би використовувати масив. Будь ласка, подивіться на рядок, прокоментував нижченаведений пункт, і скажіть мені, чому це може не допомогти, тому що симулятор спаму говорить про спробу виконати не-інструкцію

       .text
       .globl __start
    __start:

        la $a0,prompt
        li $v0,4
        syscall

        li $v0,5
        syscall

        move $t1,$v0

        li $t0,0
        la $t2,bin
        #add $t2,$t2,124
            lop:    
            div $t1,$t1,2
        mflo $v0
        sw $v0,($t2) #right here
        add $t2,$t2,4
        add $t0,$t0,1
        ble $t0,32,lop
        j dnn

            ads:    
            la $a0,spc
    li $v0,4
    syscall
    j back

            dnn: 
        la $t0,bin
        li $t3,1
        la $a0,pr2
        li $v0,4
        syscall
        add $t0,$t0,124
            lp2:
        lw $t1,($t0)
        sub $t0,$t0,4
        add $t3,$t3,1
        move $a0,$t1
        li $v0,5
        syscall
        div $t4,$t3,4
        mflo $t4
        ble $t4,0,ads
            back:   
            ble $t3,33,lp2

        li $v0,10
        syscall

        .data
            prompt: .asciiz "Enter decimal: "
            spc:    .asciiz " "
            pr2:    .asciiz "\nbinary value:\n"
            bin:    .space 128

РЕДАГУВАТИ: Я зробив деякі зміни, як зараз, всі додатки є 'addi' і '.align 2' поставляється після .data також в симуляторі спаму (PCSpim) я помітив щось цікаве:

   [0x00400020]        0x3c011001  lui $1, 4097 [bin]              ; 15: la $t2,bin
   [0x00400024]        0x342a0022  ori $10, $1, 34 [bin]
   [0x00400028]        0x34010002  ori $1, $0, 2                   ; 17: div $t1,$t1,2
   [0x0040002c]        0x0121001a  div $9, $1
   [0x00400030]        0x00004812  mflo $9
   [0x00400034]        0x00001012  mflo $2                         ; 18: mflo $v0
   [0x00400038]        0xad420000  sw $2, 0($10)                   ; 19: sw $v0,($t2)

чому MFLO робиться двічі?

0
Це має багато помилок. Виправте інші помилки, щоб ми могли спробувати це ... І визначити, який симулятор ви використовуєте.
додано Автор m0skit0, джерело
@ Іван Так. Я спробував це так, що нічого не робить.
додано Автор jason dancks, джерело
@ m0skito Я використовував симулятор spim, хоча я хотів би написати код, як це повинно бути на справжній угоді. що робити додатково з чим завгодно написана програма, як я звичайно пишу програми, за винятком частини mflo та масиву. Які ще помилки?
додано Автор jason dancks, джерело
Чи говорить це одне і те ж, якщо ви зміните його на sw $ v0, 0 ($ t2) ?
додано Автор Ivan, джерело
Також не слід додавати ваші додатки?
додано Автор Ivan, джерело
Ах, я думаю, додати можна використовувати найближчі значення відповідно до MIP. Це досить непарний вибір рішення в специфікації, якщо ви запитаєте мене. Також, коли я запустив вашу програму в MIP, я отримав таку помилку: Помилка в asdfsf.asm рядок 20: Виняток виконання Runtime на 0x00400038: адреса магазину не вирівняна на межі слова 0x10010022 . Лінія - це ваша рядок sw .
додано Автор Ivan, джерело
Схоже, що мітка bin: не вирівняна на межі слова. Вам потрібна директива .align 2 перед bin:
додано Автор markgz, джерело

1 Відповіді

mflo is done twice because the DIV pseudo instruction does it and you're doing it explicitly right after.

Ви можете просто зробити:

    div $v0,$t1,2
1
додано