Existen algunos ensambladores para varias plataformas que, dado un archivo fuente, producirán un archivo binario de salida directamente diseñado para ser cargado en una dirección particular. Tales ensambladores han sido populares para algunos microcontroladores pequeños, o para algunos procesadores históricos como el 6502 y el Z80. Al armar el programa, sería necesario conocer la dirección donde se esperaría que residiera; usar una dirección diferente requeriría volver a ensamblar el programa. Por otro lado, el ensamblaje en un sistema de este tipo era un proceso de un solo paso. Ejecute el ensamblador en el código fuente y obtenga una salida ejecutable. En algunos casos, sería posible tener el código fuente, ensamblador y salida en la memoria a la vez (en mi Commodore 64, utilicé un ensamblador que se publicó en la revista Compute's Gazette que funcionaba así).
A pesar de volver a montar todo en cualquier momento sus cambios de dirección podrían haber sido práctico para un programa que va a "hacerse cargo de la máquina", en muchos casos es conveniente utilizar un proceso de múltiples pasos donde archivos de origen se procesan en archivos de código objeto , que contienen las instrucciones ensambladas pero también contienen varios tipos de información "simbólica" sobre ellas; estos archivos se procesan de varias formas para generar una imagen de memoria que se puede cargar directamente en la memoria, o bien un archivo de objeto reubicable combinado que el cargador de un sistema operativo sabrá cómo ajustar para cualquier dirección a la que pueda cargarse .
Para que un sistema de enlace de objetos sea útil, debe permitir el aplazamiento de ciertos tipos de cálculos de direcciones hasta que un programa se vincule o cargue. Algunos sistemas solo permiten que se realicen cómputos extremadamente simples en el tiempo de enlace/carga, mientras que otros permiten cálculos más complicados. Los esquemas más simples pueden ser más eficientes cuando son viables, pero sus limitaciones pueden forzar soluciones temporales. A modo de ejemplo, una rutina que va a utilizar BX colocar a través de una estructura de datos con menos de 256 bytes puede ser escrito como algo así como:
mov bx,StartAddr
lp: mov al, [BX] ... hacer algunos cálculos inc bx cmp bl, < (StartAddr + Length); < operador de prefijo significa "LSB" JNZ lp
Sería posible utilizar cmp bx,(StartAddr+Length)
, pero si las herramientas de compilación pueden apoyarlo, comparando sólo el byte bajo sería más rápido. Por otro lado, algunos tipos de herramientas de ensamblaje/enlace de 16 bits pueden requerir que todas las correcciones de direcciones se realicen con direcciones de 16 bits almacenadas en el código.
Debido a que diferentes sistemas permiten diferentes características en sus formatos de código de objeto, requieren diferentes características en sus lenguajes de ensamblaje para controlarlos. Los conjuntos de instrucciones pueden ser especificados por el fabricante del chip, pero las características para expresar el cálculo de dirección reubicable generalmente no lo son.
la única diferencia es que: los métodos que usa son dependientes del sistema operativo. por ejemplo: el método C printf() haría algo diferente en el sistema operativo porque cada sistema operativo lo maneja de otra manera. –