Me encontré con una pregunta mientras trabajaba en lenguaje ensamblador. Aquí está la pregunta:
Suponga que el bit P2.2 se usa para controlar una luz exterior y el bit P2.5 una luz dentro de un edificio. Muestre cómo encender la luz exterior y apagar la luz interior.
Solución dada:
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
Sentí que haría el mismo trabajo codificar:
SETB P2.2
CLR P2.5
¿Qué está mal con eso?
microprocessor
assembly
8051
İlker Demirel
fuente
fuente
Respuestas:
Tiene razón en que parece que el código que muestra es una tontería. Quizás cualquier máquina en la que se ejecute no pueda realizar operaciones inmediatas para establecer bits en los puertos de E / S, y es por eso que algo como SETB P2.2 no es posible.
Aún estableciendo el bit CY en 1, entonces ORing cualquier cosa en él es simplemente tonto. Lo mismo se aplica para establecer el bit CY en 0, y luego ponerle algo AND. Claramente, el bit CY se puede copiar directamente en un bit pin de E / S, ya que el código lo hace. A lo sumo, esto debería ser 4 instrucciones, ciertamente no 6.
fuente
SETB bit
eCLR bit
instrucciones paraMOV bit,C
. Además, al usar instrucciones discretas para leer un puerto de E / S, actualizar el valor y volver a escribirlo producirá una semántica diferente del uso de las instrucciones de lectura-modificación-escritura, todas las instrucciones bit a bit usan la misma semántica de lectura-modificación-escritura en I / O puertos.El código es casi seguro para un procesador que utiliza el conjunto de instrucciones 8051. En ese procesador, la variación de código que proporcione tendría el mismo efecto que el original, excepto que funcionaría más rápido. Ejecutar "ORL C, P2.2" cuando se establece el transporte no tendrá ningún efecto observable, excepto para desperdiciar cierto número de ciclos (dos ciclos de CPU que suman 24 ciclos de reloj en un 8051 si recuerdo correctamente; probablemente un número diferente en algunas otras variantes) . Del mismo modo con la ejecución de "ANL C, P2.5" cuando el transporte es claro. Aunque puede haber algunos tipos de procesadores en los que una solicitud de lectura de algunas ubicaciones de E / S tendría algún efecto observable, no creo que ningún procesador de estilo 8051 haya tenido ese comportamiento en ninguna ubicación de E / S direccionable por bit, mucho menos para bits de P2.
Quizás el propósito del código era demostrar las instrucciones
ORL C,bit
yANL C,bit
, pero este parece un ejemplo extraño para demostrarlas.fuente
El código de ensamblado dado es probablemente generado por el compilador. Es la versión no optimizada de las siguientes instrucciones C, donde
P2_2
yP2_5
son los objetos direccionables en bits:Esto puede parecer equivalente a
P2_2 = 1;
yP2_5 = 0;
, pero no lo es si los registros direccionables en bits son objetos volátiles. Una operación de lectura-modificación-escritura en un objeto volátil debe realizar la lectura y la escritura, en ese orden. Esto asegura que ocurran los efectos secundarios de leer o escribir el registro.Aunque no conozco ningún registro direccionable de bits 8051 con efectos secundarios, un compilador no puede asumir que no existe o que nunca lo habrá.
fuente
La verdadera diferencia entre estos puede ser sutil.
En su respuesta simplificada, la lógica es leer el puerto, establecer o borrar el valor de bit y luego volver a escribirlo en el puerto. Tenga en cuenta que todo el puerto podría reescribirse aquí.
La solución, por otro lado, utiliza la instrucción de bit MOV que puede operar de una manera bastante diferente.
Sin entrar en los detalles de la parte particular utilizada aquí, es difícil determinar si hay una diferencia o si es importante.
O podría ser que el instructor decidió hacerte pensar ... que es, después de todo ... su verdadero trabajo.
fuente
La única respuesta es que el procesador no admite instrucciones de 1 bit directamente. Sin embargo, cuando se utiliza el bit de acarreo, sabe que solo se está manipulando un bit.
fuente