segmentación de memoria en 8086

3

Si la memoria externa (1 MB) en el sistema basado en 8086 está segmentada en código, datos, pila y adicionales, que son todos de 64 KB, ¿qué hacemos con el resto de la memoria? ¿Se desperdicia?

    
pregunta saurabh

3 respuestas

10

En el 8086, cada segmento es, sí, 64 KB. Sin embargo, esos segmentos pueden moverse.

Establece un "puntero de segmento" que define dónde comienza un segmento. Actúa como un desplazamiento de dirección, que se agrega a la dirección interna de 16 bits del contador del programa (u otro registro de indexación).

Cambiar los punteros de segmento es un asunto trivial, por lo que aunque solo puede acceder a 64 KB a la vez, puede mover esa ventana de 64 KB a voluntad para acceder a todo el 1 MB de espacio de memoria.     

respondido por el Majenko
4

También tenga en cuenta que dado que el 8086 tenía un esquema de direccionamiento de 20 bits, esas compensaciones de segmento se superponían cada 16 bytes.

Por ejemplo, si tiene un CS en 0x0010 y un SS en 0x0011, [CS]: [0x0010] = [SS]: [0x0000]

vea: enlace

    
respondido por el pm_752566
2

El número de segmento determina el lugar en la memoria. El segmento 0 comienza en la dirección física 0 de la memoria. El segmento 1 inicia 0x10 bytes desde el principio, el segmento 2 en 0x20, etc.

Sí, los segmentos comienzan cada 0x10 bytes pero tienen una longitud de 64k, lo que significa que se superponen mucho.

Hay registros de segmento: CS (segmento de código), DS (segmento de datos), SS (segmento de pila) y ES (segmento adicional). Las direcciones de bytes se obtienen con indicadores de puntero: IP (puntero de instrucción), SP (puntero de pila) y BP (puntero de base).

La instrucción actualmente ejecutada se encuentra en CS: IP (número de segmento de CS + desplazamiento de bytes de IP).

Si opera con datos sin especificar explícitamente el segmento, DS es el valor predeterminado (al menos en la notación del Turbo Assembler). Por ejemplo:

mov cx, [bp]

es lo mismo que:

mov cx, ds:[bp]

No estoy seguro de la sintaxis exacta (fue hace unos 15 años desde que la usé).

No puede asignar un valor a un registro de segmento directamente. Tienes que hacerlo a través de registros generales, por ejemplo:

mov ax, 100h
mov ds, ax

Entonces, para cargar una palabra desde la dirección física 0x105 en BX, puede hacerlo de esta manera:

xor ax, ax  ; equal to mov ax, 0 but faster
mov ds, ax
mov ax, 105h
mov bx, [ax]

o, usando un segmento diferente:

mov ax, 10h
mov ds, ax
mov ax, 5
mov bx, [ax]
    
respondido por el emes

Lea otras preguntas en las etiquetas