Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    Assembler - errore logico ricorsione

    Salve ragazzi, premetto che in quanto a ricorsione ho esperienza quasi zero ed il mio rapporto con lei non è buono (rotfl)
    Tuttavia essendo un futuro informatico farò del mio meglio per conquistare questa complicata(solo all'inizio a quanto si dice) ragazza (good) (good)

    Il testo dell'esercizio è questo:
    Tramite la tecnica della ricorsione scrivere una funzione che stampa gli elementi dell array {1,2,3,4,5,6,7,8,9,10}
    Ipotizzo che l'effetto dell'errore è che viene ripetuto una volta in piu del dovuto la parte di codice tra le righe 32-37
    Infatti nell'output compare sepre quell'1 di troppo alla fine
    codice:
    123456789101
    ps: non fate caso che vengono stampati tutti attaccati, i ricamini all aspetto dell'output li farò dopo!
    il codice è questo:
    codice:
    .data
    	V: .word 11,22,33
    	n: .word 3
    	
    .text
    	main:
    	lw $a0, V
    	lw $a1, n
    	addi $a1, $a1, -1		# l'indice per l'array va da 0 a 9, ecco perchè decrementa di 1
    	sll $a1, $a1, 2			# moltiplica per 4 per allinearsi con l'indirizzi che vanno di 4 in 4
    	jal print_elem			# chiama funzione prima per la prima volta
    	
    	move $a0, $v0			# sposta in a0 il risultato ritornato dalla funzione
    	li $v0, 1			# carica il codice per stampare un int
    	syscall				# stampa intero
    	
      exit:	li $v0, 10
    	syscall
    	
    	print_elem:
    		beqz $a1, base
    		
    		lw $t0, V($a1)		# in t0 ora c'è l'elemento dell'array alla posizione V($a1)
    		addi $sp, $sp, -12	# preapra 3 posti nello stack
    		sw $t0, 8($sp)
    		sw $a1, 4($sp)
    		sw $ra, 0($sp)	
    		addi $a1, $a1, -4	# decremento l'indice
    		
    		jal print_elem		# passo ricorsivo
    		
    		lw $ra, 0($sp)
    		lw $a1, 4($sp)
    		lw $a0, 8($sp)
    		syscall			# stampa elemento salvato in a0
    		addi $sp, $sp, 12	# metto apposto lo stack pointer
    		jr $ra
    	
    	base:
    		lw $a0, V($a1)		# carico in a0 il primo elemento
    		li $v0, 1
    		syscall			# stampo primo elemento
    		jr $ra
    ps: forse avrei potuto risolverlo senza utilizzare lo stack, ma io VOLEVO esercitarmi usando lo stack

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Nn ti riesco a seguire, in pratica cn print_elem vorresti visualizzare ad un ad un gli elementi di V. Soltanto che poi alla fine ti viene stampato un 1 che nn dovrebbe esserci?
    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.