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.