segmentación de memoria en 8086

Si la memoria externa (1 MB) en un sistema basado en 8086 se segmenta en código, datos, pila y extra, que son todos de 64 kB, ¿qué hacemos con el resto de la memoria? ¿Se desperdicia?

Use diferentes segmentos y cámbielos según sea necesario. ¡Bienvenidos a los años 80!
Me trae recuerdos (nunca mejor dicho) ;)
Por cierto, no es una memoria externa ; ese sería el 5¼ ", el Winchester, etc. La RAM es interna. Tal vez esté confundido con la memoria extendida .

Respuestas (3)

En el 8086 cada segmento es, eso sí, 64KiB. 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 de 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 KiB a la vez, puede mover esa ventana de 64 KiB a voluntad para acceder a todo el espacio de memoria de 1 MiB.

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

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

consulte: http://en.wikipedia.org/wiki/Intel_8086#Segmentation

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 comienza en 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 extra). Las direcciones granulares de bytes se obtienen con registros de puntero: IP (puntero de instrucción), SP (puntero de pila) y BP (puntero base).

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

Si opera con datos sin especificar explícitamente el segmento, DS es el valor predeterminado (al menos en la notación 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]
Las direcciones de memoria que incluyen un desplazamiento [BP] usan el registro SS en lugar de DS; de hecho, creo que los prefijos de segmento se ignoran con instrucciones que usan esos modos de direccionamiento en el 8088, por lo que siempre usarán SS incluso si se proporciona otro prefijo de segmento.
Tiene razón sobre BP: el registro de segmento predeterminado es SS. Sin embargo, DS sigue siendo el predeterminado para AX, BX, CX, DX y, por supuesto, para SI, que olvidé mencionar. También está DI, que está asignado a ES si no recuerdo mal (al menos en las instrucciones de movsb/movsw).
En el 8086, hay 24 modos de direccionamiento de la forma base+disp+ofs, donde base es nada, BX o BP; disp es nada, SI o DI, y ofs es 0, 1 o 2 bytes. Tres opciones de tres vías permitirían 27 posibilidades, pero el modo [nada+nada+de] requiere un desplazamiento de 2 bytes, y [BP+nada+de] requiere un desplazamiento de 1 o 2 bytes. Las instrucciones STOSB, STOSW, MOVSB ​​y MOBSW se almacenan en ES:DI; esas son las únicas instrucciones que usan ES por defecto (y no pueden usar ningún otro segmento).
No es una notación de ensamblador la que dsestá predeterminada, es cómo funciona el conjunto de instrucciones. Es decir, si anula el segmento, el ensamblador generará el prefijo de anulación del segmento correspondiente; de ​​lo contrario, genera instrucciones sin prefijo, y esto efectivamente se convierte en dspredeterminado (para instrucciones que obedecen este principio).
Además, su uso de axes defectuoso. No existe tal modo de direccionamiento como [ax]. Puede usar [eax]comenzando con i386, o está limitado a [bx+si], [bx+di], [bp+si], [bp+di], [si], [di], [bp], [bx].