2. 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
3. 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)
4. Disposición de la memoria
1 MB
ROM
Antes de pasar el
9FBFF EBDA
control al sector de
arranque, la BIOS
(memoria usable)
configura el primer
MegaByte de memoria
de la siguiente forma:
Sector de Arranque IP = 0x7C00
7BFF cargado por la BIOS
(memoria usable)
4FF
BDA
3FF
CS = 0x0000
IDT
5. 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
6. 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)
7. 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.
8. Instrucción jmp
Memoria Memoria
Segmento de código (max: 64 KB)
Instrucción Instrucción
IP
offset
jmp offset La ejecución jmp offset
IP continúa en la nueva
posición de memoria
Se modifica solo IP
CS CS
El salto se realiza
dentro del mismo
Antes de jmp segmento de código Después de jmp
9. Instrucción ljmp
Memoria Memoria
instrucción instrucción
IP
offset
La ejecución continúa CS
en la nueva posición
de memoria apuntada
por seg:offset
ljmp seg:offset Se modifican CS e IP
IP
CS
El salto se realiza a otro
segmento de código
Antes de ljmp Después de ljmp
10. 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.
11. 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.
12. Ejemplo: instrucción je
Memoria Memoria
La ejecución
continúa en la nueva
Segmento de código (max: 64 KB)
posición de memoria
ax = bx Instrucción Sólo si la condición Instrucción
se cumple IP
Instrucción Si ax = bx
ax != bx Instrucción
je offset je offset
IP En caso contrario, la
cmp ax, bx
ejecución continua
en la instrucción
siguiente a ‘je’
CS CS
Salto condicional
Antes de je Después de je
13. 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).
14. Llamada a rutinas locales (1/2)
Memoria Memoria
ret ret
Segmento de código
rutina
… …
instrucción instrucción
IP
offset
IP’ instrucción IP’ instrucción
call offset call offset
IP
CS CS
Al invocar la rutina, se
Segmento de pila
SP almacena la dirección
de retorno en el tope IP’
SP
de la pila y el control
se transfiere al código
de la rutina
SS SS
Antes de invocar la rutina Al invocar la rutina
15. Llamada a rutinas locales (2/2)
Memoria
Memoria
La instrucción ‘ret’ ret
ret
IP permite ‘retornar’ la …
…
ejecución a otra instrucción
instrucción posición de memoria.
El procesador extrae
del tope de la pila el IP’ instrucción
IP’ instrucción valor que debe asignar IP
a IP para continuar la call offset
call offset
ejecución en otra CS
CS posición de memoria.
SP
IP IP’ IP’
IP’
SP
SS
SS
Al retornar de la rutina
Antes de retornar de la rutina
16. 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
17. Paso de parámetros a rutinas (1/2)
Memoria Memoria
ret ret
Segmento de código
rutina
… …
instrucción instrucción
IP
IP’ instrucción
offset
IP call offset IP’ instrucción
push param0 call offset
push param1
CS CS
Al invocar la rutina, se
Segmento de pila
almacena la dirección param1
param1 de retorno en el tope param0
param0 de la pila y el control
SP se transfiere al código IP’
SP
de la rutina
SS Los parámetros se SS
deben encontrar en la
Antes de invocar la rutina pila en orden inverso Al invocar la rutina
18. Paso de parámetros a rutinas (2/2)
Memoria Memoria
IP ret ret
Segmento de código
rutina
… …
instrucción instrucción
instrucción
call offset IP IP’ instrucción
push param0 Al retornar de la
rutina, se toma la call offset
push param1 dirección de retorno
CS CS
(IP) del tope de la pila
Segmento de pila
y se continúa la param1
param1 ejecución en ese param0
param0 punto. SP
Los parámetros
IP’ almacenados en la
SP
SS pila se deben sacar SS
manualmente.
Antes de retornar Al invocar la rutina
19. 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).
20. Llamada a rutinas en otro segmento
(1/2)
Memoria Memoria
lret lret
… …
instrucción instrucción
offset
IP
seg CS
IP’ instrucción IP’ instrucción
Se invoca la rutina lcall seg:offset
lcall seg:offset ubicada en la
IP
dirección lineal
CS seg:offset
IP’ IP’
Se modifican CS e IP
CS CS
SP SP
El salto se realiza a otro
segmento de código
SS SS
Antes de lcall Después de lcall
21. Llamada a rutinas en otro segmento
(2/2)
Memoria Memoria
lret lret
IP …
…
instrucción instrucción
CS
Al retornar con ‘lret’
(ret far), se recupera
CS e IP de la pila. La IP’ instrucción
instrucción IP
ejecución continúa en lcall seg:offset
lcall seg:offset la nueva direción
apuntada por CS:IP CS
SP
IP’ IP’
Se modifican CS e IP
CS CS
SP
El salto se realiza a otro
segmento de código
SS SS
Antes de lret Después de lret
22. 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.
23. Interrupción por software (1/3)
Memoria
…
Rutinas de manejo de interrupción definidas por la BIOS
rutina
rutina
seg..offset 255
IP’ instrucción
En modo real,
int # la IVT
IP contiene 256
CS … entradas : 256
SP seg:offset apuntadores a
#
# las rutinas de
seg:offset 1 manejo de
seg:offset 0 interrupción
SS IVT = Tabla de Vectores de
Interrupción
Antes de invocar la interrupción
24. Interrupción por software (2/3)
Memoria Rutina de manejo de Memoria
interrupción
iret iret
… …
instrucción instrucción
offset
IP
seg CS
IP’ instrucción IP’ instrucción
int # int #
IP
CS
SP
# IP’
CS
FLAGS
SP
SS SS
seg:offset
Antes de invocar la interrupción Inicio del manejo de la interrupción
25. Interrupción por software (3/3)
Memoria Memoria
Rutina de manejo de
iret interrupción iret
IP
… …
instrucción instrucción
CS Para retornar de
IP’ instrucción la interrupción IP’ instrucción
(iret), se extrae
int # int #
de la pila los IP
valores de
CS
FLAGS, CS e IP.
La ejecución SP
IP’ continúa en la IP’
CS nueva posición CS
CS:IP
FLAGS FLAGS
SP
SS SS
Antes de retornar de la interrupción Luego de retornar de la interrupción
26. 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.).
27. Simular un retorno de interrupción
Memoria Nuevo sitio e Memoria
ejecución
… …
instrucción instrucción
offset
IP
seg CS
iret iret
IP
push offset push offset
push seg push seg
CS push valor_flags push valor_flags
Al ‘simular’ el
retorno de
interrupción, el SP
offset offset
procesador
seg continúa la seg
FLAGS ejecución en
SP otra posición FLAGS
SS de memoria SS
Antes de simular el retorno Luego del ‘retorno’ simulado
28. Referencias
Manuales de Intel
http://www.intel.com/products/processor/manuals/