Aunque muchos programadores se quejaron de la arquitectura segmentada 8086 cuando se publicó, y aunque se podrían haber hecho algunas cosas para mejorarla (pero no lo fue), es aún mejor proporcionar un megabono de direcciones de memoria fungibles que cualquier otro Otra arquitectura de 16 bits que conozco.
Cada dirección lógica consta de dos partes: un segmento de 16 bits y un desplazamiento de 16 bits. Las direcciones físicas se generan agregando el registro de segmento, desplazado cuatro bits a la izquierda, al registro de desplazamiento (no desplazado) y generando el resultado de 20 bits. Por lo tanto, el segmento 0000 [todos los números en hexadecimal] las compensaciones 0000 a FFFF representan las direcciones físicas 00000 a 0FFFF. Agregar esas compensaciones a otros segmentos dará como resultado otros rangos de direcciones:
Seg. Phys. Range
0000 00000-0FFFF
0001 00010-1000F
0002 00020-1001F
0FFF 0FFF0-1FFEF
1000 10000-1FFFF
FFFF FFFF0-0FFEF (or 10FFEF if higher physical addressing bits exist)
Un efecto útil de esto es que si la memoria se puede dividir en fragmentos lógicos de 64 K o menos cada uno, alineados en límites de 16 bytes, se puede determinar para cada fragmento (en el momento de la asignación, que podría ser cuando el código es vinculado, cuando se carga, o mientras se ejecuta) el valor del segmento donde debería estar el mandril. Luego se puede acceder a la memoria dentro de cualquier parte simplemente cargando el valor de segmento predeterminado y luego usar las compensaciones directamente, sin tener que realizar ningún cálculo real en los registros de segmentos. Debido a que el registro de segmento se multiplica por 16 al calcular una dirección física, los fragmentos deben alinearse en los límites de 16 bytes. Sin embargo, a cambio de ese pequeño inconveniente, uno obtiene la capacidad de hacer que los fragmentos de memoria crucen los límites de 64K sin restricciones ni problemas.