¿Se escribieron los primeros ensambladores en código de máquina?

41

Estoy leyendo el libro Los elementos de los sistemas informáticos: construyendo una computadora moderna a partir de los Primeros Principios , que contiene proyectos que abarca la compilación de una computadora desde puertas booleanas hasta aplicaciones de alto nivel (en ese orden). El proyecto actual en el que estoy trabajando es escribir un ensamblador utilizando un lenguaje de alto nivel de mi elección, para traducir del código de ensamblaje de Hack al código de máquina de Hack (Hack es el nombre de la plataforma de hardware incorporada en los capítulos anteriores). Aunque todo el hardware se ha construido en un simulador, he tratado de fingir que realmente estoy construyendo cada nivel utilizando solo las herramientas disponibles para mí en ese momento del proceso real.

Dicho esto, me hizo pensar. El uso de un lenguaje de alto nivel para escribir mi ensamblador es ciertamente conveniente, pero para el primer ensamblador escrito (es decir, en la historia), ¿no debería estar escrito en código de máquina, ya que eso es todo lo que existía en ese momento? p>

Y una pregunta correlacionada ... ¿qué tal hoy? Si aparece una nueva arquitectura de CPU, con un nuevo conjunto de instrucciones y una nueva sintaxis de ensamblaje, ¿cómo se construirá el ensamblador? Supongo que todavía podría utilizar un lenguaje de alto nivel existente para generar binarios para el programa de ensamblador, ya que si conoce la sintaxis del ensamblador y los lenguajes de máquina para su nueva plataforma, entonces la tarea de escribir el ensamblador es realmente una tarea sencilla. La tarea de análisis de texto y no está relacionada de forma inherente con esa plataforma (es decir, la necesidad de estar escrito en el lenguaje de máquina de esa plataforma) ... que es la razón por la que puedo "engañar" mientras escribo mi ensamblador Hack en 2012, y usar algunos preexistentes lenguaje de alto nivel para ayudarme.

    
pregunta The111 08.01.2012 - 21:23

10 respuestas

35
  

para el primer ensamblador escrito (es decir, en la historia), ¿no debería estar escrito en código de máquina?

No necesariamente. Por supuesto, la primera versión v0.00 del ensamblador debe haber sido escrita en código de máquina, pero no sería lo suficientemente poderosa para llamarse ensamblador. No admitiría ni siquiera la mitad de las características de un ensamblador "real", pero sería suficiente para escribir la próxima versión de sí mismo. Luego podría volver a escribir v0.00 en el subconjunto del lenguaje ensamblador, llamarlo v0.01, usarlo para crear el siguiente conjunto de características de su ensamblador v0.02, luego usar v0.02 para compilar v0.03, y así sucesivamente, hasta llegar a v1.00. Como resultado, solo la primera versión estará en código de máquina; la primera versión lanzada estará en lenguaje ensamblador.

He iniciado el desarrollo de un compilador de lenguaje de plantilla mediante este truco. Mi versión inicial estaba usando las declaraciones printf , pero la primera versión que puse en uso en mi empresa estaba usando el procesador de plantilla que estaba procesando. La fase de arranque duró menos de cuatro horas: tan pronto como mi procesador pudo producir una salida apenas útil, la reescribí en su propio idioma, compilé y deseché la versión sin plantilla.

    
respondido por el dasblinkenlight 08.01.2012 - 21:42
23

Según Wikipedia, el primer ensamblador / lenguaje de ensamblaje fue implementado para IBM 701 por Nathaniel Rochester . (Las fechas son un poco inciertas en el artículo de Wikipedia. Afirma que Rochester se unió a IBM en 1948, pero otra página de Wikipedia indica que el 701 se anunció públicamente en 1952. Y esta página de IBM indica que " [a] el diseño ctual comenzó el 1 de febrero de 1951 y se completó un año después ".)

Sin embargo,

"Assemblers and Loaders" por David Salomon declara (en la página 7) que EDSAC también tenía un ensamblador:

  

"Una de las primeras computadoras con programas almacenados fue la EDSAC (Electronic Delay Storage Automatic Calculator) desarrollada en la Universidad de Cambridge en 1949 por   Maurice Wilkes y W. Renwick. Desde sus primeros días el EDSAC.   Tenía un ensamblador, llamado pedidos iniciales. Se implementó en una memoria de solo lectura formada por un conjunto de selectores de teléfono giratorio y aceptó instrucciones simbólicas. Cada instrucción consistía en una mnemotécnica de una letra, una dirección decimal y un tercer campo que era una letra. El tercer campo hizo que una de las 12 constantes preestablecidas por el programador se agregara a la dirección en el momento del ensamblaje. " (Se omiten las referencias ... consulte el original).

Suponiendo que aceptamos que las "Órdenes iniciales" tienen prioridad, tenemos pruebas claras de que el primer ensamblador fue implementado en código de máquina.

Este patrón (escribir los ensambladores iniciales en código de máquina) habría sido la norma hasta bien entrada la década de 1950. Sin embargo, según Wikipedia , "[a] ssemblers fueron las primeras herramientas de idioma para arrancar" . Vea también esta sección que explica cómo se usó un código de máquina escrito por el ensamblador primordial para arrancar un ensamblador más avanzado que fue codificado en lenguaje ensamblador.

En estos días, los ensambladores y compiladores están escritos en lenguajes de nivel superior, y un ensamblador o compilador para una nueva arquitectura de máquina se desarrolla normalmente en una arquitectura diferente y se compila de forma cruzada.

(FWIW: escribir y depurar programas no triviales en código de máquina es un proceso extremadamente laborioso. Alguien que desarrolle un ensamblador en código de máquina lo más probable es que arranque a un ensamblador escrito en ensamblador lo antes posible.)

Esta página de Wikipedia en compiladores y ensambladores bootstrapping merece una lectura ... si esto es todo. desconcertante para ti.

    
respondido por el Stephen C 09.01.2012 - 06:09
14

Supongo que los primeros ensambladores fueron escritos en código de máquina, porque como usted dice, no había nada más disponible en ese entonces.

Hoy, sin embargo, cuando aparece una nueva arquitectura de CPU, usamos lo que se conoce como un compilador cruzado , que es un compilador que produce código de máquina no para la arquitectura en la que se está ejecutando, sino para una arquitectura diferente.

(De hecho, como estoy seguro de que descubrirá más adelante en el libro que está leyendo, no hay absolutamente nada que haga que un compilador sea más adecuado para producir código de máquina para la arquitectura en la que se está ejecutando que en cualquier otra arquitectura. Es solo una cuestión de qué arquitectura, como creador del compilador, va a apuntar.)

Por lo tanto, hoy en día es incluso posible (al menos en teoría) crear una arquitectura nueva y tener compiladores de lenguaje de alto nivel que se ejecuten de forma nativa en ella (compilado en otras arquitecturas que utilizan compiladores cruzados) incluso antes de tener un ensamblador para esa arquitectura.

    
respondido por el Mike Nakis 08.01.2012 - 21:45
12

Al principio, el "ensamblaje" se escribió en papel y luego se "compiló" manualmente en tarjetas perforadas.

Mi abuelo estaba trabajando con un ZRA1 (lo siento, la página solo existe en alemán, pero la traducción de Google está bien. hasta el punto en que realmente pueda recoger los hechos más importantes: D).
El modus operandi fue anotar su código en papel en una especie de lenguaje ensamblador y la secretaria realmente haría la transcripción a las tarjetas perforadas, luego se las pasaría al operador y el resultado se devolvería la mañana siguiente.

Todo esto fue esencialmente antes de que los programadores tuvieran el lujo de ingresar datos a través de un teclado y verlos en una pantalla.

    
respondido por el back2dos 09.01.2012 - 11:48
9

Es difícil estar seguro acerca del primer ensamblador muy (es difícil incluso definir qué fue eso). Hace años, cuando escribí algunos ensambladores para máquinas que carecían de ensambladores, todavía escribía el código en lenguaje ensamblador. Luego, después de tener una sección del código razonablemente completa, la traduje a mano en el código de la máquina. Sin embargo, esas eran dos fases completamente separadas: cuando estaba escribiendo el código, no estaba trabajando ni pensando en un nivel de código de máquina en absoluto.

Debo agregar que en algunos casos, fui un paso más allá: escribí la mayor parte del código en un lenguaje ensamblador que me pareció más fácil de usar, luego escribí un pequeño kernel (más o menos lo que ahora llamamos un máquina virtual) para interpretar eso en el procesador de destino. Eso fue extremadamente lento (especialmente en un procesador de 8 MHz y 8 bits), pero no importó mucho, ya que normalmente solo se ejecutaba una vez (o, como mucho, algunas veces).

    
respondido por el Jerry Coffin 09.01.2012 - 03:59
8

No necesita un ensamblador para ensamblar a mano el código del lenguaje ensamblador en el código de máquina. Al igual que no necesita un editor para escribir código de lenguaje ensamblador.

Una perspectiva histórica

Los primeros ensambladores probablemente se escribieron en lenguaje ensamblador y luego se ensamblaron manualmente en el código de la máquina. Incluso si el procesador no tuviera un 'lenguaje ensamblador' oficial, entonces los programadores probablemente hicieron la mayor parte del trabajo de programación utilizando algún tipo de pseudo código antes de traducir ese código en instrucciones de la máquina.

Incluso en los los primeros días de computación , los programadores escribieron programas en una especie de notación simbólica y las tradujo a código de máquina antes de introducirlas en su computadora. En el caso de Augusta Ada King, ella habría necesitado traducirlas en tarjetas perforadas para Babbage 's Analytical Engine , pero por desgracia nunca lo fue construido.

Experiencia personal

La primera computadora que tenía era una Sinclair ZX81 (Timex 1000 en los EE. UU.). La parte posterior del manual tenía toda la información que necesitabas para traducir el lenguaje ensamblador de Z80 al código de la máquina (incluso con todo el modo de índice extraño opcodes el Z80 tenía).

Escribiría un programa (en papel) en lenguaje ensamblador y ejecutaría el código. Cuando estaba feliz de que mi programa estaba libre de errores, buscaba cada instrucción en la parte posterior del manual, la traducía al código de la máquina y también escribía el código de la máquina en el papel. Finalmente, escribiría todas las instrucciones del código de máquina en mi ZX81 antes de guardarlo en la cinta y tratar de ejecutarlo.

Si no funcionara, volvería a revisar el ensamblaje de mi mano y si alguna traducción era incorrecta, parchearía los bytes cargados de la cinta antes de volver a guardarlo e intentar ejecutar el programa nuevamente.

Por experiencia, puedo decirle que es mucho más fácil depurar su código si está escrito en lenguaje ensamblador que en código de máquina, de ahí la popularidad de los desensambladores. Incluso si no tiene un ensamblador, el ensamblaje manual es menos propenso a los errores que intentar escribir el código de máquina directamente, aunque supongo que un programador real como Mel puede estar en desacuerdo. * 8 ')

    
respondido por el Mark Booth 09.01.2012 - 14:37
5

No hay diferencia entonces o ahora. Si quieres inventar un nuevo lenguaje de programación, eliges uno de los lenguajes disponibles hoy para hacer el primer compilador. durante un período de tiempo, si es un objetivo del proyecto, crea un compilador en ese idioma y puede auto hospedarse.

Si todo lo que tenía era lápiz y papel y algunos interruptores o tarjetas perforadas como su interfaz de usuario para el primer o el siguiente conjunto de instrucciones nuevo, utilizó uno o todos los elementos disponibles para usted. Podrías haber escrito un lenguaje ensamblador, en papel, y luego usar un ensamblador, tú, para convertirlo en código de máquina, tal vez en octal, y luego, en algún punto que entró en la interfaz de la máquina.

Cuando se inventa un nuevo conjunto de instrucciones hoy en día, no es diferente, dependiendo de la compañía / los individuos, las prácticas, etc. Es muy probable que el ingeniero de hardware que probablemente esté programando en verilog o vhdl, escriba los primeros programas de prueba a mano. En código máquina (probablemente en hexadecimal o binario). dependiendo del progreso de los equipos de software, pueden ser muy rápidos o no durante un tiempo muy largo cambiar al lenguaje ensamblador y luego a un compilador.

Las primeras máquinas de computación no eran máquinas de propósito general que pudieras usar para crear ensambladores y compiladores. Los programó moviendo algunos cables entre la salida del alu anterior y la entrada del siguiente. Finalmente, tuvo un procesador de propósito general tal que podría escribir un ensamblador en un ensamblaje, ensamblarlo manualmente, introducirlo como código de máquina, usarlo para analizar ebcdic, ascii, etc. y luego auto-host. almacene el binario en algún medio que luego pueda leer / cargar, sin tener que mantener pulsados los conmutadores para alimentar a mano el código de la máquina.

Piensa en tarjetas perforadas y cinta de papel. En lugar de oprimir los interruptores, definitivamente podrías hacer una máquina completamente mecánica, un dispositivo que ahorra mano de obra, que creó los medios que la computadora leería. En lugar de tener que ingresar los bits del código de la máquina con interruptores como un altoir, en su lugar podría cargar cinta de papel o tarjetas perforadas (utilizando algo mecánico, no impulsado por el procesador, que alimenta la memoria o el procesador, O O utilizando un pequeño cargador de arranque escrito con código de máquina). Esto no fue una mala idea porque podría hacer algo, impulsado por la computadora, que también podría producir mecánicamente las cintas de papel o las tarjetas perforadas, y luego introducirlas nuevamente. Dos fuentes de tarjetas perforadas, el dispositivo para el trabajo mecánico no basado en computadora , y la máquina accionada por computadora. ambos producen los "binarios" para la computadora.

    
respondido por el old_timer 13.01.2012 - 05:27
4

Hay uno o dos casos en el zoo de computadora de Brook donde dijo algo así como "los mnemotécnicos son nuestro invento, el diseñador simplemente usó el código de operación numérico o el carácter cuyo código era el código de operación", así que donde había máquinas para las que ni siquiera existía un lenguaje ensamblador.

Al ingresar a los programas, finaliza la depuración en el panel frontal (para aquellos que no lo han hecho, fue una forma de configurar la memoria; establece algunos cambios en la dirección, otros en el valor y presionando un botón, o otro botón para leer el valor) era común mucho más tarde. Algunos temporizadores antiguos presumen que aún podrían ingresar el código de inicio para las máquinas que usaron extensivamente.

La dificultad de escribir directamente el código de máquina y los programas de lectura desde el volcado de memoria depende bastante del lenguaje de la máquina, algunos de ellos son relativamente fáciles (la parte más difícil es rastrear las direcciones), x86 es una de las peores.

    
respondido por el AProgrammer 09.01.2012 - 10:08
2

Construí una computadora en 1975. Era muy avanzada en comparación con su Altair contemporánea, porque tenía un 'monitor rom' que me permitía ingresar programas al escribir el código de máquina en hexadecimal y ver este código en un monitor de video, donde al igual que con el Altair, cada instrucción de la máquina tenía que ingresarse un poco a la vez usando una fila de interruptores.

Así que sí, en los primeros días de las computadoras y luego nuevamente en los primeros días de las computadoras personales las personas escribían aplicaciones en código de máquina.

    
respondido por el Jim In Texas 09.01.2012 - 16:29
2

Una anécdota:

Cuando aprendí el lenguaje ensamblador, en Apple] [ había un programa incluido en la ROM llamado el micro-ensamblador. Hizo la traducción inmediata de las instrucciones de ensamblaje a los bytes a medida que los ingresaba. Esto significa que no hubo etiquetas: si desea saltar o cargar, tuvo que calcular las compensaciones usted mismo. Sin embargo, fue mucho más fácil que buscar los diseños de instrucciones e ingresar valores hexadecimales.

Sin duda, los ensambladores reales se escribieron primero utilizando el micro-ensamblador, o algún otro entorno no completamente completo.

    
respondido por el Sean McMillan 13.01.2012 - 16:55

Lea otras preguntas en las etiquetas