J'ai rencontré une question en travaillant sur le langage d'assemblage. Voici la question:
Supposons que le bit P2.2 est utilisé pour contrôler une lumière extérieure et le bit P2.5 une lumière à l'intérieur d'un bâtiment. Montrez comment allumer la lumière extérieure et éteindre celle intérieure.
Solution proposée:
SETB C ; CY = 1
ORL C, P2.2 ; CY = P2.2 ORed w/ CY
MOV P2.2, C ; turn it on if not on
CLR C ; CY = 0
ANL C, P2.5 ; CY = P2.5 ANDed w/P2.5
MOV P2.5,C ; turn it off if not off
J'avais juste l'impression que cela ferait exactement le même travail pour coder:
SETB P2.2
CLR P2.5
Qu'est-ce qui ne va pas avec ça?
microprocessor
assembly
8051
İlker Demirel
la source
la source
Réponses:
Vous avez raison en ce qu'il semble que le code que vous montrez est idiot. Peut-être que la machine sur laquelle cela fonctionne ne peut pas effectuer d'opérations immédiates pour définir des bits sur les ports d'E / S, et c'est pourquoi quelque chose comme SETB P2.2 n'est pas possible.
Régler toujours le bit CY à 1, puis ORing quoi que ce soit dedans est tout simplement stupide. Il en va de même pour mettre le bit CY à 0, puis y ajouter quelque chose. Il est clair que le bit CY peut être directement copié dans un bit de broche d'E / S, car le code le fait. Au plus, cela devrait être 4 instructions, certainement pas 6.
la source
SETB bit
etCLR bit
instructions que pourMOV bit,C
. De plus, tout en utilisant des instructions discrètes pour lire un port d'E / S, mettre à jour la valeur et la réécrire produira une sémantique différente de l'utilisation des instructions de lecture-modification-écriture, les instructions au niveau du bit utilisent toutes la même sémantique de lecture-modification-écriture sur I / O ports.Le code est presque certainement pour un processeur utilisant le jeu d'instructions 8051. Sur ce processeur, la variation de code que vous donnez aurait le même effet que l'original, sauf qu'elle s'exécuterait plus rapidement. L'exécution de "ORL C, P2.2" lorsque le report est défini n'aura aucun effet observable sauf pour gaspiller un certain nombre de cycles (deux cycles CPU totalisant 24 cycles d'horloge sur un 8051 si je me souviens bien; probablement un nombre différent sur certaines autres variantes) . De même avec l'exécution de "ANL C, P2.5" lorsque le report est clair. Bien qu'il puisse y avoir certains types de processeur où une demande de lecture de certains emplacements d'E / S aurait un effet observable, je ne pense pas qu'un processeur de style 8051 ait jamais eu un tel comportement pour les emplacements d'E / S adressables par bit, beaucoup moins pour les bits de P2.
Peut-être que le but du code était de démontrer les instructions
ORL C,bit
etANL C,bit
, mais cela semble être un exemple étrange pour les démontrer.la source
Le code d'assembly donné est probablement généré par le compilateur. Il s'agit de la version non optimisée des instructions C suivantes, où
P2_2
etP2_5
sont les objets adressables par bit:Cela peut sembler équivalent à
P2_2 = 1;
etP2_5 = 0;
, mais ce n'est pas le cas si les registres adressables par bit sont des objets volatils. Une opération de lecture-modification-écriture sur un objet volatil doit effectuer la lecture et l'écriture, dans cet ordre. Cela garantit que tous les effets secondaires de la lecture ou de l'écriture du registre se produisent réellement.Bien que je ne connaisse aucun registre adressable par 8051 bits avec des effets secondaires, un compilateur ne peut pas supposer qu'il n'y en a pas ou ne le sera jamais.
la source
La vraie différence entre ceux-ci peut être subtile.
Dans votre réponse simplifiée, la logique est de lire le port, de définir ou d'effacer la valeur du bit, puis de la réécrire sur le port. Notez que le port entier pourrait être réécrit ici.
La solution, d'autre part, utilise l'instruction de bit MOV qui peut fonctionner d'une manière assez différente.
Sans entrer dans les détails de la pièce particulière utilisée ici, il est difficile de déterminer s'il y a une différence ou si elle est importante.
Ou ce pourrait être juste que l'instructeur a décidé de vous faire réfléchir ... ce qui est après tout ... son vrai travail.
la source
La seule réponse est que le processeur ne prend pas directement en charge les instructions 1 bit. Cependant, lorsque le bit de retenue est utilisé, il sait qu'il ne s'agit que d'un bit en cours de manipulation.
la source