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?
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?
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.
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]
Lea otras preguntas en las etiquetas microprocessor microcontroller memory x86