Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercice d'assembleur MIPS (QtSpim)

additions, soustractions de vecteurs

    29 juin 2022 à 8:54:04

    Bonjour, 
    Voici un exercice que j'essaye d'étudier mais je bloque pour la procédure de calcul. Le début pas de problèmes pour initialiser, lire, appeler le calcule, ecrire... 
    Mais je bloque sur la partie de comment créer des vecteurs, et les appeler dans les calculs. 
    Si j'avais la réponse je pourrai réaliser le reste du code pour faire les différents calculs de vecteurs, pouvez-vous m'aider ?
    Je vous remercie par avance et bonne journée à vous.
    Réalisez un programme assembleur MIPS qui calcule l'addition ou la soustraction de deux vecteurs spécifiés comme données. La dimension des vecteurs doit également être spécifiée comme donnée. L'algorithme est spécifié en pseudo-code :
    inicio
    leer (elección)
    llamar_a cálculo
    escribir (r)
    fin
    procedimiento cálculo
    según_sea elección hacer
    0: r <-- x + y
    1: r <-- x - y
    si_no: r <-- (0,0, ... ,0)
    fin_según
    fin_procedimiento
    Ici la structure according_to_sea est équivalente à l'instruction C switch, read (x) indique d'entrer dans le valeur de x par le clavier et write (r) indique l'écriture de toutes les composantes du vecteur r par la console.
    Les opérations "x+y" et "x-y" correspondent à l'addition et à la soustraction de vecteurs. La routine de calcul doit utiliser une procédure itérative.
    Exécutez le programme dans le simulateur SPIM et vérifiez qu'il fonctionne correctement dans les différents cas possibles, tant pour les vecteurs de dimension 4 que pour ceux de dimension 5.

    -
    Edité par Lily_boo 29 juin 2022 à 9:12:44

    • Partager sur Facebook
    • Partager sur Twitter
      29 juin 2022 à 8:57:01

      Bonjour, Merci de supprimer toutes les lettres en capitales de votre titre.

      Déplacement vers un forum plus approprié

      Le sujet est déplacé de la section HTML / CSS vers la section Autres langages (VBA, Ruby,...)

      Majuscules abusives

      L'écriture en majuscules est considérée comme une parole criée et diminue autant la lisibilité du texte que sa compréhension. Les majuscules abusives sont donc interdites aussi bien dans les titres que dans les messages.

      Mauvais titre

      Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

      Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

      De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

      Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

      Merci de modifier votre titre. Pour cela, éditez le premier message de votre sujet.

      (titre originel : EXERCICES D'ASSEMBLEUR MIPS (QtSpim))

      -
      Edité par AbcAbc6 29 juin 2022 à 8:57:50

      • Partager sur Facebook
      • Partager sur Twitter
        29 juin 2022 à 12:01:19

        de ce que j'ai pu trouver, un vecteur est un peu l'équivalent d'un tableau

        voir l'exemple display array de la page 69 de https://facultystaff.richmond.edu/~dszajda/classes/cs301/Fall_2020/labs/MIPS_assembly_language_using_QTSpim.pdf 

        -
        Edité par umfred 29 juin 2022 à 12:01:27

        • Partager sur Facebook
        • Partager sur Twitter
          5 juillet 2022 à 17:08:14

          Merci, j'ai pu trouver une solution, je mets ci-dessous un exo similaire, qui additionne et soustrait 2 vecteurs :

          # Assembleur MIPS
          # Exercice 10
          	.data
          #size: 	.word 4
          x:	.word 1, 2, 5, 7, 1, 2, 3, 4, 5, 6
          y: 	.word 2, 4, 1, 9, 6, 5, 4, 3, 2, 1
          resultado: 	.word 0x0, 0x0, 0x0, 0x0
          
          mensaje:        .asciiz "Calculs 2 vecteurs 2022\n"
          	        .align 2
          error:		.asciiz "Taille max du vector"
          		.align 2
          comas:	        .asciiz ","
          	        .align 2
          paren_ab:	.asciiz "("
          	        .align 2
          paren_ce:	.asciiz ")"
          
          	.text
          	.globl main
          main:
          	la $a0, mensaje			# menssage de inici
          	li $v0, 4
          	syscall
          
          	la $s0, x 			# $s0 <-- direction base de array x
          	la $s1, y 			# $s1 <-- direction base de array y
          
          	li $v0, 5			# lire la taille du vector <10
          	syscall
          	move $s2, $v0			# muevo a s2 el valor instroducido del tamaño del array
          	bgt $s2, 10, Error		# comparo el valor del vector introducido por teclado con 10. Si es mayor saltamos a error
          
          	la $s3, resultado 		# $s3 <-- dirección base del array resultado
          	la $s4, 0			# $s4 <-- indice puesto a 0
          
          	li $v0, 5			# leo por consola la operacion
          	syscall
          	move $t1, $v0		        # $t1 <-- paso a t1 el valor introducido
          
          	la $a0, paren_ab 		# pongo un (
          	li $v0, 4
          	syscall
          
                  sub $t5, $a2, 1		        # Para las comas usare t5 porque a la ultima posicion no se le pone coma, por eso hago valor introducido-1
          jal Calculo				# Procedimiento
          
          Terminar:
          	la $a0, paren_ce		# pongo un )
          	li $v0, 4
          	syscall
          
          	li $v0, 10			#cerrar el programa
          	syscall
          
          Error:
          	la $a0, error     		# mostrara el mensaje de error
          	li $v0, 4
          	syscall
          
          	li $v0, 10			#cerrar el programa
          	syscall
          
          #---------------------------------------------Fin del programa------------------------------------------------------#
          
          Calculo:
          	bne $t1, 0, RESTA		# Si $t1 != 0 --> CASE 1 RESTA
          
          SUMA: #additions
          	beq $s4, $s2, Retornar	        # sale cuando i = n
          	lw $t7, 0($s0) 		        # $t7 <-- s0[i] irá pasando los valores de las componentes del array x
          	lw $t6, 0($s1)		        # $t6 <-- s1[i] irá pasando los valores de las componentes del array y
          
          	add $a0, $t6, $t7		# sum <-- t7[i] + t6[i]
          
          	li $v0, 1			# muestro el resultado parciales de las sumas por consola
          	syscall
          
          
          	blt $s4, $t5, coma_suma	        # si i<t5 pongo coma
          volvercomaS:
          
          	addi $s0, $s0, 4 		# incrementa puntero x
          	addi $s1, $s1, 4		# incrementa puntero y
          	addi $s4, $s4, 1		# incrementa el indice
          
          	b SUMA			        # bucle
          
          RESTA: #soustractions
          	bne $t1, 1, Retornar		# Si $t1 != 1 --> Retorno ya, porque no he introducido ni un 0 (suma) ni un 1 (resta)
          
          	beq $s4, $s2, Retornar	        # sale cuando i = n
          	lw $t7, 0($s0) 		        # $t7 <-- s0[i] irá pasando los valores de las componentes del array x
          	lw $t6, 0($s1)		        # $t6 <-- s1[i] irá pasando los valores de las componentes del array y
          
          	sub $a0, $t7, $t6		# sum <-- t7[i] - t6[i]
          
          	li $v0, 1			# muestro el resultado parciales de las sumas por consola
          	syscall
          
          	blt $s4, $t5, coma_resta	# si i<4 pongo coma
          volvercomaR:
          
          	addi $s0, $s0, 4 		# incrementa puntero x
          	addi $s1, $s1, 4		# incrementa puntero y
          	addi $s4, $s4, 1		# incrementa el indice
          
          	b RESTA			        # bucle
          
          #---------------------------------------Fin de la ejecución del procedimiento---------------------------------------------------#
          
          coma_suma:
          	la $a0, comas		# pongo una coma
          	li $v0, 4
          	syscall
          	b volvercomaS
          
          coma_resta:
          	la $a0, comas		# pongo una coma
          	li $v0, 4
          	syscall
          	b volvercomaR
          
          Retornar: jal $ra	        # salir del procedimiento al programa principal
          
          
          #-------------------------------#
          



          • Partager sur Facebook
          • Partager sur Twitter

          Exercice d'assembleur MIPS (QtSpim)

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown