Red de conocimiento informático - Aprendizaje de código fuente - ¿Cuál es la relación entre las direcciones de segmento de datos, segmento de pila, segmento de código y segmento de código?

¿Cuál es la relación entre las direcciones de segmento de datos, segmento de pila, segmento de código y segmento de código?

Para 8086PC, un grupo de celdas de memoria se puede definir como un segmento durante la programación. Podemos utilizar un conjunto de unidades de almacenamiento con una longitud de n (N (N menor o igual a 64 KB), direcciones continuas y una dirección inicial que sea múltiplo de 16 como espacio interno para almacenar datos, definiendo así una unidad de almacenamiento de datos. segmento Por ejemplo, use 123B0H-123b9h Para almacenar datos, podemos pensar en 123b0h-123b9h como un segmento de datos con una dirección de segmento de 123B0H y una longitud de 10.

Cómo acceder a los datos en el. ¿Segmento de datos? Tratar una memoria como un segmento de datos es nuestra programación. Podemos usar DS para almacenar la dirección del segmento de datos durante una operación específica y luego usar instrucciones relevantes para acceder a unidades específicas en el segmento de datos según sea necesario. /p>

Por ejemplo, las unidades de almacenamiento de 123b0h-123b9h se definen como un segmento de datos. Ahora necesitamos acumular los datos de las primeras tres unidades en este segmento de datos. , 123BH

mov ds, ax; enviar 123BH a. se usa como la dirección del segmento de datos

mov al, 0;

Agregar al, [0]; cambiar el valor en la primera unidad del segmento de datos (la dirección de desplazamiento es 0) y agregarlo a

Agregar al, [1]. ; agregue el valor de la segunda unidad del segmento de datos (la dirección de desplazamiento es 1) a

Add al, [2]; 2) a a1.

Pila: La pila es un espacio de almacenamiento con un método de acceso especial. Su particularidad es que los datos que finalmente ingresan a este espacio salen primero.

El 8086. La CPU proporciona instrucciones relevantes en forma de pila para acceder al espacio de memoria. Es decir, cuando se programa según 8086, se puede utilizar una sección de memoria como pila.

Uso de la CPU. proporciona instrucciones push y pop. Las dos instrucciones básicas son PUSH y POP. Por ejemplo, push ax significa enviar los datos en el registro ax a la pila y pop ax significa tomarlos desde la parte superior de la pila. a ax.8086 CPU se realiza en unidades de palabras

Por ejemplo, podemos usar memoria 10000h-1000fh como pila

mov ax, 0123H

p>.

Empujar hacha

mov bx, 226H

Empujar bx

mov cx, 1122H

Empujar cx

Barril explosivo

pop bx

Pop cx

Hay dos problemas aquí

Primero usamos 10000H - 1000FH como memoria. una pila Cuando la CPU ejecuta instrucciones push y pop, accederá a este espacio de acuerdo con la regla de último en entrar, primero en salir. Sin embargo, una pregunta importante es cómo sabe la CPU que se utiliza el espacio 10000h-1000fh. una pila?

En segundo lugar, al ejecutar push ax y otras instrucciones de entrada en la parte superior de la pila, el contenido del registro debe colocarse en la unidad superior de la pila actual y convertirse en el nuevo elemento superior de la pila cuando se ejecutan pop ax y otras instrucciones; , debería Los datos se toman de la ubicación superior de la pila y se envían al registro. Obviamente, al realizar push and pop, debes saber qué celda es la celda superior de la pila, pero ¿cómo lo sabes?

En la CPU 8086, hay dos registros, el registro de segmento SS y el registro SP. La dirección del segmento en la parte superior de la pila se almacena en ss y la dirección de desplazamiento se almacena en SP. En cualquier momento, SS:SP apunta al elemento superior de la pila. Al ejecutar instrucciones push y pop, la CPU obtiene la dirección superior de la pila de ss y SP.

Ahora podemos describir completamente las funciones de las instrucciones push y pop, como push ax.

La implementación de Push Axe se completa en los siguientes dos pasos.

1.SP = SP -2, SS: SP apunta a la celda frente a la parte superior actual de la pila, y la celda frente a la parte superior actual de la pila es la parte superior de la nueva pila;

2. Cambiar ax El contenido se envía a la ubicación de memoria señalada por SS:SP, y SS:SP apunta a la parte superior de la nueva pila.

Hay una pseudoinstrucción importante asegurar en masm. El uso específico de asegurar se detalla a continuación.

Asumir instrucciones para la configuración del registro de segmento

Muchas instrucciones de aserción asumen un segmento predeterminado. Por ejemplo,

JMP asume segmentos relacionados con el registro CS, push and pop asume

segmentos relacionados con el registro SS y la instrucción MOV toma estos segmentos

Asociado al registro DS.

Cuando el asertor necesita hacer referencia a una dirección, debe saber qué segmento contiene la dirección. Asume autoridad de mando mediante el uso asignado a

. La sintaxis es:

Asumir registro seg: ubicación seg[, segregister: ubicación seg]

Asumir registro de datos; tipo calificado [, registro de datos: tipo calificado]

Asumir [registro:]NADA[, registro: NADA]

Asumir registro: FLAT [, registro: FLAT]

La instrucción ASSUME puede definir un segmento para cada registro de segmento. Este

segregister puede ser CS, DS, ES o SS (y FS y GS en 80386/486).

Segmento que aborda supuestos de pseudoinstrucción

Formato: Supongamos [registro de segmento]: [nombre del segmento], [registro de segmento]: [nombre del segmento],...

Función: Se utiliza para notificar al ensamblador que el contenido de los registros de segmento CS, DS, ES y SS se establecerán en las direcciones de segmento de estos segmentos o grupos. Por lo tanto, las direcciones del segmento de código, segmento de datos y segmento de pila se pueden configurar manualmente.

Cuando se enciende la máquina por primera vez, la pila no se ha establecido, por lo que no se puede utilizar en este momento.