¿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?
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.