8086 Segmento de memoria que cae en límites de 16 bytes

3

Estaba leyendo en la hoja de datos 8086 y encontré esta frase que no pude entender en la organización de memoria:

  

la memoria se divide lógicamente en código, datos, datos adicionales y pila   segmentos de hasta 64K bytes cada uno, con cada segmento cayendo en   Límites de 16 bytes .

Sé lo que significan los segmantes pero lo que significan por "... segmento que cae en límites de 16 bytes ...

    
pregunta yahya tawil

3 respuestas

7

Esto significa que cada segmento comienza en una dirección que es un múltiplo de 16. Esto se logra de la siguiente manera.

Las direcciones en 8086 tienen una longitud de 20 bits. Las direcciones se calculan a partir de un inicio de segmento y un desplazamiento, ambos son de 16 bits. El inicio del segmento de 16 bits se desplaza hacia la izquierda en 4, luego se agrega el desplazamiento. Estas dos operaciones se realizan en un registro de 20 bits, por lo que el resultado es una dirección de 20 bits.

Dado que el inicio del segmento se desplaza a la izquierda en 4, el resultado de este cambio tiene sus 4 bits inferiores establecidos en cero en todo momento, por lo que es un múltiplo de 16. No hay manera de que un segmento comience en una dirección que no sea un múltiplo de 16 debido a esto.

    
respondido por el sharptooth
1

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.

    
respondido por el supercat
1

Haciendo los cálculos, 2 16 = 64k, lo que significa que un segmento de 64k puede direccionarse con un valor de 16 bits.

Por lo tanto, si tiene un conjunto de segmentos de pila de 64k, puede seleccionar el segmento único con un valor de dirección de segmento y luego el desplazamiento en el segmento es una dirección de 16 bits.

Tenga en cuenta que pueden ser hasta 64k, pero también más pequeños: en ese caso, la dirección debe ser de 16 bits para mantener la alineación. Y, nuevamente, para tener la alineación, cada segmento debe comenzar en la parte inferior de un bloque de 64k.

    
respondido por el clabacchio

Lea otras preguntas en las etiquetas