¿Es este un lenguaje ensamblador?

70

En mi infancia solía programar en un MK-61 Soviet calculadora. Tenía cuatro registros operativos (X, Y, Z, T) y 15 registros de almacenamiento. Un programa podría tener 105 pasos.

Como lo recuerdo, tenía comandos como:

  • Intercambiar registros X e Y
  • registros de desplazamiento (Z a T, Y a Z, X a Y)
  • Copia del registro de almacenamiento (1..15) a X
  • Copia de X al registro de almacenamiento (1..15)
  • Si X < 0 luego ve al paso del programa ##
  • Realice la operación (+, -, *, /) usando los valores de X e Y y ponga el resultado en X

¿Este comando establece un lenguaje ensamblador? ¿Tenía una idea básica de lenguajes de ensamblaje al usar este dispositivo?

Resultaqueesalgoquesellama "programación de pulsación de tecla" .

Dato curioso: una calculadora similar (como esta, pero con memoria independiente de energía) se usó como hardware de respaldo para los cálculos de la trayectoria de la misión espacial en 1988. :-)

    
pregunta defhlt 13.07.2012 - 00:00

7 respuestas

13

Este no es un lenguaje ensamblador, es un lenguaje de máquina.

El lenguaje de máquina es cualquier cosa que físicamente signifique algo para la máquina. En el caso de las computadoras de bolsillo, son las pulsaciones de teclas, codificadas en números en la máquina. No da más información sobre esta máquina Electronika MK61 , así que le daré el ejemplo de TI-57 : el lenguaje de máquina utilizó el número de la clave dada como columna en las decenas y Línea en las unidades. Así, por ejemplo, un programa que incrementaría la memoria 8 sería:

33 8  57 1 58 23

Esto es lenguaje de máquina: es lo que la máquina interpreta directamente.

El lenguaje ensamblador sería el texto legible por humanos :

RCL 8 
+
1
=
STO 8

Para transformar este texto en la secuencia de códigos de máquina, necesitarías un ensamblador , que puede ser un programa, o un humano que traduciría ese texto a la secuencia de números.

La confusión se hace a menudo, porque a menudo hay una traducción bastante directa del lenguaje ensamblador al lenguaje de máquina, pero no siempre es una traducción totalmente directa: los ensambladores de macros tienen macros poderosas que pueden hacer mucho trabajo en el ensamblador y genere muchas instrucciones en lenguaje de máquina a partir de una sola instrucción de ensamblaje. La mera traducción de direcciones simbólicas puede implicar cambiar el código de operación de las instrucciones de bifurcación (por ejemplo, al cambiar de direccionamiento relativo corto a direccionamiento relativo largo o absoluto), por lo que no siempre es tan directo como parece.

    
respondido por el Pascal Bourguignon 13.07.2012 - 11:29
36

Yo diría que la respuesta a ambas partes de su pregunta es no: los comandos de esta calculadora no son como un lenguaje ensamblador, y la programación de esta calculadora es diferente de la programación en lenguaje ensamblador.

El "lenguaje" en el que está programada esta calculadora es de un nivel bastante bajo, pero aún así representa una abstracción en la parte superior de las construcciones de nivel inferior que no son visibles para usted como programador. Estoy adivinando un poco, pero por su descripción y por mirar el teclado (y compararlo con calculadoras de aspecto similar de Hewlett Packard o Texas Instruments de finales de los 70 y principios de los 80) diría que cada programa "paso "no solo podría ser una operación simple como" agregar "o" intercambiar X & Y "sino también operaciones más complejas como trigonometría, exponenciación, logaritmos, etc. Cada uno de estos pasos probablemente se implementa como una rutina interna microcodificada. Es probable que el microcódigo esté programado en lenguaje ensamblador, pero no creo que sea visible para la programación ordinaria de la calculadora en el nivel que has descrito.

Como han descrito otros, el lenguaje ensamblador generalmente está en una correspondencia muy cercana (si no es 1: 1) con las instalaciones de la máquina subyacente. Yo diría que la programación en lenguaje ensamblador incluye las siguientes características que probablemente no estén presentes en la programación de esta calculadora.

  • Las operaciones incluyen operaciones de nivel de nivel inferior como bitwise AND, OR, XOR, shifting; Aritmética de punto flotante de enteros y (tal vez), en una variedad de tamaños de datos (por ejemplo, precisión simple o doble); carga / almacenamiento de una variedad de tamaños (byte, halfword, word, etc.).

  • Las operaciones de nivel superior (trigonométricas, logaritmos) suelen ser llamadas a subrutinas, no instrucciones. Hay algunas excepciones, como el DEC VAX que tenía una instrucción de evaluación polinómica. [Editar: OP señaló que x87 también tiene funciones trigonométricas.]

  • El esquema de direccionamiento de la máquina está expuesto. Si el espacio de direcciones está segmentado, tiene que cargar una dirección base en un registro y luego el código de dirección o los datos relativos a ese registro. Incluso con un espacio de direcciones plano, es consciente de las direcciones y la aritmética de direcciones. Normalmente, los ensambladores permitirán a los programadores usar etiquetas para indicar direcciones. Pero si una dirección está en un segmento diferente, es posible que tenga que cargar un registro de segmento antes de poder acceder a ella.

  • La alineación de la memoria está expuesta. Por ejemplo, en muchas máquinas una palabra de 4 bytes solo se puede cargar o almacenar en direcciones que son múltiplos de 4 bytes.

  • La representación de datos está expuesta. Por lo general, los ensambladores proporcionan alguna forma de especificar datos numéricos en hexadecimal, octal, decimal, punto flotante y, ocasionalmente, datos de caracteres.

  • La especialización de los registros está expuesta. Algunas arquitecturas permiten operaciones de enteros y direcciones en algunos registros, pero de coma flotante solo en otros, o permiten direccionamiento solo en relación con ciertos registros. A veces hay registros especializados, como aquellos con bits de estado o condición que no se pueden usar para direccionamiento o aritmética.

  • Las convenciones de llamada a subrutinas están expuestas. Los argumentos y los valores de retorno se pueden pasar en registros o se pueden enviar y extraer de una pila. (Esta pila suele ser una región de la memoria dirigida por un registro especial de punteros de pila, no un conjunto fijo como X Y Z y T.)

  • Es posible que tenga que ser consciente de cómo interactuar con el sistema operativo, o si no hay uno, cómo tratar con las instalaciones de hardware de bajo nivel. Con un sistema operativo tienes que cargar argumentos en los registros (o la pila) y atrapar en el núcleo. Sin un sistema operativo, es probable que tenga que lidiar con interrupciones y temporizadores.

Mi recuerdo de la programación de ensamblajes es que es muy, muy doloroso. Creo que programar esta calculadora es fácil y divertido en comparación. (Lo siento.)

    
respondido por el Stuart Marks 13.07.2012 - 04:11
25

Sí, eso definitivamente me suena como un lenguaje ensamblador.

Es difícil decir si realmente el ensamblaje es solo de la descripción, porque la definición, un lenguaje cuyos comandos se asignan 1: 1 con el código de máquina de la plataforma de destino, es difícil determine sin conocer el código de la máquina en sí, pero eso suena como la forma en que ASM funciona en otras plataformas.

    
respondido por el Mason Wheeler 13.07.2012 - 00:14
11

Ciertamente tiene algunas similitudes con un lenguaje ensamblador, pero voy a argumentar que eso no es lo que realmente es.

En un lenguaje ensamblador, la mayoría de las operaciones asignan 1 a 1 a las instrucciones de la CPU. Hay algunas excepciones, como las macros y las pseudo-operaciones (como, por ejemplo, una instrucción BORRAR que realmente XORs un registro consigo mismo); el punto real es que un programa de ensamblaje determina exactamente las instrucciones de la CPU que se generarán. (Esa es la diferencia fundamental entre un lenguaje ensamblador y un lenguaje de nivel superior como C; en este último, los programas especifican comportamiento ).

La calculadora, sin duda, tiene una CPU, pero dudo que las instrucciones individuales de la CPU se refieran a los "registros" de X, Y, Z y T, o realicen operaciones de alto nivel como x y o sin (o ПРГ , ¡lo que sea que signifique!).

En cambio, estoy seguro de que muchas o la mayoría de las operaciones visibles se realizan como llamadas de subrutinas. Y para cada operación ejecutada, debe haber una cantidad significativa de trabajo adicional realizado para mostrar el resultado.

Puede pensar en las operaciones visibles como un lenguaje ensamblador para una máquina virtual de alto nivel, pero esa máquina virtual se implementa a través de algo como un intérprete que se ejecuta en la CPU real.

Sin embargo, diría que la respuesta a la segunda parte de su pregunta:

  

¿Tenía una idea básica de los lenguajes de ensamblaje con este dispositivo?

es sí.

    
respondido por el Keith Thompson 13.07.2012 - 02:42
9

Así es, el fragmento de código publicado se parece al lenguaje de ensamblaje . La conversión correcta de este código definiría la versión.

Editar: tiene algún idioma específico para este dispositivo, pero no es ensamblaje.

También se parece a una calculadora hecha por la URSS. ¿Funciona con baterías redondeadas / cable?

    
respondido por el EL Yusubov 13.07.2012 - 00:47
3

Yo diría que estás más cerca de un híbrido de lenguaje ensamblador BASIC, pero realmente depende de la CPU y la arquitectura subyacentes. No es necesario que haya acceso directo a la memoria si no tiene una verdadera RAM de la que hablar. Las operaciones de punto flotante tampoco necesitan estar presentes sin una FPU.

Creo que una prueba simple sería una operación de suma en un número de punto flotante y un entero. La mayoría de los lenguajes de programación de nivel superior aceptan ADD 2.5, 7 y devuelven 9.5. Sin embargo, los lenguajes de ensamblaje diferirían la salida en función de la instrucción llamada y en función de la representación numérica subyacente en binario. La mayoría de los lenguajes de ensamblaje requieren que se use una instrucción diferente según el uso de operaciones de coma flotante frente a enteros. Una excepción a esto podría ser algún tipo de formato de punto fijo.

    
respondido por el Peter Smith 13.07.2012 - 04:35
3

Las calculadoras de notación polaca inversa (RPN) fueron clásicas. No, aunque las designaciones de registro parecen ser lenguaje ensamblador no lo fue. Los cálculos se realizaron traduciendo del formato algebraico a la pila. Los números utilizados se insertaron en la pila y las operaciones se realizaron en el último apilado contra el siguiente a los últimos valores apilados.

Podría "rotar" la pila para mover los valores ya que el valor mostrado era un miembro de la pila. Los resultados podrían intercambiarse o apilarse según sea necesario para realizar un cálculo casi complejo. Si entiendes el hardware de la pila y el lenguaje ensamblador, esta calculadora fue trivial de aprender ya que su paradigma era muy similar.

    
respondido por el Chip 13.07.2012 - 16:52

Lea otras preguntas en las etiquetas

Comentarios Recientes

¿Qué significa 'montaje'? (Todo el código en este video clip está en C #, Windows u Objective-C.) Algo suena familiar, ¿no? Las máquinas son paralelas, una vez más. A medida que se requieren más memoria para tantos procesos como la memoria de su host, las tareas paralelas deben escalar esa memoria de un puñado a mayores alturas. A medida que esa memoria aumenta, surgen más requisitos de comunicación entre procesos, pero ¿qué significa esto para el mundo del lenguaje funcional? ¿Significa que podemos resolver... Lee mas