2013-11-21 10 views
5

Bounty: +50 punti reputazione per chiunque fornisca il codice per far funzionare questa subroutine con numeri negativi.itoa per i numeri negativi?

Ho scritto un programma MIPS per convertire Fahrenheit in Celsius. Apre la propria finestra di output (cioè UART) e visualizza correttamente il valore in Celsius. Fa tutto questo mentre effettua chiamate da C all'assemblaggio e viceversa. L'intero codice pubblicato di seguito.

Sto lottando per farlo funzionare con numeri negativi. Solo disegnando un vuoto adesso per qualche motivo. Come posso cambiare la mia funzione itoa per scrivere questo controllo?

Qualcuno ha qualche idea su come ottenere questo funzionamento con valori negativi in ​​MIPS?

.ent itoa 
itoa: 
    // putting the stack frame together 
    addiu sp, sp, -16 
    sw fp, 12(sp) 
    move fp, sp 
    sw a0, 16(fp) 
    sw a1, 20(fp) 
    sw s0, 4(fp) 
    sw s1, 0(sp) 

    // there is no divide immediate, so using s1 
    li s1, 10 

    itoa_div_begin: 
     divu a0, s1 
     mfhi s0 
     mflo a0 

     addiu s0, s0, 0x30 
     addiu sp, sp, -1 
     sb s0, 0(sp) 

     beq a0, zero, itoa_div_done 
     nop 

     j  itoa_div_begin 
     nop 

    itoa_div_done: 
    itoa_copy_begin: 
     lb s0, 0(sp) 
     sb s0, 0(a1) 

     addiu sp, sp, 1 
     subu s1, sp, fp 
     addiu a1, a1, 1 

     beq s1, zero, itoa_copy_done 
     nop 

     j  itoa_copy_begin 
     nop 

    itoa_copy_done: 
    li s0, 0 
    sb s0, 0(a1) 

    move v0, a1 

    lw a0, 16(fp) 
    lw a1, 20(fp) 
    lw s0, 4(fp) 
    lw s1, 0(fp) 
    // stack frame 
    move sp, fp 
    lw fp, 12(sp) 
    addiu sp, sp, 16 

    jr ra 
    nop 

.end itoa 
+2

non puoi darti il ​​codice, ma devi controllare msb per la negatività e quindi ripristinare il complemento a 2 http://en.wikipedia.org/wiki/Two% 27s_complement, e da ciò si ottiene il valore assoluto del numero intero negativo. in breve, se msb è 1 -> scrivi '-' e usa il complemento del 2 ripristinato per itoa – x4rf41

+0

Sono confuso, il problema è solo con la tua funzione itoa? –

+1

@KonradLindenbach Sì. Le mie scuse per aver pubblicato l'intero programma. Da allora è stato modificato solo per la subroutine itoa. – MrPickle5

risposta

6

È possibile includere questo nel codice, proprio sopra itoa_div_begin:

li t0, 0x40000000 
and t0, a0, t0 
beqz t0, itoa_div_begin 
nop 
li t0, 45 
sb t0, 0(a1) 
addi a1, a1, 1 
not a0, a0 
addi a0, a0, 1 

itoa_div_begin: 

Che cosa è fa:

  • Verificare la presenza di un numero negativo controllando se il MSB è 1
  • In tal caso, inserire - nel risultato e
  • Utilizzare il t wo complemento del numero per il resto della funzione