Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    13

    Assembly MIPS

    Ciao a tutti!
    E' il mio primo post nel forum!
    Vi presento il mio problema:
    sto studiando per sostenere l'esame di Programmazione in Assembly (RISC MIPS); nello specifico sto scrivendo un piccolo programmino che calcoli la velocità e l'accelerazione di un veicolo in base allo spazio (in metri) e al tempo (secondi) forniti dall'utente.
    Ora effettuando l'equivalenza che trasformi i secondi in ore, mi trovo dinnanzi ad una divisione con opportuno resto, il resto è contenuto nel registro LO del pannello dei registri di Spim, giusto?
    Ecco come mi devo comportare con il resto secondo voi? Più in generale come posso, in seguito ad una divisione, gestire l'approssimazione per eccesso o per difetto del mio risultato?
    Anche di fronte ad una semplice divisione 11:2, com approssimo in assembly a 6 piuttosto che a 5?

    Grazie a tutti!

  2. #2
    Logicamente ti direi "se il resto è maggiore della metà del divisore aggiungi uno al quoziente", poi non ho idea se in assembly MIPS ci sia qualche trucco per fare tutto ciò in maniera compatta...
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Quando fai una divisione (DIV), il risultato va in $LO, il resto in $HI.

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Potresti provare cn le istruzioni SET* altrimenti dovresti scrivere del codice un po piu complesso
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    13
    ciao
    ci ho ragionato un pochino sopra sfruttando i vostri preziosi consigli ( vi ringrazio per la disponibilità e la passione con cui avete risposto);
    ed ecco cio' che ho partorito:
    codice:
    ##ALGORITMO DIVISIONE
    
    #regola per arrotondamento: SE IL RESTO E' MAGGIORE DELLA META' DEL DIVISORE, AGGIUNGI UNO
    #AL QUOZIENTE
    
    #$LO:contiene il risultato(quoziente);
    #$HI:contiene il resto
    		.data
    dividendo:	.asciiz "Inserisci dividendo: "
    divisore:	.asciiz "Inserisci divisore: "
    risultato: 	.asciiz "Il risultato è: "
    
    		.text
    	.globl __start
    	.globl arrot
    	.globl exit
    
    __start:				##ACQUISIZIONE DATI
    	li $v0, 4
    	la, $a0, dividendo
    	syscall	
    	li $v0, 5
    	syscall 			#dividendo
    	move $t0, $v0
    	li $v0, 4
    	la, $a0, divisore
    	syscall
    	li $v0, 5
    	syscall				#divisore
    	move $t1, $v0
    	div $s0, $t0, $t1		#quoziente
    
    	mfhi $t9			#copio il resto in $t9
    	div $s1, $t1, 2			#metà del divisore
    	slt $t2, $t9, $s1		#$t2=1 se resto è minore della metà del divisore;0 altrimenti
    	bne $t2, $zero, exit	
    arrot:
    	addi $s0, $s0, 1
    	j exit				#incremento il quoziente di uno 
    
    exit:	
    	li $v0, 4
    	la $a0, risultato
    	syscall
    	move $a0, $s0
    	li $v0, 1
    	syscall
    	li $v0, 10
    	syscall
    Il programma funziona bene su spim, nonostante a volte venga approssimata per eccesso anche una divisione il cui quoziente è del tipo x,4 .
    Ovviamente esisterà un maniera più compatta per esprimere un corretto arrotondamento.
    Mi piacerebbe sentire il parere di qualche utente più esperto.
    Grazie ancora a tutti

  6. #6
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Il j exit sembra essere inutile.
    Per gli Spartani e Sparta usa spartan Il mio github

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    13
    Originariamente inviato da linoma
    Il j exit sembra essere inutile.
    quindi se lo rimuovo non accade nulla perchè le istruzioni restano comunque consequenziali?
    Per il resto, il codice risulta sufficientemente compatto?

    Grazie!

  8. #8
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Forse potresti togliere il branch dopo slt e sommare direttamente $t2 a $s0. Nn emulatore installato nn riesco a testarlo
    Per gli Spartani e Sparta usa spartan Il mio github

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.