¿Qué es el ensamblador?
Un programa ensamblador crea código objeto traduciendo combinaciones de mnemónicos y sintaxis para operaciones y modos de direccionamiento en sus equivalentes numéricos. Esta representación suele incluir un código de operación ("opcode"), así como otros bits de control y datos. El ensamblador también calcula expresiones constantes y resuelve nombres simbólicos de posiciones de memoria y otras entidades. El uso de referencias simbólicas es una característica clave de los ensambladores, ya que ahorra tediosos cálculos y actualizaciones manuales de direcciones tras las modificaciones del programa. La mayoría de los ensambladores también incluyen funciones de macros para realizar sustituciones textuales, por ejemplo, para generar secuencias cortas comunes de instrucciones como inline, en lugar de subrutinas llamadas.

Algunos ensambladores también pueden realizar algunos tipos sencillos de optimizaciones específicas del conjunto de instrucciones. Un ejemplo concreto de esto pueden ser los omnipresentes ensambladores x86 de varios proveedores. La mayoría de ellos son capaces de realizar sustituciones de instrucciones de salto (saltos largos sustituidos por saltos cortos o relativos) en cualquier número de pasadas, a petición del usuario. Otros pueden incluso hacer una simple reordenación o inserción de instrucciones, como algunos ensambladores para arquitecturas RISC que pueden ayudar a optimizar una programación de instrucciones sensata para explotar el pipeline de la CPU de la forma más eficiente posible.
What is Assembler?
An assembler program creates object code by translating combinations of mnemonics and syntax for operations and addressing modes into their numerical equivalents. This representation typically includes an operation code ("opcode") as well as other control bits and data. The assembler also calculates constant expressions and resolves symbolic names for memory locations and other entities. The use of symbolic references is a key feature of assemblers, saving tedious calculations and manual address updates after program modifications. Most assemblers also include macro facilities for performing textual substitution – e.g., to generate common short sequences of instructions as inline, instead of called subroutines.

Some assemblers may also be able to perform some simple types of instruction set-specific optimizations. One concrete example of this may be the ubiquitous x86 assemblers from various vendors. Called jump-sizing, most of them are able to perform jump-instruction replacements (long jumps replaced by short or relative jumps) in any number of passes, on request. Others may even do simple rearrangement or insertion of instructions, such as some assemblers for RISC architectures that can help optimize a sensible instruction scheduling to exploit the CPU pipeline as efficiently as possible.