assembly x86 memory-segmentation

assembly - ¿Qué registro de segmento se usa por defecto?



x86 memory-segmentation (1)

Estoy estudiando la arquitectura de la computadora del Manual de Intel. Lo que entiendo es que las instrucciones que damos son direcciones lógicas que consisten en un selector de segmento y un desplazamiento. Básicamente es CS register<<4 + offset . El Segment Selector asigna a GDT o LDT como se indica en el bit TI del selector de segmentos. GDT consta de Segment Descriptors de Segment Descriptors que tienen BASE , LIMIT y RPL y la salida es la dirección base. Esta base address + offset proporciona la logical address .

¿Cuáles son las reglas que deciden qué segmento de registro ( SS , DS , etc.) se aplica a las diferentes operaciones de memoria? por ejemplo, ¿qué determina qué segmento se usa para mov eax, [edi] ?


Puede usar un prefijo de anulación de segmento para seleccionar qué segmento se aplicará al operando de memoria en una instrucción.

Code fetch siempre usa CS .

El valor predeterminado la mayor parte del tiempo es DS (por ejemplo, para mov eax, [edi] ). Algunos desensambladores hacen que el segmento sea explícito incluso cuando es el predeterminado, por lo que se ve una gran cantidad de DS: complicando el desensamblaje.

La instrucción movs lee desde [DS:ESI] y escribe en [ES:EDI] , lo que facilita la copia entre segmentos sin prefijos de anulación de segmento. Algunas otras instrucciones de cadena también usan ES .

Los operandos de memoria usan esp o ebp como el registro base predeterminado para SS , y también lo hacen los accesos implícitos para instrucciones de pila como push / pop / call / ret .

FS y GS nunca son los predeterminados, por lo que se pueden usar para fines especiales (como el almacenamiento local de subprocesos) en un sistema de modelo de memoria plana como los sistemas operativos modernos de 32 y 64 bits.

wikipedia explica lo mismo aquí .

Esto también está documentado oficialmente en los manuales ISA de Intel . por ejemplo, en el Volumen 2 (la referencia del conjunto de instrucciones), Tabla 2-1. Los formularios de direccionamiento de 16 bits con ModR / M Byte tienen una nota al pie que dice:

El registro por segmentos predeterminado es SS para las direcciones efectivas que contienen un índice BP, DS para otras direcciones efectivas.

(tenga en cuenta que SP no es una dirección base válida para los modos de direccionamiento de 16 bits).

No hay una nota al pie equivalente para los modos de direccionamiento de 32 o 64 bits, por lo que los detalles deben estar en otro volumen del manual.

Ver también la wiki de la etiqueta x86 para más enlaces.