28
Programación de IA-32 Modo Real Introducción Erwin Meza Vega

Ia32 Modo Real

Embed Size (px)

DESCRIPTION

IA32 - Modo Real

Citation preview

Page 1: Ia32 Modo Real

Programación de IA-32

Modo Real

Introducción

Erwin Meza Vega

Page 2: Ia32 Modo Real

IA-32 Modo real (1/2)

Acceso sólo a características limitadas del procesador

Se comporta como un 8086 muy rápido

Uso de segmentación de una forma especial

Segmentos de 64 KB

Los registros de segmento (CS, DS, ES, FS, GS, SS) apuntan a la base de un segmento en memoria, dividida en 16

Es necesario establecer explícitamente los valores en los registros de segmento

Sólo se puede tener acceso al primer Megabyte de memoria

Page 3: Ia32 Modo Real

IA-32 Modo Real (2/2)

La BIOS lee el sector de arranque del dispositivo (disco), y lo copia en la posición de memoria 0x7C00 (31744)

El sector de arranque recibe el control de la ejecución.

Se deben configurar los registros de segmento CS, DS

Se debe crear una pila en una región de la memoria que no esté siendo utilizada (configurar SS = base/16 y SP = tope)

Para recordar: la pila crece hacia atrás en la memoria, es decir de la dirección más alta a la más baja.

En modo real las operaciones sobre la pila siempre operan sobre 16 bits (2 bytes)

Push: decrementa SP en 2 y almacena el valor

Pop: saca el valor apuntado por SP e incrementa SP en 2 (bytes)

Page 4: Ia32 Modo Real

Disposición de la memoria

IDT CS = 0x0000

1 MB

3FF BDA

4FF

(memoria usable)

7BFF

Sector de Arranque cargado por la BIOS

(memoria usable)

9FBFF EBDA

ROM

IP = 0x7C00

Antes de pasar el control al sector de arranque, la BIOS configura el primer MegaByte de memoria de la siguiente forma:

Page 5: Ia32 Modo Real

Flujo de ejecución

El procesador realiza el siguiente ciclo general:

1. FETCH: Lee la instrucción de memoria apuntada por CS:IP

• Incrementa IP en el número de bytes que ocupa la instrucción leída

2. DECODE: Interpreta la instrucción leída, para determinar la operación y los operandos que intervienen

• Busca los operandos que intervienen en la instrucción, calcula las direcciones de memoria correspondientes y obtiene los datos requeridos

3. EXECUTE: Ejecuta la instrucción leída e interpretada

• Puede continuar la ejecución en otra posición de memoria, generar errores (excepciones), modificar FLAGS…

4. Vuelve al paso 1

La ejecución continúa en la instrucción que se encuentra en memoria inmediatamente después de la que se acabó de ejecutar, a menos que en el paso 3 se modifique el flujo de la ejecución

Page 6: Ia32 Modo Real

Modificar del flujo de la ejecución

El procesador ofrece varias alternativas para modificar el flujo de ejecución (continuar la ejecución en otra posición de memoria).

Algunas alternativas son:

1. Saltos (instrucciones jmp, ljmp, jz, je, jne, …)

2. Llamada a rutinas (instrucciones call, lcall)

3. Llamada a una interrupción (instrucción int)

4. Retorno de interrupciones (instrucción iret) realizados por el procesador o ‘simulados’.

5. Errores al ejecutar una instrucción (división por cero, etc). El procesador lanza una “Excepción” (interrupción)

En la práctica todas las alternativas modifican el valor del registro IP (Instruction Pointer)

Algunas de éstas también modifican el valor del registro de segmento de código (CS)

Page 7: Ia32 Modo Real

Saltos incondicionales

Transfieren el control de la ejecución a otra posición de memoria

• Jmp: Salto a otra posición dentro del mismo segmento de código: Se realiza especificando el desplazamiento dentro del segmento actual. Solo modifica el registro IP.

• Ljmp, Jmp Far: Salto a otro segmento de código. Se realiza especificando una dirección lógica (seg : offset). Este tipo de salto modifica al registro CS y al registro IP.

Page 8: Ia32 Modo Real

Instrucción jmp

jmp offset

Memoria

Se

gm

en

to d

e c

ód

igo

(m

ax:

64

KB

)

CS

IP o

ffse

t

Instrucción

jmp offset

Memoria

CS

IP Instrucción

La ejecución continúa en la nueva posición de memoria

Antes de jmp Después de jmp

Se modifica solo IP

El salto se realiza dentro del mismo segmento de código

Page 9: Ia32 Modo Real

Instrucción ljmp

ljmp seg:offset

Memoria

CS

IP

offse

t

Memoria

CS

IP

La ejecución continúa en la nueva posición de memoria apuntada por seg:offset

Antes de ljmp Después de ljmp

Se modifican CS e IP

instrucción instrucción

El salto se realiza a otro segmento de código

Page 10: Ia32 Modo Real

Saltos condicionales

Dependen del estado del registro FLAGS. Los bits de este registro se pueden modificar implícitamente cuando se ejecuta una instrucción

• Ej: Cuando la operación aritmética o lógica que se acabó de ejecutar da como resultado cero, se activa el bit ZF (Zero Flag) en el registro FLAGS (ZF = 1)

• En este caso se puede ejecutar la instrucción jz (jump if zero), para transferir el control a otra posición de memoria si la operación dio como resultado cero.

Al igual que en los saltos incondicionales, se debe especificar el nuevo desplazamiento dentro del segmento de código.

Page 11: Ia32 Modo Real

Saltos condicionales

Algunas instrucciones de salto condicional:

• jz: jump if zero, jnz: jump if not zero

• je, jne, jl, jle, jg, jge: Se pueden utilizar para pasar el control a otra posición de memoria si un operando es:

• igual (e),

• no igual (ne)

• menor (l)

• menor o igual (le)

• mayor (g)

• mayor o igual (ge)

que el otro operando.

• jc: jump if carry. Saltar a otra posición si el bit Carry Flag (Acarreo) se encuentra en 1.

Page 12: Ia32 Modo Real

Ejemplo: instrucción je

je offset

Memoria

Se

gm

en

to d

e c

ód

igo

(m

ax:

64

KB

)

CS

IP

Instrucción

je offset

Memoria

CS

IP Instrucción

La ejecución continúa en la nueva posición de memoria Sólo si la condición se cumple

Antes de je Después de je

Salto condicional

cmp ax, bx

Instrucción Instrucción

ax = bx

ax != bx

En caso contrario, la ejecución continua en la instrucción siguiente a ‘je’

Si ax = bx

Page 13: Ia32 Modo Real

Llamada a rutinas

Similares a las instrucciones jmp y ljmp:

• call: Invocar a una rutina dentro del mismo segmento de código. Solo modifica el registro IP.

• lcall, call far: Invocar una rutina en otra posición de memoria, especificada por una dirección lógica (seg : offset). Este tipo de salto modifica al registro CS y al registro IP.

Luego de ejecutar la rutina, se debe ‘retornar’ a la posición desde la cual se invocó. Para lograr este propósito, el procesador almacena automáticamente en la pila:

• En el caso de call, el valor de IP al cual se debe ‘retornar’

• En el caso de lcall, el valor de CS e IP al cual se debe retornar (ya que con lcall se modifica tanto CS como IP).

Page 14: Ia32 Modo Real

Llamada a rutinas locales (1/2)

call offset

Memoria

Se

gm

en

to d

e c

ód

igo

CS

IP

instrucción

Antes de invocar la rutina

ret

rutin

a

offse

t

instrucción IP’

Se

gm

en

to d

e p

ila

SS

SP

call offset

Memoria

CS

IP instrucción

Al invocar la rutina

ret

instrucción

SS

SP IP’

Al invocar la rutina, se almacena la dirección de retorno en el tope de la pila y el control se transfiere al código de la rutina

IP’

Page 15: Ia32 Modo Real

Llamada a rutinas locales (2/2)

call offset

Memoria

CS

IP

instrucción

Al retornar de la rutina

ret

instrucción

SS

SP

La instrucción ‘ret’ permite ‘retornar’ la ejecución a otra posición de memoria. El procesador extrae del tope de la pila el valor que debe asignar a IP para continuar la ejecución en otra posición de memoria.

call offset

Memoria

CS

IP

instrucción

Antes de retornar de la rutina

ret

instrucción

SS

SP IP’

IP’ IP’

IP’ IP IP’

Page 16: Ia32 Modo Real

Paso de parámetros a rutinas

Antes de invocar la rutina (instrucción call) se deben ingresar los parámetros en la pila usando la instrucción push.

Los parámetros se deben almacenar en la pila en el orden inverso al cual se espera dentro de la rutina

En C: rutina (param0, param1, … , paramN)

Se deben ingresar de la siguiente forma:

push paramN

….

push param1

push param0

call rutina

Page 17: Ia32 Modo Real

Paso de parámetros a rutinas (1/2)

call offset

Memoria

Se

gm

en

to d

e c

ód

igo

CS

IP

instrucción

Antes de invocar la rutina

ret

rutin

a

offse

t push param0

IP’

Se

gm

en

to d

e p

ila

SS

SP

call offset

Memoria

CS

IP instrucción

Al invocar la rutina

ret

instrucción

SS

SP IP’

Al invocar la rutina, se almacena la dirección de retorno en el tope de la pila y el control se transfiere al código de la rutina Los parámetros se deben encontrar en la pila en orden inverso

IP’

push param1

instrucción

param0

param1 param0

param1

Page 18: Ia32 Modo Real

Paso de parámetros a rutinas (2/2)

call offset

Memoria

Se

gm

en

to d

e c

ód

igo

CS

instrucción

Antes de retornar

ret

rutin

a

push param0

Se

gm

en

to d

e p

ila

SS

SP

call offset

Memoria

CS

IP

instrucción

Al invocar la rutina

ret

instrucción

SS

SP

Al retornar de la rutina, se toma la dirección de retorno (IP) del tope de la pila y se continúa la ejecución en ese punto. Los parámetros almacenados en la pila se deben sacar manualmente.

IP’

push param1

instrucción

param0

param1 param0

param1

IP

IP’

Page 19: Ia32 Modo Real

Paso de parámetros a rutinas

Luego de retornar de la rutina, se deben extraer los parámetros almacenados en la pila. Esto se puede lograr usando la instrucción pop tantas veces como parámetros se haya incluido en la pila, o desplazando el apuntador de la pila hacia arriba en la memoria:

add SP, M

Donde M se obtiene de multiplicar el número de parámetros almacenados en la pila por 2 (debido a que cada parámetro en la pila ocupa 1 word : 2 bytes).

Page 20: Ia32 Modo Real

Llamada a rutinas en otro segmento (1/2)

lcall seg:offset

Memoria

CS

IP

offse

t

Memoria

CS

Se invoca la rutina ubicada en la dirección lineal seg:offset

Antes de lcall Después de lcall

Se modifican CS e IP

instrucción

El salto se realiza a otro segmento de código

lret

seg

instrucción

SS

SP CS

IP’

IP’

instrucción

lret

IP

SS

SP CS

IP’

lcall seg:offset

instrucción IP’

Page 21: Ia32 Modo Real

Llamada a rutinas en otro segmento (2/2)

lcall seg:offset

Memoria

CS

IP

Memoria

CS Al retornar con ‘lret’ (ret far), se recupera CS e IP de la pila. La ejecución continúa en la nueva direción apuntada por CS:IP

Después de lret Antes de lret

Se modifican CS e IP

instrucción

El salto se realiza a otro segmento de código

lret

instrucción

SS

SP

CS

IP’

IP’

instrucción

lret

… IP

SS

SP CS

IP’

lcall seg:offset

instrucción

Page 22: Ia32 Modo Real

Llamada a interrupción

Es posible invocar una interrupción por software, mediante la instrucción int.

• Al recibir una interrupción, el procesador automáticamente almacena en la pila el valor de FLAGS, CS e IP (la posición actual de ejecución)

• Luego el procesador transfiere el control a una rutina de manejo de interrupción.

• Cuanto la rutina de manejo de interrupción termina, ejecuta la instrucción ‘iret’. Esta instrucción extrae del tope de la pila los valores de FLAGS, CS e IP en los cuales se debe continuar con la ejecución.

En modo real, las rutinas de manejo de interrupción son configuradas por la BIOS al inicio del sistema

• La BIOS configura en la posición 0 de la memoria una tabla (arreglo) llamada ‘Tabla de Descriptores de Interrupción’ (IDT). Cada entrada de esta tabla contiene las direcciones lógicas (seg:offset) en las cuales se encuentran las rutinas de manejo de interrupción.

Page 23: Ia32 Modo Real

Interrupción por software (1/3)

int #

Memoria

CS

IP

Antes de invocar la interrupción

instrucción

SS

SP

IP’

IVT = Tabla de Vectores de Interrupción

seg:offset

seg:offset

seg:offset

seg..offset

#

0

1

255

Rutinas de manejo de interrupción definidas por la BIOS

En modo real, la IVT contiene 256 entradas : 256 apuntadores a las rutinas de manejo de interrupción

#

rutina

rutina

Page 24: Ia32 Modo Real

Interrupción por software (2/3)

int #

Memoria

CS

IP

Antes de invocar la interrupción

instrucción

SS

SP

IP’

instrucción

iret

seg

offse

t

int #

CS

IP

instrucción

SS SP

IP’

instrucción

iret

FLAGS

CS

IP’

Inicio del manejo de la interrupción

Memoria Rutina de manejo de interrupción

#

seg:offset

Page 25: Ia32 Modo Real

Interrupción por software (3/3)

int #

Memoria

CS

IP

Antes de retornar de la interrupción

instrucción

SS

SP

IP’

instrucción

iret

int #

CS

IP

instrucción

SS SP

IP’

instrucción

iret

FLAGS

CS

IP’

Luego de retornar de la interrupción

Memoria Rutina de manejo de interrupción

FLAGS

CS

IP’

Para retornar de la interrupción (iret), se extrae de la pila los valores de FLAGS, CS e IP. La ejecución continúa en la nueva posición CS:IP

Page 26: Ia32 Modo Real

Simular un retorno de interrupción

Conociendo el mecanismo usado por el procesador para retornar de una interrupción (que almacena automáticamente FLAGS, CS e IP), es posible pasar el control a otra posición de memoria ‘simulando’ que ha ocurrido una interrupción y ejecutando la instrucción ‘iret’

• Se debe almacenar en la pila el valor de FLAGS, el nuevo valor de CS y el nuevo valor de IP al cual se desea pasar el control.

• Luego se invoca la instrucción ‘iret’

Luego de pasar al nuevo punto de ejecución no es posible retornar al punto anterior.

Un mecanismo similar a éste se usa en modo protegido para implementar la multitarea. Además de FLAGS, CS e IP se almacenan y recuperan los valores de los registros de propósito general (eax, ebx, .. etc.).

Page 27: Ia32 Modo Real

Simular un retorno de interrupción

push offset

Memoria

CS

IP

Antes de simular el retorno

iret

SS SP

instrucción

seg

offse

t

CS

IP

SS

SP

instrucción

FLAGS

seg

offset

Luego del ‘retorno’ simulado

Memoria Nuevo sitio e ejecución

push seg

push valor_flags

FLAGS

seg

offset

push offset

iret

push seg

push valor_flags Al ‘simular’ el retorno de interrupción, el procesador continúa la ejecución en otra posición de memoria

Page 28: Ia32 Modo Real

Referencias

Manuales de Intel

http://www.intel.com/products/processor/manuals/