En mi infancia solía programar en una calculadora soviética MK-61 . Tenía cuatro registros operativos (X, Y, Z, T) y 15 registros de almacenamiento. Un programa podría tener 105 pasos.
Según recuerdo, tenía comandos como:
- Intercambiar registros X e Y
- Registros de desplazamiento (Z a T, Y a Z, X a Y)
- Copiar del registro de almacenamiento (1..15) a X
- Copiar de X al registro de almacenamiento (1..15)
- Si X <0, vaya al paso del programa ##
- Realice la operación (+, -, *, /) utilizando los valores X e Y y coloque el resultado en X
¿Este comando establece un lenguaje ensamblador? ¿Tenía una idea básica de los lenguajes ensambladores al usar este dispositivo?
Resulta que es algo llamado "programación de pulsaciones de teclas" .
Dato curioso: se utilizó una calculadora similar (como esta, pero con memoria independiente de la energía) como hardware de respaldo para los cálculos de trayectoria de la misión espacial en 1988. :-)
programming-languages
assembly
defhlt
fuente
fuente
Respuestas:
Este no es un lenguaje ensamblador, es un lenguaje de máquina.
El lenguaje de máquina es cualquier cosa que físicamente significa algo para la máquina. En el caso de las computadoras de bolsillo, es presionar teclas, codificadas en números en la máquina. No proporciona más información sobre esta máquina Electronika MK61 , así que daré el ejemplo de la TI-57 : el lenguaje de la máquina utilizó el número de la clave dada como columna en las decenas y líneas en las unidades. Entonces, por ejemplo, un programa que incrementaría la memoria 8 sería:
Esto es lenguaje de máquina: es lo que la máquina interpreta directamente.
El lenguaje ensamblador sería el texto legible por humanos :
Para transformar este texto en la secuencia de códigos de máquina, necesitaría un ensamblador , que puede ser un programa, o un humano que traduciría ese texto en 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 máquina, pero esta no siempre es una traducción completamente directa: los ensambladores de macros tienen macros poderosas que pueden hacer mucho trabajo en el ensamblador y generar un muchas instrucciones de lenguaje de máquina 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.
fuente
Diría que la respuesta a ambas partes de su pregunta es no: los comandos de esta calculadora no son como el 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 nivel bastante bajo, pero aún representa una abstracción sobre las construcciones de nivel inferior que no son visibles para usted como programador. Lo adivino 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 fines de los años setenta y principios de los ochenta), diría que cada paso del programa "no solo podría ser una operación simple como" agregar "o" intercambiar X e Y "sino también operaciones más complejas como trigonometría, exponenciación, logaritmos, etc. Es probable que cada uno de estos pasos se implemente como una rutina microcodificada interna. Ese microcódigo probablemente esté programado en lenguaje ensamblador, pero no lo creo '
Como otros han descrito, el lenguaje ensamblador generalmente está en una correspondencia muy estrecha (si no 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 inferior, tales como Y bit a bit, OR, XOR, desplazamiento; aritmética de números enteros y (tal vez) de coma flotante, en una variedad de tamaños de datos (por ejemplo, precisión simple o doble); Carga / almacenamiento de una variedad de tamaños (byte, media palabra, palabra, etc.).
Las operaciones de nivel superior (trig, logaritmos) generalmente son llamadas de subrutina, 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, debe 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, conoce las direcciones y la aritmética de direcciones. Por lo general, los ensambladores permitirán a los programadores usar etiquetas para denotar direcciones. Pero si una dirección está en un segmento diferente, es posible que deba cargar un registro de segmento antes de poder acceder a él.
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, coma flotante y ocasionalmente datos de caracteres.
Se expone la especialización de registros. Algunas arquitecturas permiten operaciones de enteros y direcciones en algunos registros, pero de punto flotante solo en otros, o permiten el direccionamiento solo en relación con ciertos registros. A veces hay registros especializados como los que tienen bits de condición o estado que no se pueden usar para direccionamiento o aritmética.
Las convenciones de llamadas de subrutina están expuestas. Los argumentos y los valores de retorno pueden pasarse en registros o empujarse y extraerse de una pila. (Esta pila suele ser una región de memoria dirigida por un registro de puntero de pila especial, no un conjunto fijo como XYZ y T.)
Es posible que deba ser consciente de cómo interactuar con el sistema operativo, o si no hay uno, cómo lidiar con las instalaciones de hardware de bajo nivel. Con un sistema operativo, debe cargar los argumentos en los registros (o la pila) y atraparlos en el núcleo. Sin un sistema operativo, probablemente tenga que lidiar con interrupciones y temporizadores.
Mi recuerdo de la programación de ensamblaje es que es muy, muy doloroso. Creo que programar esta calculadora es fácil y divertido en comparación. (Lo siento.)
fuente
∧
,∨
,⊕
yИНВ
(lo que significa INV) en el teclado. 2) Pensé que seno, coseno, etc. son instrucciones de acuerdo con esta referencia ref.x86asm.net/coder32.html para procesadores x86. Pero, por supuesto, estoy de acuerdo con usted en que el ensamblador es mucho más complicado.Sí, eso definitivamente me suena como un lenguaje ensamblador.
Es difícil decir si eso realmente es ensamblado solo a partir de la descripción, porque la definición, un lenguaje cuyos comandos mapean 1: 1 con el código de máquina de su plataforma de destino, es difícil de determinar sin un conocimiento del código de máquina en sí, pero eso suena como ASM funciona en otras plataformas.
fuente
Ciertamente tiene algunas similitudes cercanas con un lenguaje ensamblador, pero voy a argumentar que eso no es lo que realmente es.
En un lenguaje ensamblador, las operaciones se asignan principalmente de 1 a 1 a las instrucciones de la CPU. Hay algunas excepciones, como macros y pseudo-ops (como, por ejemplo, una instrucción CLEAR que realmente XOR registra 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 el comportamiento ).
La calculadora indudablemente tiene una CPU, pero dudo que las instrucciones individuales de la CPU se refieran a los "registros" X, Y, Z y T, o realicen operaciones de alto nivel como
x
y
osin
(¡oПРГ
lo que sea que eso signifique!).En cambio, estoy seguro de que muchas o la mayoría de las operaciones visibles se realizan como llamadas de subrutina. 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 así como un intérprete que se ejecuta en la CPU real.
Aún así, diría que la respuesta a la segunda parte de su pregunta:
Es sí.
fuente
BMI
ejemplo,IF ... THEN ...
generalmente se leen como dos instrucciones: primero una comparación (x < 0
en este caso), luego una acción basada en el resultado de esa comparación (muy probablemente un salto al trabajar en lenguaje ensamblador). En Intel 8086, algo así (suponiendo quex
esté en AX)CMP AX, 0
JNL After_IfThen_Block
. (JNL es Jump if Not Less; en un lenguaje de nivel superior, esto se leería como algo asíif not (x < 0) then goto After_IfThen_Block
, que es lo mismo queif (x >= 0) then {code until there}
.)ПРГ
(PRG - programación) es solo una meta tecla para cambiar al modo de programación, no alguna función.Así es, el fragmento de código publicado se parece al lenguaje ensamblador . La conversión adecuada de este código definiría la versión.
Editar: tiene un lenguaje específico para este dispositivo, pero no es ensamblado.
También se parece a una calculadora hecha por la URSS. ¿Funciona con baterías / cable redondeados?
fuente
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 RAM verdadera para 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 coma flotante y un número entero. La mayoría de los lenguajes de programación de nivel superior aceptarían ADD 2.5, 7 y devolverían 9.5. Sin embargo, los lenguajes de ensamblaje diferirían la salida según la instrucción llamada y dependiendo de la representación de números subyacente en binario. La mayoría de los lenguajes de ensamblaje requieren que se use una instrucción diferente basada en el uso de operaciones de punto flotante versus entero. Una excepción a esto podría ser algún tipo de formato de punto fijo.
fuente
Las calculadoras de notación polaca inversa (RPN) eran clásicas. No, aunque las designaciones de registro parecen lenguaje ensamblador, no lo era. Los cálculos se realizaron traduciendo del formato algebraico a la pila. Los números utilizados se introdujeron en la pila y las operaciones se realizaron en el último apilado contra los últimos valores apilados.
Puede "rotar" la pila para mover los valores, ya que el valor mostrado es un miembro de la pila. Los resultados podrían intercambiarse o apilarse según sea necesario para realizar cálculos casi complejos. Si comprende el hardware de la pila y el lenguaje ensamblador, esta calculadora fue trivial de aprender, ya que su paradigma era muy similar.
fuente