Accueil > > > CALCULATRICE POUR PC EN ASSEMBLEUR
CALCULATRICE POUR PC EN ASSEMBLEUR
Information sur la source
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
- .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
.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...
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
[FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE SECOND JOURTECHDAYS PARIS 2012 : PLEINIèRE SECOND JOUR par ROMELARD Fabrice
Après une première journée dédiée aux développeurs, cette seconde journée est dédiée au monde des entreprises et de ses applications. Ainsi, cette pleinière est dédiée à faire un 360 de l'évolution des applications Business aux demandes ac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|