Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185

    [ASSEMBLY MIPS]Problema su case selection

    Ciao a tutti,
    mi rivolgo a voi perche non so piů dove sbattere la testa.
    Devo scrivere del codice che ti stampa un menů di 4 scelte e ogni scelta fa un azione diversa.
    Credevo di riuscire a fare la stampa del menů e ad entrare dentro le varie scelte ma evidentemente non č cosi. Vi posto il codice che ho scritto io,
    [spoiler]
    codice:
    # Title: Progetto2				
    # Author: Dennis Aleandro Boanini			
    # Description: 
    ################# Data segment #####################
    .data
    	str1:	.asciiz "richiede l’inserimento di un intero, visualizza a console se č un numero pari o dispari e ritorna al menů di scelta;\n\n"    
        str2:	.asciiz "richiede l’inserimento di due interi, visualizza a console se la loro somma č un numero pari o dispari e ritorna al menů di scelta;\n\n"    
        str3:	.asciiz "richiede l’inserimento di tre interi, ne visualizza su console il valore minimo e ritorna al menů di scelta;\n\n"    
    	str4:	.asciiz "visualizza un messaggio di uscita e termina il programma. \n\n"
        inserimento:	.asciiz "Inserisci un numero da 1 a 3\n\n"
        errore:	.asciiz "Il numero inserito non era compreso tra 1 e 3 \n\n"
        fine:	.asciiz "End of Program \n\n"
    	jump_table: .space 16 # jump table array a 4 word che verra' instanziata dal main con gli indirizzi delle label che chiameranno le corrispondenti procedure
    ################# Code segment #####################
    .text
    .globl main
    
    main:
    	  la $s1, jump_table
    	  la $t0, juno	  
    	  sw $t0, 0($s1)
     	  la $t0, jdue  
    	  sw $t0, 4($s1)
    	  la $t0, jtre	  
    	  sw $t0, 8($s1)
    	  la $t0, jquattro
    	  sw $t0, 12($s1)
    	  
    menu:
    #Stampa del menu di selezione
    	la $a0, str1	
    	li $v0, 4 
    	syscall
    	la $a0, str2
    	li $v0, 4 
    	syscall	
    	la $a0, str3
    	li $v0, 4 
    	syscall
    	la $a0, str4
    	li $v0, 4 
    	syscall
    	  
    choice:
    # scelta della procedura o dell'uscita
    	  li $v0, 4  # $v0 =codice della print_string 
          la $a0, inserimento # $a0 =  indirizzo della stringa 
    	  syscall # stampa la stringa prompt
    	  
    	  # legge la scelta
          li $v0, 5
    	  syscall
    	  move $s0, $v0   # $s0=scelta 1, 2, 3 o 4
    	  
    	  sle  $t0, $s0, $zero
    	  bne  $t0, $zero, choice_err
    	  li   $t0,4
    	  sle  $t0, $s0, $t0
    	  beq  $t0, $zero, choice_err
    
    branch_case:
    		addi $s0, $s0, -1 # tolgo 1 da scelta perche' prima azione nella jump table (in posizione 0) corrisponde alla prima scelta del case
    	    add $t0, $s0, $s0 
    	    add $t0, $t0, $t0
    	    add $t0, $t0, $s1
    	    lw $t0, 0($t0) 
    
    	    jr $t0 # salto all'indirizzo calcolato
    	  
    # prima case action
    juno: 
    	la $a0, str1
    	li $v0, 4
    	syscall
    
    	j menu	# Ritorna al menu di selezione
    
    # seconda case action
    jdue: 
    	la $a0, str2
    	li $v0, 4
    	syscall
    
    	j menu # esce
    
    # terza case action
    jtre: 
    	la $a0, str3
    	li $v0, 4
    	syscall
    	   
    	j menu # esce
    	
    # quarta case che esce dal programma visualizzando un messaggio di uscita
    jquattro: 
    	la $a0, fine
    	li $v0, 4
    	syscall
    	   
    	j exit		# Salta all'etichetta exit e termina l'esecuzione del codice
    	  
    choice_err: 
          li $v0, 4  
          la $a0, errore 
          syscall # stampa la stringa errore		
    	  				  		  		  	  
          j choice # ritorna alla richiesta di inserimento di un numero tra 1 e 3 
    	  
    exit:		
    	li $v0, 10 
        syscall
    [/spoiler]
    e l'errore che mi da č: Exception occured at PC=0x00400034
    Unaligned address in store: 0x1001020b
    Ma non capisco cosa ho scritto che non va.
    Spero tanto mi potete aiutare. Grazie mille.

    PS: Uso QtSpim come simulatore

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Allinea alla dword la zona di memoria per la jump table. Aggiungi

    .align 4

    prima di

    jump_table: .space 16
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185
    Grazie mille oregon, adesso funziona.
    Ma mi potresti spiegare, per favore, a cosa serve il comando .align 4?
    Grazie ancora mille

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185
    Ormai continuo qui, se poi devo aprire un altro post, ditemelo che lo apro subito..
    Ho terminato il secondo esercizio di progetto, ma mi da errore. Cioč faccio la scelta, esegue il codice perfettamente e ritorna al menu di selezione, ma qui, quando vado a inserire una scelta mi da errore.
    Vi posto tutto il codice dell'esercizio

    codice:
    # Title: Progetto2				
    # Author: Dennis Aleandro Boanini			
    # Description: 
    ################# Data segment generale ###########
    .data
    	str1:	.asciiz "\n\n1 - Richiede l’inserimento di un intero, visualizza a console se č un numero pari o dispari e ritorna al menů di scelta;\n\n"    
        str2:	.asciiz "2 - Richiede l’inserimento di due interi, visualizza a console se la loro somma č un numero pari o dispari e ritorna al menů di scelta;\n\n"    
        str3:	.asciiz "3 - Richiede l’inserimento di tre interi, ne visualizza su console il valore minimo e ritorna al menů di scelta;\n\n"    
    	str4:	.asciiz "4 - Visualizza un messaggio di uscita e termina il programma. \n\n"
    	numero1:	.asciiz "\n\nInserisci primo numero --> "
    	numero2:	.asciiz "Inserisci secondo numero --> "
    	numero3:	.asciiz "Inserisci terzo numero --> "
        inserimento:	.asciiz "Inserisci un numero da 1 a 4 --> "
        errore:	.asciiz "Il numero inserito non era compreso tra 1 e 4 \n\n"
        fine:	.asciiz "End of Program \n\n"
    	.align 4
    	jump_table: .space 16 # jump table array a 4 word che verra' instanziata dal main con gli indirizzi delle label che chiameranno le corrispondenti procedure
    ################# Data segment 3 case ##############
    	msg:		.asciiz "\nIl minimo fra i tre numeri č --> "
    ################# Data segment 2 case ##############
    	somma:		.asciiz "\nLa somma dei due numeri inseriti č --> "
    	pari:		.asciiz "\nIl numero č pari!"
    	dispari:	.asciiz "\nIl numero inserito č dispari!"
    ################# Code segment #####################
    .text
    .globl main
    
    main:
    	  la $s1, jump_table
    	  la $t0, juno	  
    	  sw $t0, 0($s1)
     	  la $t0, jdue  
    	  sw $t0, 4($s1)
    	  la $t0, jtre	  
    	  sw $t0, 8($s1)
    	  la $t0, jquattro
    	  sw $t0, 12($s1)
    	  
    menu:
    #Stampa del menu di selezione
    	la $a0, str1	
    	li $v0, 4 
    	syscall
    	la $a0, str2
    	li $v0, 4 
    	syscall	
    	la $a0, str3
    	li $v0, 4 
    	syscall
    	la $a0, str4
    	li $v0, 4 
    	syscall
    	  
    choice:
    # scelta della procedura o dell'uscita
    	  la $a0, inserimento
    	  li $v0, 4
    	  syscall
    	  
          li $v0, 5
    	  syscall
    	  move $s0, $v0
    	  
    	  sle  $t0, $s0, $zero
    	  bne  $t0, $zero, choice_err
    	  li   $t0,4
    	  sle  $t0, $s0, $t0
    	  beq  $t0, $zero, choice_err
    
    branch_case:
    		addi $s0, $s0, -1 # tolgo 1 da scelta perche' prima azione nella jump table (in posizione 0) corrisponde alla prima scelta del case
    	    add $t0, $s0, $s0 
    	    add $t0, $t0, $t0
    	    add $t0, $t0, $s1
    	    lw $t0, 0($t0) 
    
    	    jr $t0
    	  
    # prima case action
    juno: 
    	li $t3, 2
    	
    	la $a0, numero1
    	li $v0, 4
    	syscall
    	li $v0, 5
    	syscall
    	move $t0, $v0
    	
    	div $t0, $t3
    	mfhi $s1
    	
    	beq $s1, $zero, Pari
    	la $a0, dispari
    	li $v0, 4
    	syscall
    
    	j menu
    
    # seconda case action
    jdue: 
    		li $t3, 2
    		
    		la $a0, numero1
    		li $v0, 4
    		syscall
    		li $v0, 5
    		syscall
    		move $t1, $v0
    		
    		la $a0, numero2
    		li $v0, 4
    		syscall
    		li $v0, 5
    		syscall
    		move $t2, $v0
    		
    		add $t0, $t1, $t2
    		
    		la $a0, somma
    		li $v0, 4
    		syscall
    		move $a0, $t0
    		li $v0, 1
    		syscall
    		
    		div $t0, $t3
    		mfhi $s1
    		
    		beq $s1, $zero, Pari
    		la $a0, dispari
    		li $v0, 4
    		syscall
    		j menu
    	Pari:
    		la $a0, pari
    		li $v0, 4
    		syscall
    		j menu
    
    # terza case action
    jtre: 
    		la $a0, numero1
    		li $v0, 4
    		syscall
    		li $v0, 5
    		syscall																																																																										
    		move $t1, $v0
    		la $a0, numero2
    		li $v0, 4
    		syscall
    		li $v0, 5
    		syscall
    		move $t2, $v0
    		la $a0, numero3
    		li $v0, 4
    		syscall
    		li $v0, 5
    		syscall
    		move $t3, $v0
    		
    		blt $t1, $t2, control1
    		
    		blt $t2, $t3, minSecondoNumero
    		j minTerzoNumero
    	
    	control1:
    		blt $t1, $t3, minPrimoNumero
    		j minTerzoNumero
    			
    		blt $t2, $t3, Controllo3
    		j minTerzoNumero
    
    		j minPrimoNumero
    			
    	minPrimoNumero:
    		la $a0, msg
    		li $v0, 4
    		syscall
    		move $a0, $t1
    		li $v0, 1
    		syscall
    		j menu
    	minSecondoNumero:
    		la $a0, msg
    		li $v0, 4
    		syscall
    		move $a0, $t2
    		li $v0, 1
    		syscall
    		j menu
    	minTerzoNumero:
    		la $a0, msg
    		li $v0, 4
    		syscall
    		move $a0, $t3
    		li $v0, 1
    		syscall
    		j menu
    	
    # quarta case che esce dal programma visualizzando un messaggio di uscita
    jquattro: 
    	la $a0, fine
    	li $v0, 4
    	syscall
    	   
    	j exit
    	  
    choice_err: 
          li $v0, 4  
          la $a0, errore 
          syscall	
    	  				  		  		  	  
          j choice
    	  
    exit:		
    	li $v0, 10 
        syscall

    PS: Ma c'č la possibilitŕ di mettere lo spoiler? altrimenti occupo un monte di spazio...

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ti perdi il valore di s1 per strada e quindi, quando torni al menu, il salto avviene ad indirizzi sbagliati. Assicurati di assegnare s1 in questa riga prima di calcolare il salto

    branch_case:
    la $s1, jump_table
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185
    Quindi dici che mi conviene fare j main, e quindi tornare all'inizio del programma, anziche tornare al menů?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No, non ho detto affatto questo. Ti ho consigliato solo di inserire quella linea indicata ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185
    si infatti, ho scritto una cosa, ma ne ho fatta un'altra, mettendo questa
    la $s1, jump_table
    come prima riga nella branch_case..
    Grazie mille oregon, sei stato molto di aiuto..

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 © 2025 vBulletin Solutions, Inc. All rights reserved.