assembly - maquina - ¿Cuál es el conjunto de instrucciones mínimo requerido para que cualquier lenguaje de ensamblaje se considere útil?
lenguaje maquina pdf (8)
Estoy estudiando la programación de ensamblajes en general, así que decidí probar e implementar un "microprocesador virtual" en el software, que tiene registros, indicadores y RAM para trabajar, implementado con variables y matrices. Pero como quiero simular solo el comportamiento más básico de cualquier microprocesador , quiero crear un lenguaje ensamblador que tenga solo las instrucciones esenciales, solo aquellas instrucciones sin las cuales no podría ser útil. Quiero decir, hay lenguajes de ensamblaje que pueden hacer valores de registro de multiplicación e intercambio, etc., pero estas operaciones no son básicas porque se pueden implementar usando instrucciones más simples. No quiero implementar instrucciones como esas.
Puedo imaginar un par de instrucciones que (creo) siempre deben estar presentes en cualquier lenguaje ensamblador, como MOV para mover bytes y JP para enviar el puntero a otra dirección.
¿Podría sugerir un conjunto de las instrucciones de montaje más básicas y esenciales? ¡Gracias!
Bueno, este es un tema muy amplio. Supongo que necesitas familiarizarte con Random Access Machine . No soy un experto, pero es difícil decir qué instrucciones deben ser compatibles con este microprocesador muy básico. Por ejemplo: la resta y la multiplicación se pueden simular mediante la operación de suma. La multiplicación es posible si el microprocesador soporta saltos e instrucciones condicionales y la resta es posible agregando un número negativo.
El conjunto de instrucciones mínimo no requiere instrucción o, tal vez, instrucción cero . No sé si entraron en dispositivos reales o no, pero una computadora con un conjunto de instrucciones se implementó y se ejecutó con éxito en computadoras con nanotubos de carbono y MAXQ .
Sin embargo, la OMI y una arquitectura deben ser lo suficientemente "rápidas" (o no requieren demasiadas instrucciones como OISC para una tarea en comparación con otras arquitecturas) para que se consideren útiles .
Los tipos de instrucción más básicos para una computadora son movimientos de datos, operaciones lógicas / aritméticas y bifurcaciones. Para las operaciones aritméticas, solo una add/subtract
es suficiente. Para la lógica, podemos calcular cualquier función solo con NOR
o NAND
, por lo que solo se necesita una. Para saltar, necesitaremos un jump on "<="
o jump on "<"
instrucción jump on "<"
. Los movimientos de datos pueden ser emulados por add / sub. Así, podemos usar 2 bits para codificar 3 códigos de operación ( add
, nand
, jump on "<="
) y dejar uno para la expansión futura. Pero como esto no tiene instrucciones de carga / almacenamiento, debe usar un archivo de registro grande y procesar datos directamente desde ese en lugar de la memoria, o las instrucciones deben tener la capacidad de usar la memoria como operandos.
Si se necesita más velocidad, luego cargar / almacenar, se pueden agregar algunas más instrucciones lógicas y de bifurcación, aumente el espacio del código de operación a 3 bits. El conjunto de instrucciones puede ser:
- carga
- almacenar
- añadir
- y
- ni
- saltar en menos de
- saltar en igual
Es posible que también desee buscar la integridad de Turing.
http://en.wikipedia.org/wiki/Turing_completeness
http://c2.com/cgi/wiki?TuringComplete
Significa que un lenguaje es suficiente para calcular cualquier cosa que se pueda calcular.
Las estructuras de control comprenden la característica básica sin la cual no hay lenguaje. Esto significa que su idioma debe proporcionar operaciones aritméticas en dos variables; y luego permitir que un programa cambie el contador del programa, es decir, bifurcarse, en función del resultado de una operación. Muy a menudo, la operación crucial es SUB, para restar un operando de otro. Y las condiciones en las que permitirías una sucursal son:
- el resultado es cero;
- el resultado es mayor que cero;
- el resultado es menor que cero.
- Sin condición, es decir, rama incondicional.
También necesita instrucciones para mover datos: CARGAR y ALMACENAR, por ejemplo.
Estas tres condiciones y sus ramas correspondientes (o saltos, que es otra forma de hacerlo) son necesarias para cualquier programa. No solo eso, sino que solo estas tres operaciones simples más instrucciones de movimiento de datos, son suficientes para hacer cualquier cosa en un programa, excepto I / O. Si quisiera, y dada una organización de memoria colaboradora, podría reescribir Linux usando solo CARGAR, GUARDAR, AGREGAR, SUBIR y las tres ramas condicionales.
El PDP-8 era una máquina mucho más poderosa que esta: tenía un rico conjunto de ocho instrucciones , incluida la E / S.
HTH
Puede sobrevivir perfectamente bien con un conjunto de instrucciones mínimo que consiste solo en SOB:
restar uno y bifurcar. Programas enteros pueden y han sido escritos con esto.
Sorprendentemente, existe una computadora con un conjunto de instrucciones .
Teóricamente, una sola computadora de instrucción es posible. Sin embargo, en hardware real, necesitaría un mínimo de 4. Suponiendo una arquitectura de solo memoria (no hay registros accesibles por el usuario).
MOV mem1 mem1: copie el contenido de la ubicación de memoria mem1 en la ubicación de memoria mem2 sin modificar mem1
NAND mem1 mem2 to mem3: realice una NAND lógica a nivel de bits entre los datos en mem1 y mem2 y escriba el resultado en mem3
BITSHIFTR mem1 mem2 mem3 - cambia a la derecha los datos en mem1 lugares mem2 y escribe la salida en mem3
JMPcond mem1 mem2: pruebe el bit menos significativo en mem1 y si es verdadero (1) salte a mem2
Ahora no será súper rápido y consumirá ancho de banda de memoria como loco, pero se puede usar para implementar una máquina virtual con cualquier conjunto de instrucciones arbitrarias. Además, existen ciertas restricciones de programación, como la necesidad de programar en todos los datos de inicio, o al menos una ubicación de memoria con solo el LSB configurado en 1. los periféricos de hardware tendrán que usar DMA para el acceso de E / S, y si se implementan en una Harvard Architecture el programa no tendrá acceso directo a cosas como punteros.
Mira implementaciones comerciales.
La mejor respuesta es probablemente mirar implementaciones comerciales existentes.
Cualquier cosa que no se venda comercialmente, es probable que no sea útil.
¿Cuál es la definición de una instrucción?
Por ejemplo, podría hacer una instrucción que implemente el algoritmo de descompresión, basada en una implementación de hardware de descomprimir, y esta sería, por supuesto, la máquina más eficiente posible para descomprimir.
¿Sería comercialmente atractivo sin embargo? Es poco probable, pero hay muchos más matices de casos que este extremo, y la respuesta probablemente variará con las tecnologías existentes de la competencia y la demanda del mercado a tiempo para empeorar las cosas.
Posibles razones por las cuales las ISA completas de Turing muy pequeñas pueden ser ineficientes
- las pocas instrucciones que tienen son muy complejas e incurren en grandes costos cada vez que se llaman, por ejemplo, no puede hacer ciertas optimizaciones de canalización
- La densidad del código es muy pequeña, lo que implica:
- el rendimiento puede estar limitado por la obtención de instrucciones
- No es bueno para dispositivos integrados con memoria ROM pequeña
Notables implementaciones de OISC
Sería interesante analizar aquellos para tener una respuesta más concreta.
movimatizador
https://github.com/xoreaxeaxeax/movfuscator
Compila el código C usando solo las instrucciones mov
x86, mostrando de una manera muy concreta que una sola instrucción es suficiente.
La integridad de Turing parece haber sido probada en un documento: https://www.cl.cam.ac.uk/~sd601/papers/mov.pdf
Subleq
Anteriormente mencionado en el nombre.
- https://github.com/hasithvm/subleq-verilog Verilog, Xilinx ISE.
- https://github.com/purisc-group/purisc Verilog y VHDL, Altera. Tal vez ese proyecto tenga un backend clang, pero no puedo usarlo: https://github.com/purisc-group/purisc/issues/5
- http://mazonka.com/subleq/sqasm.cpp | http://mazonka.com/subleq/sqrun.cpp Ensamblador y emulador basado en C ++.
Véase también: https://esolangs.org/wiki/Subleq
Ver también