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...
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.