¿Por qué en algunas instrucciones el orden de registro es diferente entre el código de máquina y el código de ensamblaje para MIPS?

1

Por ejemplo, en el código de ensamblaje tenemos / add rd rs rt / pero en el código de máquina tenemos / opcode rs rt rd /, donde el registro de destino está en la última posición. ¿Por qué los MIPS organizan su código así? Sé que en código de máquina el rd se coloca en la última posición porque algunas instrucciones no lo tienen, así que ¿por qué no escriben el código de ensamblaje como add rs rt rd?

    
pregunta fgg1991

2 respuestas

4

La elección del orden de bits en lenguaje de máquina (la representación binaria) se realiza por motivos técnicos. En cierto sentido, es totalmente arbitrario, porque solo la aplicación del ensamblador y el decodificador de instrucciones de la CPU necesitan saberlo. El rendimiento (velocidad) del ensamblador no es totalmente importante, por lo que la razón dominante para un ordenamiento de bits en particular es la facilidad con la que se implementa en hardware.

La elección del orden de los operandos en lenguaje ensamblador se hace teniendo en cuenta la legibilidad. La mayoría de los lenguajes de programación funcionan de derecha a izquierda, con la posición más a la izquierda para el destino. Este es un argumento para poner primero el registro de destino, que es como se hace en la mayoría de los lenguajes ensambladores (pero, por desgracia, no en todos, o peor: no para todas las instrucciones).

    
respondido por el Wouter van Ooijen
1

El lenguaje ensamblador es una abstracción deliberada, diseñada, de código de máquina. No hay ningún requisito para tener una relación específica entre el código de máquina y el ensamblador.

Además, la codificación de diferentes grupos de instrucciones de la máquina está destinada a ayudar a la implementación del hardware. En procesadores más recientes (por ejemplo, a partir de la década de 1980), las instrucciones de la máquina se pueden expresar en un ensamblador de maneras muy diferentes a las instrucciones subyacentes. Por ejemplo, el registro de movimiento de MIPS para registrar se puede expresar en código de máquina como "Agregar RS a 0 poniendo el resultado en RD". En este caso, puede que no haya ninguna instrucción de movimiento en el código de máquina del procesador, la instrucción del ensamblador es solo una conveniencia para ayudar al programador del ensamblador (o al escritor del compilador que trata de entender cómo dirigir ese conjunto de instrucciones).

Por lo tanto, la razón de ser del ensamblador podría ser que se lea de manera coherente; quizás el ensamblador refleje idiomas de nivel superior, por ejemplo,
RD = RS op RT.

En MIPS, las instrucciones de la máquina están codificadas para intentar asegurar que un parámetro de instrucción específico, digamos el destino de la operación, RD, esté siempre en la misma posición de bit dentro de la instrucción. Puede haber otros campos que necesiten usar los mismos bits que otros parámetros, por ejemplo, la instrucción de máquina para una rama podría reinterpretar los bits utilizados en otras instrucciones para un registro de origen, como el desplazamiento de la rama.

Por lo tanto, los diseñadores de conjuntos de instrucciones eligen las posiciones de bit para el código de instrucción y los parámetros para hacer que su hardware sea más simple, más barato o más rápido.

El diseñador del lenguaje del ensamblador puede usar diferentes restricciones, generalmente para ayudar al programador a escribir código, o para hacer que el ensamblador sea más simple, barato o rápido.

La abstracción entre los dos puede ser muy útil; Reflejar la diferente codificación de instrucciones de la máquina (es decir, la posición de los bits para los parámetros) puede hacer que el lenguaje ensamblador sea más difícil de aprender o usar de manera confiable.

    
respondido por el gbulmer

Lea otras preguntas en las etiquetas