¿Por qué este código no se escribió de una manera mucho más simple?

8

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. Muestra cómo encender la luz exterior y apagar la 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 de código:

SETB P2.2
CLR P2.5

¿Qué hay de malo en eso?

    
pregunta İlker Demirel

5 respuestas

11

Tienes razón en que parece que el código que muestra es tonto. 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 no es posible algo como SETB P2.2.

Aún estableciendo el bit CY en 1, luego ORinging algo es simplemente tonto. Lo mismo ocurre con la configuración del bit CY en 0, luego ANDing algo en él. Claramente, el bit CY se puede copiar directamente en un bit pin de E / S, ya que el código hace eso. A lo sumo, esto debería ser 4 instrucciones, ciertamente no 6.

    
respondido por el Olin Lathrop
9

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á el mismo efecto que el original, excepto que se ejecutará más rápido. Ejecutar "ORL C, P2.2" cuando se configura el acarreo no tendrá ningún efecto observable excepto para desperdiciar cierto número de ciclos (dos ciclos de CPU que totalizan 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 está claro el acarreo. Aunque puede haber algunos tipos de procesadores en los que una solicitud para leer algunas ubicaciones de E / S tendría algún efecto observable, no creo que ningún procesador de estilo 8051 haya tenido tal comportamiento para las ubicaciones de E / S direccionables por bit, mucho Menos para los bits de P2.

Quizás el propósito del código era demostrar las instrucciones ORL C,bit y ANL C,bit , pero esto parece un ejemplo extraño para demostrarlas.

    
respondido por el supercat
6

Es probable que el código de ensamblaje dado sea generado por el compilador. Es la versión no optimizada de las siguientes declaraciones en C, donde P2_2 y P2_5 son los objetos direccionables a bits:

P2_2 |= 1;
P2_5 &= 0;

Esto puede parecer equivalente a P2_2 = 1; y P2_5 = 0; , pero no lo es si los registros de direcciones de 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 garantiza que realmente ocurran efectos secundarios por leer o escribir el registro.

Aunque no conozco ningún registro direccionable por bit de 8051 con efectos secundarios, un compilador no puede asumir que no hay o no habrá uno.

    
respondido por el D Krueger
3

La diferencia real entre estos puede ser sutil.

En su respuesta simplificada, la lógica es leer el puerto, establecer o borrar el valor del bit y luego volver a escribirlo en el puerto. Tenga en cuenta que todo el puerto podría ser reescrito aquí.

Por otra parte, la solución utiliza la instrucción de bit MOV que puede funcionar de una manera bastante diferente.

Sin entrar en los detalles de la parte en particular que se usa aquí, es difícil determinar si existe una diferencia o si importa.

O podría ser simplemente que el instructor decidió hacerte pensar ... que es, después de todo, su verdadero trabajo.

    
respondido por el Trevor_G
0

La única respuesta es que el procesador no admite instrucciones de 1 bit directamente. Sin embargo, cuando se usa el bit de acarreo, sabe que solo se está manipulando un bit.

    
respondido por el Guill

Lea otras preguntas en las etiquetas