¿Cómo puede ADD ser una instrucción de 1 byte?

2

Estoy aprendiendo 8051 codificación. Encontré las instrucciones de estas formas ADD R7 y ADD A, R5 . Ahora, dado que ADD es una operación matemática, que siempre debería tener lugar en el acumulador, ¿no es redundante el comando ADD A, R5 ?

Y, en segundo lugar, ¿cómo pueden ser una instrucción de 1 byte? Quiero decir, debería haber 2 bytes, uno para el opcode que dice que es una operación de adición, y el segundo byte tendrá el valor de byte que se agregará al acumulador. ¿Cómo se pueden comprimir ambos en un byte?

    
pregunta SexyBeast

5 respuestas

5

enlace

Tienes razón en que ADD A, R5 es redundante. Probablemente esto se haga para mayor claridad en el código, para que sea un poco más legible para los humanos.

AGREGAR es una instrucción de un byte o de dos bytes, dependiendo de lo que se agrega a qué. Si está agregando una constante, o el valor en una dirección arbitraria, entonces ADD es una instrucción de dos bytes. Es solo una instrucción de un byte si hay suficientes bits en el código de operación además de los que indican ADD para indicar otra cosa útil. En este caso, hay dos variaciones: agregar uno de los ocho registros, o agregar lo que se encuentra en una dirección en particular (con esa dirección almacenada en uno de los dos registros).

    
respondido por el Stephen Collings
2

El conjunto de instrucciones 8x51 tiene 16 instrucciones de la forma "hacer algo con Rn" donde n = [0..7]; A cada combinación de operación y número de registro se le asigna un código de operación diferente; Se utilizan un total de 128 códigos de operación para tales fines. Algunas de las operaciones operan solo en Rn, y algunas solo en Rn y el acumulador. En cualquier caso, el código de operación especifica todo lo que se necesita decir sobre la instrucción. Algunas otras operaciones requieren más información (por ejemplo, "cargar Rn con alguna constante", "cargar Rn con datos de alguna dirección especificada directamente", "disminuir Rn y derivar hacia adelante o hacia atrás una cierta distancia si no es cero", o "comparar Rn con datos en alguna dirección especificada y bifurque hacia adelante o hacia atrás una cierta distancia si no es igual "). En esos casos, se requerirán uno o dos bytes adicionales después del código de operación.

    
respondido por el supercat
2

Si verifica los códigos de operación para AGREGAR en un aquí

Verás que ADD R5 tiene el código de operación 0x2D.

Agrega el valor en R5 al Acumulador y almacena el resultado en el Acumulador. Solo se necesita un byte para codificar esto

Mientras AGREGUE #xx donde xx es datos inmediatos, los códigos de operación 0x24 xx necesitan dos bytes.

    
respondido por el Warren Hill
1

Consulte el manual de hardware de la familia 8051 de Atmel en enlace . Incluye una lista detallada de los patrones de bits para todas las instrucciones 8051.

    
respondido por el Peter Bennett
0

ADD A, R5 no es una instrucción; Es un fragmento del lenguaje ensamblador. El lenguaje ensamblador no es lenguaje de máquina. Contiene una sintaxis que no corresponde a nada en el lenguaje de máquina directamente, como pseudo-operaciones, nombres de registros alternativos y demás.

Incluso si alguna instrucción usa siempre un registro fijo como un operando de origen o destino, o ambos, aún pueden aparecer explícitamente en la sintaxis del lenguaje ensamblador.

En cuanto a "¿cómo puede ser algo una operación de un byte"? Puede utilizar tan poco como un bit para codificar un símbolo. Eche un vistazo a un método de compresión llamado Huffman Coding . La codificación de Huffman nos permite tomar un alfabeto (o, más generalmente, un diccionario de algunos símbolos, que son cadenas de bits, o lo que sea) y asignarlos a una tabla de códigos de longitud variable, el más corto de los cuales es solo un bit.

No es que la codificación de Huffman se use comúnmente para los conjuntos de instrucciones, pero el principio está ahí: hay formas de usar longitudes de bits variables para codificar símbolos importantes en menos espacio, al costo de alargar los códigos para otros.

Por ejemplo, si tiene un campo de opcode de 8 bytes, podría reservar, digamos dos bits para clasificar los opcodes en cuatro categorías. Los 6 bits restantes son entonces categoría específica. Tres de las categorías (por ejemplo) podrían usar los 6 bits restantes para codificar varios tipos de instrucciones, de modo que, por ejemplo, cualquier cosa que comience con 00 , 01 o 10 es algún tipo de código de operación regular. Pero una de las cuatro categorías, por ejemplo, 11 , podría significar "agregar inmediatamente al acumulador". Los seis bits restantes (y sus 64 posibilidades) codificarían el valor a agregar, entre 0 y 63. El valor 0 (agregar 0 al acumulador) podría servir como una instrucción no operativa, de modo que en el lenguaje ensamblador ADD #0, A y NOOP podrían ser dos grafías para exactamente el mismo patrón de bits (devolviéndonos a los puntos anteriores). O podría tomarse el valor 0 para designar 65, extendiendo el rango de adición (y así NOOP sería otra cosa, y ADD #0, A sería rechazado por el ensamblador como fuera de rango).

Efectivamente, podría considerar que esta situación tiene 64 sabores de instrucción "agregar inmediatos al acumulador" diferentes, con un código de operación para cada valor que se agregará, o puede considerar eso como un código de operación especial de dos bits dentro del byte de código de operación con un campo inmediato.

    
respondido por el Kaz

Lea otras preguntas en las etiquetas