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
CSDL FUNCTIONCSDL FUNCTION par Matthieu MEZIL
Dans mon post précédent , j'ai utilisé une CSDL Function afin de générer une requête SQL avec un DateDiff utilisant la date courante sur la BD à partir d'une requête LINQ. Dans le cadre de ce post , vous avez probablement remarqué que dans le cadre de plu...
Cliquez pour lire la suite de l'article par Matthieu MEZIL LINQ TO ENTITIESLINQ TO ENTITIES par Matthieu MEZIL
Cette semaine je suis à Montréal en tant que speaker sur Entity Framework pour l'évènement confoo . J'en profite pour remercier les organisateurs de cet évènement de m'avoir fait confiance et Access-IT de m'avoir permis d'y participer. En parallèle, j'ai ...
Cliquez pour lire la suite de l'article par Matthieu MEZIL FAIRE APPARAITRE L'ONGLET 'DéVELOPPEUR' DANS OFFICE 2010FAIRE APPARAITRE L'ONGLET 'DéVELOPPEUR' DANS OFFICE 2010 par neodante
La nouvelle interface d'Office 2010 à amener quelques modifications par rapport à celle de 2007. Certes mineures, ces modifications ont fait disparaître la case à cocher de l'onglet 'Développeur' en première page du panneau du 'bouton Office' (dans Office...
Cliquez pour lire la suite de l'article par neodante [ASTUCE] PATCH POUR MICROSOFT FORUMS NNTP BRIDGE V1[ASTUCE] PATCH POUR MICROSOFT FORUMS NNTP BRIDGE V1 par pierre
Si vous avez téléchargé comme moi Microsoft Forums NNTP Bridge V1 avant le 11 mars 2010 (voir [Astuce] Disponibilité de Microsoft Forum NNTP Bridge Version 1.0), un problème de date localisée pour les non anglais était présent. Un patch est disponibl...
Cliquez pour lire la suite de l'article par pierre PB LORS DE L'INSTALLATION SHAREPOINT 2010.PB LORS DE L'INSTALLATION SHAREPOINT 2010. par Patrick Guimonet
Lors de l'installation de SharePoint 2010, j'ai rencontré un problème de plantage à l'étape 5 du configuration Wizard. Ca se termine sur cet écran : Et en analysant le fichier de journalisation, on remarque vers la fin des 15000 et quelques lign...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Logiciels
Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods Konvertor (4.00)KONVERTOR (4.00)Le logiciel est un gestionnaire multimedia affichant, jouant et convertissant plus de 2000 format... Cliquez pour télécharger Konvertor
|