significado pelicula lenguaje language ensamblador ejemplos drama app assembly

pelicula - assembly translate



¿En qué se diferencia el ensamblador de 2 pasos de un ensamblador de un solo paso al resolver el símbolo futuro? (4)

Estas son 2 preguntas que no entiendo:

1. ¿Cómo resuelve el Ensamblador One-Pass el problema del símbolo futuro?

2. ¿Cómo es el ensamblador de dos pasos diferente del ensamblador de un solo paso a este respecto? ¿Lo resuelve en el primer pase o en el segundo? Si lo hace en el segundo pase, ¿dónde difiere realmente del ensamblador one-pass-assembler? Si lo hace en el segundo pase, ¿por qué no lo hace en el primer pase?


Lee este PDF Explica, paso a paso, cómo funcionan los ensambladores de paso único y multi-paso. También explica los pros y los contras de ambos y las diferencias entre los dos.

¿Qué es un ensamblador de un solo paso?

¡Es un tipo de ensamblador Load-and-Go que generalmente genera el código objeto directamente en la memoria para su ejecución inmediata! Analiza tu código fuente solo una vez y listo. Vroom ...

Genial, si hace esta magia, ¿por qué necesitamos ensambladores multi-paso en absoluto?

Referencias hacia adelante! es decir, mientras el ensamblador de un solo paso recorre el código fuente, encuentra algunos desconocidos en forma de símbolos de datos indefinidos y etiquetas indefinidas (direcciones de salto). ¿Tu ensamblador les pregunta a estos desconocidos de quién son? Los extraños dicen " ¡Te lo diremos más tarde! " (Referencia futura) Su ensamblador se enoja y le dice que elimine totalmente a estos extraños. Pero estos extraños son tus amigos y no puedes eliminarlos por completo. Entonces usted entra en un acuerdo de compromiso con el ensamblador . Prometes definir todas tus variables antes de usarlas. El ensamblador no pudo comprometer esto porque ni siquiera puede reservar almacenamiento temporal para los símbolos de datos no definidos ya que no conoce su tamaño. Los datos pueden ser de diferentes tamaños

Si es algo así como

PAVAN EQU SOMETHING ; Your code here mov register, PAVAN ; SOMETHING DB(or DW or DD) 80 ; varying size data, not known before

Por su parte, su ensamblador acepta comprometerse con etiquetas de salto indefinidas. Como las etiquetas de salto no son más que direcciones y los tamaños de las direcciones se pueden conocer antes de que el ensamblador pueda reservar un espacio definido para el símbolo indefinido.

Si es así

jump AHEAD AHEAD add reg,#imm

El ensamblador traduce jump AHEAD como 0x45 **0x00 0x00** . 0x45 es el código de operación de jump y 4 bytes reservados para dirección AHEAD

OK, ahora dime cómo funciona exactamente un ensamblador de pases

Simple, mientras está en camino, si el ensamblador encuentra una etiqueta indefinida, la coloca en una tabla de símbolos junto con la dirección donde tiene que colocarse el valor del símbolo indefinido, cuando el símbolo se encuentra en el futuro . Hace lo mismo para todas las etiquetas indefinidas y cuando ve las definiciones de estos símbolos indefinidos, agrega su valor, tanto en la tabla (lo que hace que esa etiqueta esté definida) como en la ubicación de la memoria donde había reservado el almacenamiento temporal anteriormente.

Ahora, al final del análisis, si hay más almas pobres aún en estado indefinido, el ensamblador grita falta y comete errores :( Si no hay etiquetas indefinidas, ¡entonces listo!

Un segundo, ¿me olvidé de por qué necesitamos un ensamblador de 2 o múltiples pases? ¿Y cómo funcionan?

Como se explicó, el ensamblador de una sola pasada no puede resolver referencias de símbolos de datos . Requiere que todos los símbolos de datos se definan antes de ser utilizados. Un ensamblador de dos pasos resuelve este dilema dedicando un pase a resolver exclusivamente todas las referencias de reenvío (datos / etiquetas) y luego genera el código objeto sin molestias en el próximo pase.

Si un símbolo de datos depende de otro y este otro depende de otro, el ensamblador lo resolvió recursivamente. Si trato de explicar incluso eso en esta publicación, la publicación será demasiado grande. Lea este ppt para más detalles

Mmm interesante. ¿El ensamblador de dos pases tiene más ventajas?

Sí. Puede detectar redefiniciones y cosas por el estilo.

PD : puede que no sea 100% correcto aquí. Me encantaría escuchar cualquier sugerencia para que sea una mejor publicación.


Símbolo futuro Probleam significa que el símbolo es uso antes de definirlo.

  • Es posible porque en el programa de lenguaje ensamblador, el programador puede definir cualquier símbolo, por lo que si el símbolo se usa antes de definirlo, se lo denomina "referencia directa".

  • Entonces, al momento de convertirlo en lenguaje de máquina (binario), Assembler obtiene Opcode-Reg-X2-B2 pero no obtiene D2 (desplazamiento) en la tabla de símbolos, por lo que no es posible convertirlo en lenguaje de máquina (binario ) Y se llama "problema de referencia de reenvío".

  • Para resolver este Ensamblador de 2 pases está definido.

** En First Pass (First Scan) hace entradas de símbolos (etiquetas) en la tabla de símbolos. ** Y en Ensamblador de Second Pass (Second Time Scan) Conviértalo en lenguaje de máquina (binario). Es muy sencillo :)


Un ensamblador de un solo paso genera código y para cualquier símbolo indefinido, deja un espacio para rellenar y lo recuerda en una tabla u otra estructura de datos. Luego, cuando se define el símbolo, rellena su valor en el lugar o lugares correctos, utilizando la información de la tabla.

La razón para usar un ensamblador de dos pasos tradicionalmente ha sido que el programa objetivo no cabe en la memoria, deje solo la fuente. El gigantesco programa fuente se lee, línea por línea, desde el lector de cinta perforada, y la tabla de etiquetas se guarda en la memoria interna. (De hecho, he hecho eso, en ISIS, el primer sistema de desarrollo de Intel, con un 8080.) La segunda vez alrededor de la cinta de origen se vuelve a leer desde el principio, pero se conoce el valor de todas las etiquetas, y cada línea se lee, el programa objetivo se perfora en cinta. En un sistema hambriento de memoria de 16 bits, Intel 8086, esta seguía siendo una técnica útil para tener un archivo fuente muy documentado que puede ser mucho más grande que 64 Kbyte, con disco duro o disquete sustituido por cinta de papel.

Hoy en día no hay necesidad de hacer dos pases, pero esta arquitectura todavía está en uso. Es un poco más simple, a expensas de E / S.


Una forma de pensar acerca de los ensambladores es imaginar que calculan el valor de una serie de expresiones asignadas a ubicaciones de memoria que se incrementan secuencialmente. Las expresiones pueden consistir convencionalmente en el valor de un símbolo, una cierta aritmética hecha en símbolos, constantes y variables especiales, como el "contador de ubicación actual" (a menudo escrito con un nombre gracioso como "$"), o expresiones verdaderamente peculiares cuya la sintaxis es la de las instrucciones de la máquina.

Tenga en cuenta que una expresión puede producir un valor que llene varias ubicaciones de memoria secuenciales; las instrucciones de máquina tienden a hacer esto, pero es útil tener expresiones para literales de cadena, números de multiplicidad, estructuras inicializadas, etc. Esto solo afecta los detalles de contabilidad pero no cambia lo que los ensambladores hacen en abstracto.

Para calcular el valor final de cada expresión, el ensamblador debe conocer el valor de cualquier símbolo que pueda estar involucrado. Descubre los valores de los símbolos de solo algunas maneras. Primero, el valor del símbolo se puede definir como el resultado de una expresión. En segundo lugar, al valor del símbolo se le puede asignar el valor del contador de ubicación actual; generalmente los ensambladores hacen esto cuando un símbolo está escrito en la posición "etiqueta". En tal descubrimiento, el ensamblador registra el nombre del símbolo y su valor en la tabla de símbolos para usar en la evaluación de expresiones.

Un problema clave que enfrenta un ensamblador es producir el valor de una expresión, ya que aún no ha encontrado todas las definiciones de símbolos. La suposición es que si un símbolo no está definido en alguna línea particular, se definirá en alguna línea posterior que el ensamblador eventualmente procesará.

Un ensamblador de dos pasos intenta calcular el valor de cada expresión cuando la encuentra, en dos pasos llamados "primero" y "segundo". Durante el primer pase, si hay símbolos indefinidos (se supone que son referencias directas) en la expresión, el ensamblador simplemente sustituye un valor ficticio (a menudo cero); en cualquier caso, calcula un valor para la expresión. Si se está procesando una instrucción de máquina o una constante de datos, los resultados se ignoran, pero el tamaño se usa para avanzar el contador de ubicación para habilitar la asignación de valores de etiqueta. Si se encuentra una etiqueta, su valor se establece en el contador de ubicación actual. Si se encuentra una asignación de símbolo "A EQU", el valor del símbolo se establece en el resultado de la expresión; si la expresión contenía un símbolo indefinido, el ensamblador emitirá un error. Si una declaración de origen se encuentra "ORG", se trata como si uno hubiera escrito "$ EQU". Al final de la primera pasada, todas las etiquetas tienen valores asignados; cualquier símbolo que no tenga valores está marcado como "indefinido" en la tabla de símbolos. Un segundo pase repite la evaluación de expresión del primero pero no (re) define ningún símbolo; dado que todos los símbolos se (se espera que estén) definidos, los valores de expresión son correctos y se emiten a la secuencia de salida. Cualquier símbolo indefinido que se encuentre en una expresión ocasionará un reclamo de "símbolo indefinido".

Un ensamblador de un solo paso intenta calcular el valor de cada expresión cuando encuentra la expresión. Si la expresión contiene solo símbolos definidos, el ensamblador puede evaluarlo y producir el valor final, y escribir esa información en su flujo de salida. (Otra respuesta aquí sugería que algunos ensambladores de un pase escriben su respuesta en la memoria. Eso es solo un caso especial). Si la expresión contiene un símbolo indefinido, el ensamblador almacena un par (ubicación, expresión) para ser reprocesado posteriormente, ya sea cuando se define el símbolo o al final del ensamblaje. Algunas expresiones como las que establecen el contador de ubicación no pueden tener símbolos indefinidos; el ensamblador se quejará en ese caso.

Entonces, la parte difícil es almacenar la expresión no resuelta y decidir cuándo volver a evaluarla. Una forma de almacenar la expresión es simplemente mantener el texto; otra es construir lo que equivale a una notación polaca (inversa) para la expresión. Para determinar cuándo se debe volver a evaluar la expresión, se puede asociar con los símbolos indefinidos que contiene; luego, cuando se define un símbolo, las expresiones no resueltas correspondientes se vuelven a evaluar, con las emitidas y sin resolver para el reprocesamiento. Alternativamente, el ensamblador podría simplemente guardar todas las expresiones hasta que encuentre el final de la entrada; en este punto, todos los símbolos deberían definirse y, por lo tanto, debería poder determinar los valores finales para cada expresión. Uno elige entre estas dos técnicas en función de la cantidad de memoria que uno puede permitirse almacenar en las expresiones de referencia avanzadas.

En un siglo anterior, construí un ensamblador de paso único que se ejecutaba en una computadora de 8 bytes, que usaba la representación polaca de expresiones. A medida que se definieron los símbolos, se evaluó la expresión polaca y se calcularon las subexpresiones que eran computables, simplificando el polaco resultante a un valor final o una expresión polaca más pequeña que involucra solo a los operadores en símbolos indefinidos. Las entradas de la tabla de símbolos para valores indefinidos tenían una lista vinculada de todas las ranuras de expresión polacas correspondientes a símbolos indefinidos; como se encontraron definiciones de símbolos, todos los elementos de la lista enlazada se actualizaron y las expresiones polacas se volvieron a evaluar a medida que se producían. Esto mantiene los tamaños de expresión polaca lo más pequeños posible y se deshace de ellos en el momento en que se definen todos sus símbolos. Este ensamblador procesó cientos de miles de programas de línea en una máquina pequeña. La razón para hacer un ensamblador de una sola pasada en una máquina tan pequeña es que el código fuente provino de una cinta de papel (un teletipo, para aquellos de ustedes lo suficientemente mayores como para recordarlo) y leer esa cinta de papel es bastante doloroso y lento; una segunda vez no era una buena idea, por lo que un ensamblador de dos pasos no era una opción adecuada.

Una de mis cohortes construyó hace mucho tiempo un interesante ensamblador de dos pasos. En lugar de procesar el texto dos veces, el tokenizó el texto (lo guardó en la memoria) en la primera pasada y también recolectó valores de símbolos. Pass two procesó el texto tokenizado. Este fue un ensamblador muy rápido para dos pases. Tenía mucha más memoria disponible.