Assembleur

Fermé
mia123 - 24 mai 2007 à 12:13
 Marc Rembauville - 24 mai 2007 à 17:06
bonjour; j'ai des questions à poser donc si vous pouvez me répondre svp ; voilà:

On a le fragment de programme suivant en assembleur:

push R0 (empiler)
push R1
prod (multiplier)
push R2
add (additionner)
push R3
prod

avec R0,R1,R2,R3 :des registres.

on nous demande que fait ce programme?

j'ai la réponse qui est la suivante: [R3] * ( [R2] + (R1*R2) ). je l'ai écrit suivant l'ordre de l'empilement ; est ce que c'est juste où je dois écrire comme suit :

( (R0*R1) +[R2] ) * [R3] d'aprés le commencement du programme.

veuillez me répondre svp. et est ce que vous pouvez me donner des sites ayant des programme en assembleur résolus assez simple comme celui que j'ai cité.

merci.

2 réponses

lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
24 mai 2007 à 12:36
bonjour,
Il y a longtemps que je ne pratique plus l'assembleur, toutefois je ne voit pas bien les résultats de cette partie de code
Tu devrais avoir
Push R0, et une adresse mémoire
Push R1, et une adresse mémoire
Prod R0,R1 et comme je connais pas ton assembleur, soit le résultat est dans R0, soit dans un régistre à assigner ou encore dans un régistre Y
idem pour la suite des commandes.
A+
louis
0
Marc Rembauville
24 mai 2007 à 12:45
Bonjour,

Je ne sais pas sur quel CPU tournerait cet element de programme.
Je vais donc supposer un CPU à structure de Pile pour les Instructions 'Prod' et 'Add'.

Ramené à une présentation Mathématique le parenthésage de vos deux formules serait bon.
Les parenthéses représentent bien la temporalité des opérations séquentielles du Programme.
Cependant il y a une erreur d'ecriture dans la premiere.
On devrait avoir (R1*R0) et non (R1*R2).

Si je peux vous aider, n'hesitez pas.

A+
0
bonjour; oui c'est R0 aulieu de R2 mais laquelle des 2 formules est juste? où les 2 sont justes?.
Autre problèmes que je n'arrive pas à résoudre et si vous pouvez m'aider :

EXO1)
Soit le fragment de programme en langage d'aasemblage avec N une adresse mémoire:
FF00 load N
FF03 dec N ...............décrémentation
FF06 eqz FF0F ............branchement conditionnel (à zéro)
FF09 mul N.................multiplication
FF0C jmp FF03............branchement inconditionnel
FF0F end

1) que fait ce programme ? ( comment vous l'avez su)
2) dérouler en détail l'execution des3 première instructions ?

EXO2 )
une machine a des instructions codées sur 24 bits, ses adresses mémoires sont sur 8 bits. A l'aide du code opération expansif, cette machine a des instructions à une adresse et des instructions à deux adresses. Si il y a (n) instructions à 2 adesses, quel est le nombre maximum possible d'instructions à une adresse ?

merci de me répondre svp.
0
Marc Rembauville > mia123
24 mai 2007 à 17:06
Bonjour Suite,
Les 2 Formules semblent justes. Elles sont seulement écrites symétriquement. Comme je le disais dans les 2 cas les parentheses restituent la chronologie des calculs séquentiels.
Je note la difference de [] pour les registres mais je pense que ce n'est qu'une erreur d'ecriture car les [] ici n'ont pas l'air significatifs.

Reponse 2 : (256-N)*256 car le Second Octet peut etre pris comme extension de code operation.

Reponse 1 : Je suppose que l'ACC contient le resultat de toute OPE
Mais ce CPU est mal defini.
En plus ambiguité Adr8Bits et Code FFxx
Mais peut etre differenciation Adr Data et Adr Code
Je considere que traitement Valeurs Absolues
Je ne sais pas a quoi ca peut servir mais :
Resultats apres le 'Mul N'
Si N = 0 --> Ca depend de la taille des Mots Datas.
Si N = 1 --> 0 et on sort
Si N = 2 --> 1 , 0 et on sort
Si N = 3 --> 4 , 9 , 64 , 3669 , overflow pour 16 Bits
Si N = 4 --> 9 , 64 , etc ... Overflow
Si N = 5 --> 16 , 225 , Overflow pour 16 Bits
Suppose que c'est le carre de N qui est decremente pour le carre suivant.
A verifier car la structure des CODOP du CPU est indefinie.
A+ si je ne me suis pas planté
0