Calculatrice pour pc en assembleur

Soyez le premier à donner votre avis sur cette source.

Vue 21 668 fois - Téléchargée 1 142 fois

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

Ajouter un commentaire

Commentaires

cs_AlexMAN
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1 -
On dirait un desassembly made in vc++..pkoi prefere tu programmer en "langage machine" pluto ken ASM ? (ptet est ce pareil, mais ca m'etonnerait, vu les mnemoniques...).
L'asm est dur, mais pour moi, certainement plus claire que ca.Je te critique pas, c'est juste mon point de vue :)

++
GeneralDragon
Messages postés
4
Date d'inscription
samedi 15 mars 2003
Statut
Membre
Dernière intervention
25 août 2004
-
Lol, mais c'est du code MIPS ca ! c'est pas du code x86, je pige pas ce que ca viens faire ici ???
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13 -
AlexMAN> pas du tout du 'code machine', ce MIPS est un pseudo assembleur s'executant dans un interpreteur.

Pourquoi ne pas faire directement du vrai ASM pour PC ?
cs_Je sais pas
Messages postés
8
Date d'inscription
jeudi 22 juillet 2004
Statut
Membre
Dernière intervention
20 décembre 2006
-
Bonjour tout le monde oui c'est effectivement du MIPS mais moi je ne connais pas le langage ASM...donc n'en soyez pas étonnés.
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13 -
OK alors faut t'y mettre, ça te liberera de PCSpim.

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.