Calculatrice pour pc en assembleur

Description

Ce code correspond à une calculatrice classique de type PC.Elle permet entre autres les opérations d'addition,de soustraction,multiplication et des calculs de racines carrées et factorielle sont en cours de construction..

Ce code s'adresse à des personnes voulant s'initier au langage machine (à un niveau relativement simple ici) pour comprendre la notion de registre et comment s'organise un menu en machine (l'équivalent du main en langage C).

Pour les néophytes, pour pouvoir utiliser cette source vous devez posséder le logiciel PCSpim(pas besoin de l'installer !!).Une fois le logiciel ouvert vous effectuez les opérations suivantes : File -> Open -> nom_du_fichier_a_ouvrir.s(je tiens a préciser que le logiciel ne charge que des fichiers dont l'extension est .s et non .txt donc en cas de fichier .txt veillez à changer son extension).
Une fois le fichier chargé, vous cliquez sur F5 (Go) et vous validez par OK pour le message qui va suivre....Vous pouvez maintenant utiliser le programme.Il faudra sysématiquement réaliser cette opération lorsque vous voulez utiliser un programme en assembleur sous PSCpim.
P.S:si lors de l'utilisation de mon programme, une erreur survient ou que vous ne pouvez plus agir sur la console pas de panique....vous allez dans Simulator->Break -> Cliquez sur Non.....A ce moment là l'éxécution du programme est arrêté et vous pouvez à nouveau recharger le fichier.s pour une nouvelle utilisation du programme...

Source / Exemple :


.data

str1 : 	.asciiz "\n\n\t8:Menu Principal"
str2 :	.asciiz "\n\t9:Quitter"
str3 :	.asciiz	"\nLa somme des 2 nombres donne : "
str4 :  .asciiz "\nLa difference des 2 nombres donne : "
str5 :	.asciiz "\nLe produit des 2 nombres donne : "
str6 :	.asciiz "\nLa division des 2 nombres donne : "
str7 : 	.asciiz "\nMerci d'avoir utilise ma calculatrice..."
str8 :	.asciiz "\n\n\tVeuillez saisir votre choix : "
str9 : 	.asciiz "\nLe carre de votre nombre est : "
str10 : .asciiz "\n\tOption en cours de construction..."
erreur_saisie : .asciiz"\n\tSaisie ne correspondant pas a un des choix proposes..."
ch3 :  	.asciiz "\n\nProgramme de gestion de fonctions mathématiques\n\n"
ch4 :  	.asciiz "\n\n\tFonctions à calculer : \n\n\t1)Somme de 2 nombres\n\t2)Différence de 2 nombres\n\t3)Produit de 2 nombres\n\t4)Division de 2 nombres\n\t5)Carré d'un nombre\n\t6)Racine carrée d'un nombre\n\t7)Calcul du factorielle d'un nombre (n!)\n\t\n\n\t\t\t\tYouss Prod.\n\n\tVeuillez saisir votre choix : "
ch12 : 	.asciiz "\nMerci d'avoir utilisé mon programme...\n"
saisie_nombre :	.asciiz	"\nVeuillez saisir la valeur de x : "
saisie_nombre1:	.asciiz	"\nVeuillez saisir la valeur de y : "

zero :  .float 0.0

	choix1 : .byte 1
	choix2 : .byte 2
	choix3 : .byte 3
	choix4 : .byte 4
	choix5 : .byte 5
	choix6 : .byte 6
	choix7 : .byte 7
	choix8 : .byte 8
	choix9 : .byte 9

	.text
	.globl main

main : 
	
menu :		
	lwc1 $f1,zero
	lwc1 $f2,zero
	lwc1 $f3,zero

	li $a3,0
	li $t1,0
	li $t2,0
	li $t3,0

	li	$v0,4		
	la	$a0,ch4 	 # On "fait pointer" le registre a0 sur la zone mémoire ch4
	syscall			 # On affiche ch4

	li	$v0,5	
	syscall			 # On saisit la valeur entiere

	move $a3,$v0		 # On transfère le contenu du registre v0 dans le registre a3

	lb $t1,choix1
	beq $t1,$a3,saisie_secu  # Si l'utilisateur tape 1 , on appelle la fonction saisie

	lb $t1,choix2
	beq $t1,$a3,saisie_secu  # Si l'utilisateur tape 2 , on appelle la fonction saisie

	lb $t1,choix3
	beq $t1,$a3,saisie_secu  # Si l'utilisateur tape 3 , on appelle la fonction saisie

	lb $t1,choix4
	beq $t1,$a3,saisie_secu  # Si l'utilisateur tape 4 , on appelle la fonction saisie

	lb $t1,choix5
	beq $t1,$a3,saisie_secu2 # Si l'utilisateur tape 5 , on appelle la fonction saisie
	
	lb $t1,choix6
	beq $t1,$a3,option 	 # Si l'utilisateur tape 6 , on appelle la fonction saisie
	
	lb $t1,choix7
	beq $t1,$a3,option 	 # Si l'utilisateur tape 7 , on appelle la fonction saisie

	lb $t1,choix8
	beq $t1,$a3,fin 	 # Si l'utilisateur tape 8 , on quitte

	jal erreur_utilisateur   # Si l'utilisateur tape un choix non propose par le programme

	jal menu		 # Puis retour au menu

#--------------------------********Saisie des nombres********-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
saisie_secu : 
		li	$v0,4		
		la	$a0,saisie_nombre # On "fait pointer" le registre a0 sur la zone mémoire str1
		syscall			  # On affiche saisie_nombre

		li	$v0,6	
		syscall			# On saisit la valeur float
	
		mov.s	$f1,$f0		# On transfère le contenu du registre f0 dans le registre f1

saisie_secu1 : 
		li	$v0,4		# On "fait pointer" le registre a0 sur la zone mémoire str2
		la	$a0,saisie_nombre1	
		syscall			# On affiche saisie_nombre1

		li	$v0,6	
		syscall			# On saisit la valeur float

		mov.s 	$f2,$f0		# On transfère le contenu du registre f0 dans le registre f2

saisie_secu2 : 
		li	$v0,4		
		la	$a0,saisie_nombre # On "fait pointer" le registre a0 sur la zone mémoire str1
		syscall			  # On affiche saisie_nombre

		li	$v0,6	
		syscall			# On saisit la valeur float
	
		mov.s	$f1,$f0		# On transfère le contenu du registre f0 dans le registre f1
		
		jal carre
#---------------------------********Erreur dans la saisie des choix*****-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
erreur_utilisateur :
		li	$v0,4		# On "fait pointer" le registre a0 sur la zone mémoire str2
		la	$a0,erreur_saisie	
		syscall			# On affiche saisie_nombre1

#--------------------------********Branchements aux fonctions********---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
		lb $t2,choix1
		beq $t1,$t2,somme	# Si l'utilisateur a tape 1 , on appelle la fonction somme

		lb $t2,choix2
		beq $t1,$t2,difference	# Si l'utilisateur a tape 2 , on appelle la fonction difference

		lb $t2,choix3		# Si l'utilisateur a tape 3 , on appelle la fonction produit
		beq $t1,$t2,produit

		lb $t2,choix4		# Si l'utilisateur a tape 3 , on appelle la fonction division
		beq $t1,$t2,division

#--------------------------********Choix apres calcul********-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
saisie_apres : 
		li	$v0,4		# On "fait pointer" le registre a0 sur la zone mémoire str2
		la	$a0,str1	
		syscall			# On affiche str1
		
		li	$v0,4		# On "fait pointer" le registre a0 sur la zone mémoire str2
		la	$a0,str2	
		syscall			# On affiche str2

		li	$v0,4		# On "fait pointer" le registre a0 sur la zone mémoire str2
		la	$a0,str8	
		syscall			# On affiche str8
		
		li	$v0,5	
		syscall			# On saisit la valeur entiere

		move $a3,$v0		# On transfère le contenu du registre v0 dans le registre a3

		lb $t3,choix8
		beq $t3,$a3,menu	# Si l'utilisateur a tape 1 , on affiche le menu principal

		lb $t3,choix9
		beq $t3,$a3,fin		# Si l'utilisateur a tape 1 , on quitte le programme	

#--------------------------********Saisie des options en construction********-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
option : 
	li	$v0,4		# On "fait pointer" le registre a0 sur la zone mémoire str2
	la	$a0,str10	
	syscall			# On affiche str10
	
	jal saisie_apres
#--------------------------********Fonctions********--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#

somme : # Fonction somme #

	add.s	$f3,$f2,$f1	# Effectue la somme x + y
	
	li	$v0,4		
	la	$a0,str3 	# On "fait pointer" le registre a0 sur la zone mémoire str3
	syscall			# On affiche str3

	mov.s	$f12,$f3	# On transfère le contenu du registre f3 dans le registre f12
	li	$v0,2		
	syscall			# On affiche la valeur de x + y

	jal saisie_apres

difference : # Fonction difference #

	sub.s	$f3,$f1,$f2	# Effectue la somme x - y
	
	li	$v0,4		
	la	$a0,str4 	# On "fait pointer" le registre a0 sur la zone mémoire str3
	syscall			# On affiche str3

	mov.s	$f12,$f3	# On transfère le contenu du registre f3 dans le registre f12
	li	$v0,2		
	syscall			# On affiche la valeur de x - y

	jal saisie_apres

produit : # Fonction produit #

	mul.s	$f3,$f1,$f2	# Effectue la somme x * y
	
	li	$v0,4		
	la	$a0,str5 	# On "fait pointer" le registre a0 sur la zone mémoire str3
	syscall			# On affiche str3

	mov.s	$f12,$f3	# On transfère le contenu du registre f3 dans le registre f12
	li	$v0,2		
	syscall			# On affiche la valeur de x * y

	jal saisie_apres

division : # Fonction division #

	div.s	$f3,$f1,$f2	# Effectue la somme x / y
	
	li	$v0,4		
	la	$a0,str6 	# On "fait pointer" le registre a0 sur la zone mémoire str3
	syscall			# On affiche str6

	mov.s	$f12,$f3	# On transfère le contenu du registre f3 dans le registre f12
	li	$v0,2		
	syscall			# On affiche la valeur de x / y
	
	jal saisie_apres

carre :  # Fonction carre #
	
	mul.s	$f3,$f1,$f1	# Effectue le produit x * x
	
	li	$v0,4		
	la	$a0,str9 	# On "fait pointer" le registre a0 sur la zone mémoire str3
	syscall			# On affiche str9

	mov.s	$f12,$f3	# On transfère le contenu du registre f3 dans le registre f12
	li	$v0,2		
	syscall			# On affiche la valeur de x * x
	
	jal saisie_apres

fin :	li	$v0,4		
	la	$a0,str7	# On "fait pointer" le registre a0 sur la zone mémoire str3
	syscall			# On affiche str6

	li	$v0,10	
	syscall			# Fin du programme

Conclusion :


Ce code mérite de faire plus de fonctions mais j'y travaille dessus pour offrir plus de fonctionnalités...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.