O Estabelecimento de Contratos Eletr onicos com o Ambiente ...
Sistemas Electr onicos para el Tratamiento de la Informaci on 1jesman/BigSeti/seti1/Protegido/...la...
Transcript of Sistemas Electr onicos para el Tratamiento de la Informaci on 1jesman/BigSeti/seti1/Protegido/...la...
Sistemas Electronicos para el
Tratamiento de la Informacion 1
Jesus M. Hernandez Mangas
10 de enero de 2011
2
Copyright c⃝Jesus M. Hernandez Mangas, 2004, 2005, 2006, 2007, 2008,
2009, 2010, 2011
Profesor Titular de Electronica en la Universidad de Valladolid
No esta permitida la reproduccion total o parcial de este libro, ni su tra-
tamiento informatico, ni la transmision de ninguna forma o por cualquier
medio, ya sea electronico, mecanico, por fotocopia, por registro u otros
metodos, sin el permiso previo y por escrito de los titulares del Copyright.
Indice general
Prologo 9
1. Introduccion 13
1.1. Nociones generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2. ¿Que es un microprocesador? . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.3. Microprocesadores RISC y CISC . . . . . . . . . . . . . . . . . . . . . . . . 19
2. Arquitectura Intel. Nivel aplicacion 31
2.1. Entorno basico de ejecucion . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.1.1. Modos de operacion . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.1.2. Organizacion de la memoria . . . . . . . . . . . . . . . . . . . . . . 32
2.1.3. Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.1.4. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.1.5. Modos de direccionamiento . . . . . . . . . . . . . . . . . . . . . . . 39
2.2. Repertorio basico de instrucciones . . . . . . . . . . . . . . . . . . . . . . . 40
2.2.1. Transferencia de datos . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.2.2. Aritmeticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.2.3. Aritmetica BCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.2.4. Logicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.2.5. Desplazamientos y rotaciones . . . . . . . . . . . . . . . . . . . . . 48
2.2.6. Manejo de bits o byte . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.2.7. Transferencia de control . . . . . . . . . . . . . . . . . . . . . . . . 52
2.2.8. Manejo de bloques de datos . . . . . . . . . . . . . . . . . . . . . . 56
2.2.9. Control de FLAGS . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.2.10. Acceso a registros de segmento . . . . . . . . . . . . . . . . . . . . 59
2.2.11. Miscelanea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3
4 INDICE GENERAL
3. Unidad de punto flotante (FPU) 61
3.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.2. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.2.1. Numeros reales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.2.2. Numeros enteros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.2.3. Numeros reales especiales . . . . . . . . . . . . . . . . . . . . . . . 63
3.3. Arquitectura de la FPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.3.1. Pila de registros de datos . . . . . . . . . . . . . . . . . . . . . . . . 64
3.3.2. Registro de estado (Status Word: SW) . . . . . . . . . . . . . . . . 64
3.3.3. Registro de control (Control Word: CW) . . . . . . . . . . . . . . . 66
3.3.4. Registro de marcas (Tag Word: TW) . . . . . . . . . . . . . . . . . 67
3.3.5. Punteros de operandos e instrucciones . . . . . . . . . . . . . . . . 67
3.4. Repertorio de instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.4.1. Transferencia de datos . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.4.2. Aritmeticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.4.3. De comparacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.4.4. Funciones trigonometricas . . . . . . . . . . . . . . . . . . . . . . . 71
3.4.5. Otras funciones trascendentales . . . . . . . . . . . . . . . . . . . . 72
3.4.6. Carga de constantes . . . . . . . . . . . . . . . . . . . . . . . . . . 72
3.4.7. Control de la FPU . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
3.4.8. Resumen de instrucciones . . . . . . . . . . . . . . . . . . . . . . . 74
4. Tecnologıa MMX 75
4.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.2. Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.3. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.4. Modelo de ejecucion SIMD . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.5. Formato de los datos en memoria . . . . . . . . . . . . . . . . . . . . . . . 77
4.6. Saturacion y wraparound (enrollamiento) . . . . . . . . . . . . . . . . . . . 77
4.7. Conjunto de instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.7.1. Transferencia de datos . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.7.2. Aritmeticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.7.3. De comparacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.7.4. De conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.7.5. Logicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.7.6. Desplazamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
INDICE GENERAL 5
4.7.7. Instruccion EMMS . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.7.8. Resumen de instrucciones . . . . . . . . . . . . . . . . . . . . . . . 82
5. Arquitectura INTEL
(Nivel Sistema) 83
5.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.2. Modos de operacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.3. Entorno de ejecucion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
5.3.1. Bits del sistema (EFLAGS) . . . . . . . . . . . . . . . . . . . . . . 86
5.3.2. Registros para la gestion de la memoria . . . . . . . . . . . . . . . . 87
5.3.3. Registros de control . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.4. Instrucciones a nivel del sistema . . . . . . . . . . . . . . . . . . . . . . . . 91
5.4.1. Carga y almacenamiento en registros del sistema. . . . . . . . . . . 91
5.4.2. Verificacion de los privilegios de acceso . . . . . . . . . . . . . . . . 92
5.4.3. Carga y almacenamiento en registros de depuracion . . . . . . . . . 92
5.4.4. Invalidacion de caches y TLBs . . . . . . . . . . . . . . . . . . . . . 93
5.4.5. Control del procesador . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.4.6. Contadores de Monitorizacion del Rendimiento . . . . . . . . . . . 93
6. La memoria en modo protegido 95
6.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.2. Segmentacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.2.1. Modelos de memoria . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.2.2. Direcciones logicas, lineales y fısicas . . . . . . . . . . . . . . . . . . 98
6.2.3. Registros selectores de segmento . . . . . . . . . . . . . . . . . . . . 99
6.2.4. Tablas de Descriptores de segmento . . . . . . . . . . . . . . . . . . 100
6.2.5. Descriptores de segmento . . . . . . . . . . . . . . . . . . . . . . . . 100
6.3. Paginacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
6.3.1. Paginacion normal . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
6.3.2. Extension del direccionamiento fısico . . . . . . . . . . . . . . . . . 107
7. Proteccion en el acceso a memoria 111
7.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
7.2. Proteccion en la segmentacion . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.2.1. Acceso a segmentos de datos . . . . . . . . . . . . . . . . . . . . . . 113
7.2.2. Acceso a segmentos de codigo . . . . . . . . . . . . . . . . . . . . . 113
7.3. Proteccion en la paginacion . . . . . . . . . . . . . . . . . . . . . . . . . . 118
6 INDICE GENERAL
8. Gestion de interrupciones y excepciones 121
8.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
8.1.1. Clasificacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
8.1.2. Vectores de interrupcion y excepcion . . . . . . . . . . . . . . . . . 123
8.1.3. Prioridades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
8.2. Gestion en modo real . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
8.2.1. Tabla de Vectores de Interrupcion . . . . . . . . . . . . . . . . . . . 124
8.2.2. Funcionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
8.2.3. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
8.3. Gestion en modo protegido . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
8.3.1. Tabla de Descriptores de Interrupcion: IDT . . . . . . . . . . . . . 127
8.3.2. Funcionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
8.3.3. Habilitacion y deshabilitacion . . . . . . . . . . . . . . . . . . . . . 130
9. Gestion de tareas 133
9.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
9.2. Estructuras de datos de una Tarea . . . . . . . . . . . . . . . . . . . . . . 133
9.3. Funcionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
10.Estado inicial y gestion del procesador 141
10.1. Estado inicial del microprocesador . . . . . . . . . . . . . . . . . . . . . . . 141
10.1.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
10.1.2. Estado inicial de los registros . . . . . . . . . . . . . . . . . . . . . 142
10.2. Gestion del microprocesador . . . . . . . . . . . . . . . . . . . . . . . . . . 144
10.2.1. Conmutacion a modo de funcionamiento protegido . . . . . . . . . . 144
10.2.2. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
10.2.3. Conmutacion a modo real . . . . . . . . . . . . . . . . . . . . . . . 148
11.Depuracion y monitorizacion 149
11.1. Depuracion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
11.1.1. Registros de depuracion . . . . . . . . . . . . . . . . . . . . . . . . 150
11.1.2. Excepciones de depuracion . . . . . . . . . . . . . . . . . . . . . . . 153
11.1.3. MSRs para depuracion . . . . . . . . . . . . . . . . . . . . . . . . . 154
11.2. Monitorizacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
11.2.1. Time-stamp counter . . . . . . . . . . . . . . . . . . . . . . . . . . 155
11.2.2. Monitorizacion del sistema . . . . . . . . . . . . . . . . . . . . . . . 156
INDICE GENERAL 7
A. Sistemas de numeracion 157
A.1. Decimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
A.2. Binario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
A.3. Hexadecimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
A.4. Trabajando con enteros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
A.4.1. Representacion de los enteros . . . . . . . . . . . . . . . . . . . . . 158
B. Codigos ASCII 161
C. Problemas 163
C.1. Aritmetica extendida: producto de 64 bits . . . . . . . . . . . . . . . . . . 163
C.2. Aritmetica extendida: producto de 64 bits, (2) . . . . . . . . . . . . . . . . 165
C.3. Comparacion de cadenas de datos . . . . . . . . . . . . . . . . . . . . . . . 168
C.4. Evaluacion de un polinomio . . . . . . . . . . . . . . . . . . . . . . . . . . 171
C.5. Hallar los ceros de una funcion . . . . . . . . . . . . . . . . . . . . . . . . . 173
C.6. Reloj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
D. Problemas FPU 181
D.1. Modulo de un vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
D.2. Funcion exponencial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
D.3. Toma de decisiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
D.4. Factorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
D.5. Funciones trigonometricas hiperbolicas . . . . . . . . . . . . . . . . . . . . 189
D.6. Polinomios de Legendre . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
D.7. Velocımetro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
D.8. Tecnica CORDIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
D.9. Calculo del arco tangente . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
E. 3D Now! 207
F. Extensiones SSE: Streaming SIMD Extensions 209
F.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
F.2. Conjunto de instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
F.2.1. Transferencia de datos . . . . . . . . . . . . . . . . . . . . . . . . . 210
F.2.2. Aritmeticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
F.2.3. De comparacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
F.2.4. De entremezclado y empaquetamiento . . . . . . . . . . . . . . . . 212
F.2.5. Logicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
8 INDICE GENERAL
F.2.6. De conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
F.2.7. De administracion del registro de estado (MXCSR) . . . . . . . . . 213
F.2.8. Instrucciones con enteros . . . . . . . . . . . . . . . . . . . . . . . . 213
F.2.9. Otras instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
G. Extensiones SSE2: Streaming SIMD Extensions 2 215
G.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
G.2. Conjunto de instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
G.2.1. Transferencia de datos . . . . . . . . . . . . . . . . . . . . . . . . . 215
G.2.2. Aritmeticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
G.2.3. De comparacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
G.2.4. De entremezclado y empaquetamiento . . . . . . . . . . . . . . . . 216
G.2.5. Logicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
G.2.6. De conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
G.2.7. Instrucciones con paquetes de datos en punto flotante de simple
precision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
G.2.8. Instrucciones con enteros . . . . . . . . . . . . . . . . . . . . . . . . 218
H. Extensiones SSE3: Streaming SIMD Extensions 3 221
H.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
H.2. Conjunto de instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
H.2.1. De carga o de movimiento o de duplicado . . . . . . . . . . . . . . . 221
H.2.2. De suma o resta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
H.2.3. De suma o resta en procesamiento paralelo . . . . . . . . . . . . . . 222
I. Extensiones SSE3 suplementarias: Supplemental Streaming SIMD Ex-
tensions 3 223
I.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
J. Extensiones SSE4: Streaming SIMD Extensions 4 225
J.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
K. Modo de Gestion del Sistema (SMM) 227
K.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
K.2. Interrupcion de Gestion del Sistema . . . . . . . . . . . . . . . . . . . . . . 227
K.3. Conmutacion de modos de operacion . . . . . . . . . . . . . . . . . . . . . 227
K.4. SMRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
K.5. Entorno de ejecucion de la rutina SMI . . . . . . . . . . . . . . . . . . . . 228
INDICE GENERAL 9
Indice alfabetico 229
Bibliografıa 233
10 INDICE GENERAL
Prologo
Proposito
El proposito de este libro es, como el de todos los libros, dar a conocer un tema apa-
sionante. El autor, en su dilatada trayectoria en la Universidad de Valladolid impartiendo
la asignatura de Sistemas Electronicos para el Tratamiento de la Informacion 1, ha re-
copilado sus apuntes de clase y los problemas resueltos en esta obra con el objetivo de
que pueda ser utilizada como obra de referencia en la ensenanza de esta asignatura en la
Titulacion de Ingeniero en Electronica y, con las modificaciones pertinentes, en otras.
Dado que los Ingenieros en su trabajo van a utilizar obligatoriamente referencias bi-
bliograficas escritas en ingles, se ha creıdo conveniente mantener la notacion inglesa en
la mayorıa de las siglas y en algunas descripciones de banderas (flags) de los registros
empleados.
Agradecimientos
El autor quiere agradecer la colaboracion en la redaccion y revision del libro a la
doctora Ruth Pinacho Gomez y al doctor Ignacio Martın Bragado.
Este libro ha sido realizado gracias, en parte, a la financiacion de la Junta de Castilla
y Leon (Ayuda para la Elaboracion de Recursos de Apoyo y Experiencias Innovadoras en
la Ensenanza Universitaria, UV19/03)
Valladolid, 10 de enero de 2011
11
12 INDICE GENERAL
Capıtulo 1
Introduccion
1.1. Nociones generales
La evolucion actual de la Ciencia y la Tecnologıa esta orientada hacia el Tratamiento
de la Informacion mediante Sistemas Electronicos. El mundo real es un mundo analogico
del que se toma la informacion a traves de los convertidores mas apropiados. Tambien
se toma informacion de otros sistemas digitales. La informacion es tratada digitalmente
mediante el sistema electronico y posteriormente es comunicada a otros sistemas digitales
o mediante los convertidores apropiados pasa al mundo analogico real.
10101010...
Sistema Electronico
Mundo Analogico
Mundo Digital
Entrada Salida
CPU
13
14 Nociones generales
Tratamiento de la Informacion
Los tipos de tratamiento de la informacion admiten algunas clasificaciones
Atendiendo a la inmediatez del procesado de la informacion pueden ser:
• On-line. Es el procesado realizado en el momento. La salida del procesado
esta disponible un tiempo despues de proporcionarle las entradas al sistema.
Este tiempo de procesado es un tiempo acotado.
• Off-line. Es el procesado realizado cuando no es posible dar una respuesta
inmediata, por carecer de todos los datos o porque el calculo es muy complejo.
Atendiendo al dominio en el que se encuentran los datos:
• En el dominio del tiempo. Los datos son obtenidos al transcurrir el tiempo.
• En el dominio de la frecuencia. Los datos son procesados y convertidos al
dominio de la frecuencia mediante una transformada de Fourier.
• Espacialmente. Los datos son obtenidos en diferentes puntos del espacio.
Sistemas Electronicos
Los sistemas electronicos que se pueden emplear pueden ser:
Microprocesadores de proposito general.
Microcontroladores. Especializados en el control de sistemas.
ASICs (Application Specific Integrated Circuits). Son disenos hechos a la medida del
problema.
DSPs (Digital Signal Processors). Son procesadores especializados en el tratamiento
de senales de forma muy repetitiva.
Procesadores paralelos. Son disenos que usan un conjunto de procesadores funcio-
nando en paralelo. Se usan cuando los tratamientos a realizar son muy costosos. En
ese caso el problema se divide entre un conjunto de procesadores funcionando en
paralelo.
En esta ocasion vamos a estudiar los microprocesadores de proposito general. Existen
varias familias disenadas por distintos fabricantes1: Intel, Motorola, Alpha, MIPS, Sparc,
1Las marcas relacionadas son propiedad de sus respectivos duenos.
Capıtulo 1. Introduccion 15
PowerPC, etc. En particular vamos a estudiar los microprocesadores correspondientes a
la arquitectura Intel de 32 bits2.
1.2. ¿Que es un microprocesador?
Es la parte del ordenador o sistema electronico para el tratamiento de la informacion
que realiza el procesamiento de unos datos que residen en una memoria o que provienen
de puertos de entrada/salida (E/S), es decir, que hace calculos (CPU:Central Process
Unit tambien conocida como Unidad Central de Proceso). Es un circuito programable
que ejecuta un programa almacenado en una memoria.
Bus de Direcciones
Bus de Datos
Bus de Control
Microprocesador
Memoria Entrada/Salida
Digital
Analogico
Unidad de Proceso
Unidad de Control
Regs ALU
Sistema Electronico
El microprocesador esta compuesto de:
Unidad de Proceso (Datapath). Es la parte que realiza las operaciones (ALU:Arithmetic
Logic Unit) y que contiene los registros.
Unidad de Control. Es la parte que implementa el control del microprocesador.
Donde esta definido el comportamiento de las instrucciones, los modos de direccio-
namiento que se pueden emplear y los tipos de datos que se manejan de acuerdo
con la implementacion de la Unidad de Proceso.
2Esta arquitectura (IA32) incluye los microprocesadores de Intel aparecidos hasta el momento inclu-
yendo: Pentium, Pentium II, Pentium III, Pentium 4. La arquitectura Intel de 64 bits (IA64: Itanium,
Itanium 2) mantiene un modo compatible con la Intel Architecture for 32 bits (IA32).
16 ¿Que es un microprocesador?
Arquitecturas del Sistema
Arquitectura Harvard. Consiste en tener una memoria para almacenar el programa
y otra memoria diferente para almacenar los datos, eso sı accediendo mediante buses
diferenciados. Es una arquitectura mas rapida y dado que tiene mas componentes
mas cara. Se utiliza fundamentalmente en los Procesadores de Senal Digitales (DSP)
y algunos microcontroladores.
Memoria
de
Programa
Memoria
de
DatosCPU
8 14
H a r v a r d
Arquitectura Von Neumann. Consiste en emplear la misma memoria para almacenar
las instrucciones y los datos. Es la arquitectura convencional en los microprocesa-
dores de proposito general. Es mas barata y mas lenta que la anterior.
Memoria
de
Datos y
Programa
CPU8
von Neumann
Registros
Los registros son las memorias mas rapidas que nos encontramos en el sistema basado
en microprocesador. Es importante conocer la funcionalidad especıfica de cada uno de
ellos. Cuantos mas registros existan, mas facil sera la programacion y mas rapida la
ejecucion de los programas. Algunos de los registros que nos podemos encontrar:
Contador de programa o puntero de instruccion. Se necesita llevar la cuenta de donde
se llega en la ejecucion de un programa (PC: Program Counter o IP: Instruction
Pointer)
Capıtulo 1. Introduccion 17
Registros para almacenar datos y/o direcciones. Son los mas abundantes. Algunos
podran tener funcionalidades especıficas.
Registros de estado y control. Importantes para cambiar el orden de ejecucion de
las instrucciones.
Ocultos. De instruccion, cache, temporales, etc.
Programas
Los programas que ejecutan los microprocesadores suelen estar divididos en tres sec-
ciones fundamentales que son:
Seccion de Codigo. Es donde se coloca el programa que va a ser ejecutado.
Seccion de Datos. Donde se situan las variables, tablas de datos, etc., que va a
manejar el programa.
Seccion de Pila. Es una zona especial que permite almacenar datos de forma dinami-
ca en forma de pila LIFO (Last In, First Out ), que significa que el ultimo dato en
entrar es el primero en salir. Existe un conjunto de registros que apuntan a la cima
de la pila (notar que en la mayorıa de los microprocesadores las pilas crecen hacia
posiciones de memoria decrecientes). La operacion PUSH introduce un dato en la pila
y la operacion POP extrae un dato de la misma.
Memoria Memoria
Puntero de pila
PUSH
POP
Dato 1 Dato 1Dato 2
Dato 3 Dato 3Dato 4Dato 5Dato 6
Dato 2
0
Lo interesante sera que las tres secciones de codigo se mantengan separadas sin solapa-
mientos de unas sobre otras. De esta manera se consigue hacer mas legibles los programas
y se evitan problemas y errores.
18 ¿Que es un microprocesador?
Instrucciones
Las instrucciones que implementa un microprocesador deben permitir la resolucion
de todos los problemas, ya que son de proposito general. Aun ası, hay CPUs mejores y
peores desde el punto de vista del ingeniero software ya que un conjunto muy amplio de
instrucciones facilita la programacion. Entre las instrucciones basicas que debe incorporar
un microprocesador estan las siguientes:
Aritmeticas (+, -, *, /) y logicas (AND, OR, NOT, XOR).
Transferencia: leer y escribir en la memoria, leer y escribir en un puerto de E/S,
introducir y extraer datos de la pila.
Control de programa: saltos condicionales e incondicionales, llamadas a subrutinas,
retornos de subrutinas.
Control del microprocesador: parada, interrupcion, coprocesadores.
Modos de direccionamiento
Es la forma en la que especificamos la direccion en memoria de un dato.
Inmediato: el dato sigue a la instruccion. MOV AX,234.
Directo a registro. MOV AX,BX.
Directo: se especifica la direccion siguiendo a la instruccion. MOV AX,[1234].
Indirecto: la direccion se encuentra en un registro. MOV AX,[BX].
Indirecto con desplazamiento. MOV AX,[BX+12].
Etc.
Tipos de datos
Datos enteros. Sin signo o con signo en complemento a dos3.
• Bit. Es la cantidad mınima de informacion. La palabra bit viene de la con-
traccion de otras dos: Binary digIT, que significa dıgito binario.
• Nibble. Conjunto de 4 bits.
3Ver Apendice A.
Capıtulo 1. Introduccion 19
• BYTE. Conjunto de 8 bits. Es la unidad estandar para la medicion de la cantidad
de memoria. En algunos microprocesadores esto no es ası.
• WORD. Palabra4 o conjunto de 16 bits.
• DWORD. Conjunto de 32 bits.
• QWORD. Conjunto de 64 bits.
Datos en punto flotante. Con exponente y mantisa. El valor se suele calcular como
≈ Mantisa ∗ 2Exponente
Datos vectoriales. Tanto con componentes enteras como de punto flotante.
Orden de los bytes en memoria
Es importante conocer el orden de almacenamiento de los datos en memoria sobretodo
cuando pasamos informacion de un tipo de arquitectura a otro.
Little endian. Se almacena primero el LSByte (Least Significant Byte: byte menos
significativo) y luego el MSByte (Most Significant Byte: byte mas significativo). Es
tıpico en las arquitecturas de Intel.
Big endian. Se almacena primero el MSByte y luego el LSByte. Es tıpico de
Motorola.
; El dato escrito en base hexadecimal 12345678h; se almacenara como:; Direccion: 0 1 2 3; Little endian 78h 56h 34h 12h; Big endian 12h, 34h, 56h, 78h
1.3. Microprocesadores RISC y CISC
Las diferencias fundamentales entre las arquitecturas CISC y RISC se muestran a con-
tinuacion:
4Las palabras en otros microprocesadores suelen coincidir con la anchura del bus de datos que a su
vez puede coincidir con la anchura de la unidad logico-aritmetica. En la arquitectura Intel por motivos
historicos seguimos llamando palabra al conjunto de 16 bits aun cuando sabemos que trabajamos con un
microprocesador de 32 bits.
20 Microprocesadores RISC y CISC
Procesadores CISC Procesadores RISC
Complex Instruction Reduced Instruction
Set Computing Set Computing
Conjunto de instrucciones complejo.
Muchos modos de direccionamiento
complejos.
Microprogramados.
Pocos registros: algunos especializa-
dos. Los resultados temporales se al-
macenan en memoria: mas lenta.
Complicado hacer pipelining (seg-
mentacion de instrucciones).
Ej: 80x86, 680x0, Z8000.
Conjunto de instrucciones sencillo,
pero muy optimizadas.
Pocos modos de direccionamiento.
Logica cableada.
Muchos registros ortogonales: todos
son iguales.
Uso generalizado del pipelining.
Ej:
SPARC, PA-RISC, ALPHA, R4000.
Un ejemplo:
CISC
Pentium (INTEL)
3,1 ∗ 106 transistores
8 registros 32 bit (enteros)
8 registros 80 bit (pto. flotante)
fmax = 1 GHz (Ano 2000)
RISC
ALPHA (DEC) 21064
1,68 ∗ 106 transistores
32 registros 64 bit (enteros)
32 registros 64 bit (pto. flotante)
fmax = 1 GHz (Ano 2000)
Los microprocesadores actuales cada vez son mas hıbridos y es mas difıcil clasificarlos.
Pipelining: Segmentacion de la ejecucion de instrucciones
La ejecucion de las instrucciones se divide en varias etapas independientes que se eje-
cutan en diferentes secciones del microprocesador. En un momento determinado se tienen
varias instrucciones ejecutandose al mismo tiempo (como en una cadena de produccion)
Ejemplo:
Capıtulo 1. Introduccion 21
Busqueda de instruccion.
Decodificacion de la instruccion.
Busqueda de datos.
Ejecucion de la instruccion.
A modo de ejemplo ponemos el largo pipelining que incluye el microprocesador Pentium
4 comparado con el del Pentium III:
11 22 33 44 55 66 77 88 99 1010
FetchFetch FetchFetch DecodeDecode DecodeDecode DecodeDecode RenameRename ROB RdROB Rd RdyRdy/Sch/Sch DispatchDispatch ExecExec
Basic Pentium III Processor Basic Pentium III Processor MispredictionMisprediction Pipeline Pipeline
Basic Pentium 4 Processor Basic Pentium 4 Processor MispredictionMisprediction Pipeline Pipeline
11 22 33 44 55 66 77 88 99 1010 1111 1212
TC TC Nxt Nxt IPIP TC FetchTC Fetch DriveDrive AllocAlloc RenameRename QueQue SchSch SchSch SchSch
1313 1414
DispDisp DispDisp
1515 1616 1717 1818 1919 2020
RFRF ExEx FlgsFlgs Br CkBr Ck Drive DriveRF RF
Introduccion historica a la arquitectura Intel
Nota5
1971 Intel 4004. Primer microprocesador. Arquitectura de 4 bits. 2.300 transistores. 108
kHz.
1972 Intel 8008. De 8 bits. Con 3.500 transistores.
1974 Intel 8080, 8085. De 8 bits. Con 6.000 transistores.
1978 Intel 8086, 8088. De 16 bits. Con 29.000 transistores. Es el microprocesador que in-
cluıan los primeros ordenadores PC (Personal Computer). Con un bus de direcciones
de 20 bits (1MB). Funcionamiento en modo real.
1982 Intel 80286. De 16 bits. Con 134.000 transistores. Con un bus de direcciones de 24
bits (16MB). Permite la memoria virtual e implementa mecanismos de proteccion.
Anade el modo protegido.
1985 Intel 80386. Con 275.000 transistores. Es de 32 bits. Con un bus de direcciones de
32 bits (4GB). Incorpora la paginacion de la memoria.
5Ver presentacion en http://www.intel.com/about/companyinfo/museum/archives/timeline.htm
22 Microprocesadores RISC y CISC
1989 Intel 80486. Con 1’2 millones de transistores. Ejecuta una instruccion por ciclo
de reloj. Usa un pipeline de 5 etapas. Incorpora 8KB de cache de primer nivel
(L1) dentro del circuito integrado (on-chip). Incorpora el coprocesador matematico.
Incluye soporte para cache de nivel 2 (L2) y multiprocesador.
1993 Pentium. Con 3’1 millones de transistores. Arquitectura super-escalar con dos uni-
dades de ejecucion segmentadas (U y V). Ejecuta 2 instrucciones por ciclo de reloj.
Incorpora dos caches de nivel 1 (8KB para instrucciones y 8KB para datos). Imple-
menta el protocolo MESI para gestion de la cache. Incorpora la prediccion de saltos.
Mejora la paginacion con paginas de 4KB y 4MB. Las unidades de proceso inter-
namente tienen 128/256 bits. El bus externo de datos es de 64 bits transmitiendo a
rafagas. Integra el APIC (Advanced Programmable Interrupt Controller).
1995 Pentium Pro. Con 5’5 millones de transistores. Arquitectura super-escalar de 3
vias. Ejecuta 3 instrucciones por ciclo de reloj de promedio. Incorpora la ejecucion
dinamica de instrucciones, que incluye el analisis por flujo de datos, la ejecucion de
instrucciones desordenada, la prediccion de saltos mejorada y la ejecucion especu-
lativa. Dispone de un pipeline de 12 etapas y de 5 unidades de ejecucion: 2 ALU
enteras, 2 FPU flotantes y 1 de interfaz de memoria. Tambien incorpora 256 KB de
cache L2 dentro del circuito integrado. El bus de direcciones se extiende a 36 bits
(64GB) a traves de la paginacion.
1997 Pentium II. Incluye la ampliacion de instrucciones MMX.
1999 Pentium III. Con 8’2 millones de transistores. Incluye la extension SSE (Streaming
SIMD Extensions) con mas registros (de 128 bits) e instrucciones vectoriales en
punto flotante de precision sencilla. Incorpora el numero de serie (96 bits) unico en
cada procesador.
2000 Pentium 4. Con 42 millones de transistores. Incorpora la extension SSE2. Con
caches L2 de hasta 1MB.
2001 Itanium. Arquitectura Intel de 64 bits. No disponible comercialmente en Espana.
2003 Itanium 2. Arquitectura Intel de 64 bits.
2004 Pentium 4 HT (Hyper Threading) EMT64 (Extended Memory Technology). Fa-
bricado con una tecnologıa de 90 nm. Funciona a 2.8 GHz. En septiembre de 2005
alcanza los 3.8 GHz. Tiene 125 millones de transistores. Su nombre de desarrollo
fue Prescott. Incorpora el nuevo subconjunto de instrucciones SSE3.
Capıtulo 1. Introduccion 23
2000-2006 The Intel R⃝ Pentium R⃝ 4 Processor Family.
Basado en la microarquitectura NetBurst. Introdujo las extensiones Streaming SIMD
Extensions 2 (SSE2). El Pentium 4 HT (3.40 GHz) introdujo las extensiones Strea-
ming SIMD Extensions 3 (SSE3). La arquitectura Intel 64 se introdujo en el Pentium
4 HT Extreme Edition y en el Pentium 4 (6xx y 5xx). La tecnologıa Intel R⃝ Virtua-
lization Technology (Intel R⃝ VT) se introdujo en el Pentium 4 (672 y 662).
2001-2007 The Intel R⃝ Xeon R⃝ Processor.
Los procesadores Intel Xeon (con la excepcion del dual-core Intel Xeon LV, y la serie
Intel Xeon 5100) estan basados en la microarquitectura NetBurst. Es una familia
disenada para su uso en sistemas servidores con multiprocesador y estaciones de
trabajo de alto rendimiento. El procesador Intel Xeon MP introdujo el soporte de
la tecnologıa Hyper-Threading (HT). El procesador de 64-bit Intel Xeon (3.60 GHz,
con un bus del sistema a 800 MHz) introdujo la arquitectura Intel 64 en esta familia.
El procesador Dual-Core Intel Xeon incluye la tecnologıa de doble nucleo. La serie
Intel Xeon 70xx incluye la tecnologıa VT (Virtualization Technology). Las series
Intel Xeon 5100, 3000 introdujeron la microarquitectura Intel Core (eficiente en
consumo y de alto rendimiento). La serie Intel Xeon 5300 introdujo cuatro nucleos
en un unico circuito.
2003-Current The Intel R⃝ Pentium R⃝ M Processor.
La familia Intel Pentium M es una familia de alto rendimiento y bajo consumo para
sistemas portatiles con las mejoras de la generaciones previas de la arquitectura Intel
de 32 bits. Se diseno para extender la vida de las baterıas de los sistemas portatiles.
Incluye:
Soporte de la Arquitectura Intel Architecture con Dynamic Execution.
A high performance, low-power core manufactured using Intel’s advanced pro-
cess technology with copper interconnect
On-die, primary 32-KByte instruction cache and 32-KByte write-back data
cache.
On-die, second-level cache (up to 2 MByte) with Advanced Transfer Cache
Architecture.
Advanced Branch Prediction and Data Prefetch Logic.
Support for MMX technology, Streaming SIMD instructions, and the SSE2
instruction set.
24 Microprocesadores RISC y CISC
A 400 or 533 MHz, Source-Synchronous Processor System Bus.
Advanced power management using Enhanced Intel SpeedStep R⃝ technology
2005-2007 The Intel R⃝ Pentium R⃝ Processor Extreme Edition.
Introdujo la tecnologıa dual core, ademas de el soporte hardware avanzado de multi-
threading. Esta basado en la microarquitectura NetBurst y soporta las tecnologıas
SSE, SSE2, SSE3, Hyper- Threading Technology, and Intel 64.
2006-2007 The Intel R⃝ Core Duo and Intel R⃝ Core Solo Processors.
The Intel Core Duo processor offers power-efficient, dual-core performance with a
low-power design that extends battery life. This family and the single-core Intel Core
Solo processor offer microarchitectural enhancements over Pentium M processor
family. Incluye:
Intel R⃝ Smart Cache which allows for efficient data sharing between two pro-
cessor cores
Improved decoding and SIMD execution
Intel R⃝ Dynamic Power Coordination and Enhanced Intel R⃝ Deeper Sleep to
reduce power consumption
Intel R⃝ Advanced Thermal Manager which features digital thermal sensor in-
terfaces
Support for power-optimized 667 MHz bus The dual-core Intel Xeon processor
LV is based on the same microarchitecture as Intel Core Duo processor, and
supports IA-32 architecture.
2006-Current The Intel R⃝ Xeon R⃝ Processor 5100, 5300 Series and Intel R⃝ Core2 Pro-
cessor Family.
The Intel Xeon processor 3000, 3200, 5100, 5300, and 7300 series, Intel Pentium
Dual-Core, Intel Core 2 Extreme, Intel Core 2 Quad processors, and Intel Core 2
Duo processor family support Intel 64 architecture; they are based on the high-
performance, power-efficient Intel R⃝ Core microarchitecture built on 65 nm process
technology. Incluye:
Intel R⃝ Wide Dynamic Execution to increase performance and execution th-
roughput
Intel R⃝ Intelligent Power Capability to reduce power consumption
Capıtulo 1. Introduccion 25
Intel R⃝ Advanced Smart Cache which allows for efficient data sharing between
two processor cores
Intel R⃝ Smart Memory Access to increase data bandwidth and hide latency of
memory accesses
Intel R⃝ Advanced Digital Media Boost which improves application performance
using multiple generations of Streaming SIMD extensions.
The Intel Xeon processor 5300 series, Intel Core 2 Extreme processor QX6800
series, and Intel Core 2 Quad processors support Intel quad-core technology.
2007-Current The Intel R⃝ Xeon R⃝ Processor 5200, 5400, 7400 Series and Intel R⃝ Core2
Processor Family.
The Intel Xeon processor 5200, 5400, and 7400 series, Intel Core 2 Quad processor
Q9000 Series, Intel Core 2 Duo processor E8000 series support Intel 64 architecture;
they are based on the Enhanced Intel R⃝ Core microarchitecture using 45 nm pro-
cess technology. The Enhanced Intel Core microarchitecture provides the following
improved features:
A radix-16 divider, faster OS primitives further increases the performance of
Intel R⃝ Wide Dynamic Execution.
Improves Intel R⃝ Advanced Smart Cache with Up to 50 % larger level-two cache
and up to 50 % increase in way-set associativity.
A 128-bit shuffler engine significantly improves the performance of Intel R⃝ Ad-
vanced Digital Media Boost and SSE4.
Intel Xeon processor 5400 series and Intel Core 2 Quad processor Q9000 Series
support Intel quad-core technology. Intel Xeon processor 7400 series offers up
to six processor cores and an L3 cache up to 16 MBytes.
2008-Current The Intel R⃝ Atom Processor Family.
The Intel R⃝ AtomTM processors are built on 45 nm process technology. They are
based on a new microarchitecture, Intel R⃝ AtomTM microarchitecture, which is op-
timized for ultra low power devices. The Intel R⃝ AtomTM microarchitecture features
two in-order execution pipelines that minimize power consumption, increase battery
life, and enable ultra-small form factors. It provides the following features:
Enhanced Intel R⃝ SpeedStep R⃝ Technology
26 Microprocesadores RISC y CISC
Intel R⃝ Hyper-Threading Technology
Deep Power Down Technology with Dynamic Cache Sizing
Support for new instructions up to and including Supplemental Streaming
SIMD Extensions 3 (SSSE3).
Support for Intel R⃝ Virtualization Technology
Support for Intel R⃝ 64 Architecture (excluding Intel Atom processor Z5xx Se-
ries)
2008-Current The Intel R⃝ Corei7 Processor Family.
The Intel Core i7 processor support Intel 64 architecture; they are based on Intel
microarchitecture (Nehalem) using 45 nm process technology. The Intel Core i7
processor includes the following innovative features:
Intel R⃝ Turbo Boost Technology converts thermal headroom into higher per-
formance.
Intel R⃝ HyperThreading Technology in conjunction with Quadcore to provide
four cores and eight threads.
Dedicated power control unit to reduce active and idle power consumption.
Integrated memory controller on the processor supporting three channel of
DDR3 memory.
8 MB inclusive Intel R⃝ Smart Cache.
Intel R⃝ QuickPath interconnect (QPI) providing point-to-point link to chipset.
Support for SSE4.2 and SSE4.1 instruction sets.
Second generation Intel Virtualization Technology.
Intel 4004
En 1971 Intel fabrica el primer microprocesador. Con 2300 transistores, este micro-
procesador de 4 bits presumıa de se tan potente como la ENIAC (una de las primeras
computadoras a valvulas).
Capıtulo 1. Introduccion 27
Layout del 4004 con 2300 transistores.
28 Microprocesadores RISC y CISC
Pentium 4
Layout de 42 millones de transistores6
A continuacion se muestra el diagrama de bloques basico de la arquitectura interna
del Pentium 4.
BTB/Branch Prediction
Out-of-order
execution
logic
RetirementFetch/DecodeTrace Cache
Microcode ROM
Front End
Branch History Update
Level 1 Data Cache
Execution Units
Bus Unit
Level 2 Cache
System Bus
Memory Subsystem
Out-of-order Engine
Integer and FP Execution Units
6La tecnologıa de fabricacion (tamano de los transistores) no es la misma y las fotografıas no emplean
la misma escala.
Capıtulo 1. Introduccion 29
Y aquı el diagrama de la microarquitectura del microprocesador Pentium 4 HT Pres-
cott.
30 Microprocesadores RISC y CISC
Capıtulo 2
Arquitectura INTEL
(Nivel Aplicacion)
2.1. Entorno basico de ejecucion
La Arquitectura Intel que estudiamos define los microprocesadores1 de 32 bit (IA32),
lo que implica que tiene los registros y la ALU entera de 32 bits. Dispone de un bus de
direcciones de 36 bits (236 = 64 GB).
2.1.1. Modos de operacion
Dispone de tres modos de funcionamiento.
Modo protegido. Modo nativo de funcionamiento. Todas las caracterısticas estruc-
turales estan disponibles. Proporciona el maximo rendimiento. Es el modo recomen-
dado para los Sistemas Operativos y las aplicaciones nuevas. Una de las habilidades
de este modo es ejecutar software del 8086 con direccionamiento en modo real en un
entorno protegido y multitarea. Es lo que se llama Modo Virtual 86. Se considera
como un atributo del modo protegido.
Modo de direccionamiento real. Proporciona el entorno de trabajo de un 8086
con algunas extensiones. El microprocesador arranca en este modo despues de un
reset. Es el modo que emplearemos inicialmente.
Modo de gestion del sistema (SMM: System Management Mode). Disponible
desde el modelo 386SL. Permite la implementacion de sistemas de ahorro de energıa
1En particular estudiaremos el mas avanzado hasta el momento: el Pentium 4.
31
32 Entorno basico de ejecucion
ası como aumentar la seguridad del sistema. Emplea un mapa de memoria paralelo
que lo hace independiente del Sistema Operativo instalado.
2.1.2. Organizacion de la memoria
La memoria que direcciona el microprocesador en sus buses se llama memoria fısica.
Esta memoria esta organizada en grupos de 8 bits (bytes), teniendo cada uno de estos,
una unica direccion fısica. El espacio de direcciones fısicas abarca desde la posicion 0 hasta
la 232 − 1, lo que supone un direccionamiento de 4GB2.
Dependiendo del modo de funcionamiento del microprocesador el acceso a memoria
funciona de una manera u otra. En el modo de funcionamiento protegido, que es el modo
recomendado, existen dos mecanismos: la segmentacion de la memoria, que no puede ser
desactivada, y la paginacion de la memoria, que es un mecanismo anadido al anterior y
opcional. Ambos mecanismos son muy utiles en el diseno de Sistemas Operativos seguros.
Al programar no nos referimos directamente a la memoria fısica sino a una memoria
de direcciones lineales.
Existen tres modelos de memoria aplicables:
Flat model. Modelo plano. Toda la memoria aparece como un espacio de direc-
ciones continuo llamado espacio de direcciones lineales que abarca desde la posicion
0 hasta 232 − 1. Las secciones de codigo, datos y pila de todos los programas estan
contenidos en el.
Segmented model. Modelo segmentado. Cada programa esta dividido en seg-
mentos separados: codigo, datos y pila. Para poder acceder a un byte necesitamos
una direccion logica compuesta por un selector de segmento y un offset o desplaza-
miento. A esto se le denomina tambien puntero FAR. El selector de segmento identifica
el segmento y el desplazamiento identifica el byte dentro del segmento. Se pueden
direccionar hasta 16383 segmentos a la vez, de diferentes tamanos y tipos. El tamano
maximo de un segmento puede ser 232 bytes. Este modelo de memoria aumenta la
versatilidad de los programas dado que el codigo es reubicable3 y la pila al crecer
no puede sobreescribir zonas de datos o codigo, con lo que aumenta la seguridad.
2Esto implica un bus de direcciones de 32 bits. Los ultimos microprocesadores de Intel tienen un bus
de 36 bits (64GB), pero es necesario el empleo del mecanismo de la paginacion para hacer uso de los 4
bits extra.3Significa que el codigo se puede situar en cualquier parte de la memoria sin necesidad de recalcular
las direcciones de las instrucciones de salto ya que son relativas al principio del codigo y no absolutas.
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 33
Real-address model. Modo de direccionamiento real. Es el modelo de memo-
ria empleado en el 8086. Es una implementacion particular del modelo de memoria
segmentado. El espacio de direcciones lineales es de 220 bytes (1 MB). El tamano
maximo de un segmento es de 64 kB. Para direccionar la memoria se utiliza una
direccion logica compuesta por segmento:desplazamiento. La traduccion a me-
moria lineal la hace el micro automaticamente como aparece en la siguiente figura.
Dirección Lineal
Modelo Plano
EspacioDireccionesLineales
Desplazamiento
Selector Segmento
Modelo Segmentado
Modelo de Direccionamiento Real
Espacio DireccionesLineales Dividido
En SegmentosEquiespaciados
LogicaDirección
EspacioDirecciones
Lineales
Segmentos
Desplazamiento
Selector Segmento
LogicaDirección
En este modelo surgen problemas cuando el segmento es pequeno y el programa es
grande (> 64 kB), ya que hay que dividir el programa en varios segmentos y hay
que modificar los registros de segmento cuando saltamos de uno a otro.
En el direccionamiento de la memoria ademas existen dos tamanos de operandos y
direcciones definibles:
Direccionamiento de 32 bits. El selector es de 16 bits y el desplazamiento de 32
bits. Los operandos pueden ser o bien de 8, o bien de 32 bits.
Direccionamiento de 16 bits. El selector es de 16 bits y el desplazamiento de 16
bits. Los operandos pueden ser o bien de 8, o bien de 16 bits.
Esta es la diferencia fundamental entre los programas de 32 bits y los de 16 bits.
Ademas la codificacion de las instrucciones difiere en un caso y en otro.
34 Entorno basico de ejecucion
2.1.3. Registros
Los registros que nos encontramos en el entorno basico de ejecucion son los siguientes:
Registros de datos o de proposito general
071531 16 8
AH AL
BH BL
CH CL
DH DL
BP
SI
DI
SP
16-bit
AX
DX
CX
BX
32-bit
EAX
EBX
ECX
EDX
EBP
ESI
ESP
Registros de Proposito General
EDI
EAX. Registro acumulador. Se puede usar solo los 16 bits mas bajos: AX. Tambien se
pueden referenciar las partes alta AH y baja AL de este ultimo.
EBX. Registro base. Se pueden usar solo los 16 bits mas bajos: BX. Tambien se pueden
referenciar las partes alta BH y baja BL de este ultimo. Suele formar un puntero de
datos en el segmento DS.
ECX. Registro contador. Se pueden usar solo los 16 bits mas bajos: CX. Tambien se
pueden referenciar las partes alta CH y baja CL de este ultimo.
EDX. Registro de datos. Se pueden usar solo los 16 bits mas bajos: DX. Tambien se
pueden referenciar las partes alta DH y baja DL de este ultimo. Es la extension de
EAX en el producto y la division. Tambien es el puntero de acceso a E/S cuando las
direcciones son de 16 bits.
ESI. Indice fuente (Source Index). Se pueden usar solo los 16 bits mas bajos: SI.
Forma el puntero fuente (DS:ESI)
EDI. Indice destino (Destination Index). Se pueden usar solo los 16 bits mas bajos:
DI. Forma el puntero destino (ES:EDI)
ESP. Puntero de pila (Stack Pointer). Se pueden usar solo los 16 bits mas bajos: SP.
El puntero de pila propiamente dicho lo forman: (SS:ESP).
EBP. Puntero base (Base Pointer). Se pueden usar solo los 16 bits mas bajos: BP. El
puntero base lo forman: (SS:EBP). Apunta a los datos de la pila.
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 35
Registros selectores de segmento
Registros Selectores de Segmento
CSDSSSESFSGS
Codigo
Datos
Pila
Datos
Datos
Datos
Todos lossegmentosestan en elmismo espaciode direcciones
CS. Selector del segmento de codigo.
DS. Selector del segmento de datos.
SS. Selector del segmento de pila.
ES. Selector del segmento de datos extra.
FS. Selector del segmento de datos extra.
GS. Selector del segmento de datos extra.
Son punteros especiales que identifican un segmento en memoria. Su funcionamiento de-
pende del modo de funcionamiento del microprocesador y del modelo de memoria em-
pleado.
En el modelo plano. Apuntan a un segmento que comienza en la direccion 0 y que
abarca todo el espacio de direcciones lineales.
En el modelo segmentado. Cada registro de segmento apunta a un segmento dife-
rente (sin solapamiento) y con tamanos variables. Para acceder a zonas de memoria
diferentes hay que cargar un registro de segmento con el selector de segmento ade-
cuado.
Registro EIP
El puntero CS:EIP apunta a la siguiente instruccion a ejecutar. No se puede modificar
explıcitamente.
36 Entorno basico de ejecucion
Registro EFLAGS
El registro EFLAGS es el registro de condiciones extendido (32 bits) y divide su contenido
en tres partes:
1. Flags de estado. Indican el resultado de instrucciones aritmeticas, desplazamien-
tos, etc.
CF. Acarreo (Carry flag). Indica el acarreo para la suma y para la resta.
254 11111110b+ 3 00000011b-------- ------------
257 1 00000001bCF
PF. Paridad (Parity flag). Se activa si el byte menos significativo del resultado
contiene un numero par de unos.
AF. Semiacarreo (Adjust flag). Indica el acarreo del bit 3 al bit 4. Usado en
aritmetica BCD (Binary Coded Decimal).
ZF. Cero (Zero flag) Se activa si el resultado es cero.
SF. Signo (Sign flag). Coincide con el bit mas significativo del resultado.
OF. Desbordamiento (Overflow flag). En numeros interpretados con signo, se
activa si el resultado no cabe en el operando destino. Sirve para prevenir que
el acarreo cambie el signo del resultado.
127 01111111b+ 2 00000010b-------- ------------
-127 10000001b no cabe , OF=1
2. Flags de control.
DF. Direccion (Direction flag). Indica la direccion de procesamiento de las
cadenas de datos. Si vale 0, hacia posiciones de memoria crecientes, si vale 1
hacia posiciones decrecientes. Hay instrucciones para movimiento de bloques de
datos que autoincrementan o autodecrementan las direcciones fuente y destino
dependiendo del valor de este bit.
3. Flags del sistema. No deben ser modificados por los programas de usuario.
IF. Mascara de interrupciones (Interrupt enable flag). Enmascara las interrup-
ciones externas enmascarables (patilla INT ) (=0 Enmascara, =1 Habilita).
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 37
TF. Ejecucion paso a paso (Trap flag). Habilita la depuracion paso a paso.
Cuando esta activado, tras la ejecucion de una instruccion se ejecuta una inte-
rrupcion para poder depurar el resultado de la instruccion.
IOPL. Nivel de privilegio de E/S (I/O privilege level field). Si nuestro nivel
de privilegio actual CPL≤IOPL, podremos acceder directamente a los puertos de
E/S, sino habra que comprobar el mapa de accesos a E/S del TSS (Segmento
de Estado de Tarea) actual (ver pagina 136). Se usa en Modo Protegido.
NT. Tarea anidada (Nested task). Se usa en Modo Protegido.
RF. Reanudacion (Resume flag). Controla la respuesta del procesador en las
excepciones de depuracion. Se usa en Modo Protegido.
VM. Habilita el modo Virtual86 (Virtual 8086 mode flag). Al ponerse a cero
se retorna a modo protegido. Se usa en Modo Protegido.
AC. Chequeo de alineamiento (Alignment check flag). Habilita el chequeo del
alineamiento en las referencias a memoria. Se usa en Modo Protegido.
VIF. Imagen virtual de IF (Virtual interrupt flag). Se usa junto con VIP. Se
usa en Modo Protegido.
VIP. Interrupcion virtual pendiente (Virtual interrupt pending flag) Indica si
hay una interrupcion pendiente. El procesador solo lee este bit. Lo modifica el
Sistema Operativo. Se usa en Modo Protegido.
ID. Identificacion (Identification flag). Indica el soporte o no de la instruccion
CPUID.
31 2930 28 27 26 25 24 23 22 21 20 19 18 17 16
0RF
ID
AC
VM
X Virtual-8086 Mode (VM)X Resume Flag (RF)
X Nested Task (NT)
X I/O Privilege Level (IOPL)X Overflow Flag (OF)
X Direction Flag (DF)X Interrupt Enable Flag (IF)
X Alignment Check (AC)
X ID Flag (ID)X Virtual Interrupt Pending (VIP)
15 1314 12 11 10 9 8 7 6 5 4 3 2 1 0
0CF
AF
PF 1
DF
IF
TF
SF
ZF
NT 000 0 0 0 0 0 0 0 0
VI
P
VIF
OF
IOPL
X Virtual Interrupt Flag (VIF)
X Trap Flag (TF)
S Sign Flag (SF)S Zero Flag (ZF)
S Auxiliary Carry Flag (AF)S Parity Flag (PF)
S Carry Flag (CF)
38 Entorno basico de ejecucion
2.1.4. Tipos de datos
Los datos no necesitan estar alineados en memoria, pero se recomienda que lo esten
para aumentar el rendimiento, sobre todo los datos de la pila. Si los datos estan alineados
un dato DWORD se lee en un acceso. Si no estan alineados un dato DWORD se leera en dos
accesos.
Los tipos de datos son
Enteros con signo.
• BYTE. Rango: [−128 . . . 127].
• WORD. Rango: [−32768 . . . 32767].
• DWORD. Rango: [−231 . . . 231 − 1].
Enteros sin signo.
• BYTE. Rango: [0 . . . 255].
• WORD. Rango: 0 . . . 65535].
• DWORD. Rango: [0 . . . 232 − 1].
BCD (Binary Coded Decimal)
• No empaquetado. Rango de cada byte: [”0” . . . ”9”].
• Empaquetado. Rango de cada byte: [”00” . . . ”99”].
Punteros. Direccionan la memoria.
• Near pointer. (32 bits) Direccion efectiva o desplazamiento.
• Far pointer. (16:32 bits) Direccion logica. Selector de segmento de 16 bits mas
el desplazamiento de 32 bits.
Campos de bit. Es una secuencia continua de bits. Puede empezar en cualquier
bit de cualquier posicion de la memoria y con una longitud maxima de 32 bits.
Cadenas (Strings). Son secuencias de bits, bytes, words o dwords con un tamano
de hasta:
• Bit string. Hasta 232 − 1 bits.
• Byte string. Hasta 232 − 1 bytes.
• Word string. Hasta 232 − 1 words.
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 39
• DWord string. Hasta 232 − 1 dwords.
Tipos de datos en punto flotante. Ver en el Capıtulo 3.
Tipos de datos MMX. Ver en el Capıtulo 4.
2.1.5. Modos de direccionamiento
Los podemos clasificar como:
1. Operandos inmediatos. El operando va codificado detras de la instruccion. El
valor codificado es un entero de 32 bits, aunque depende de la instruccion.
2. Operandos en registros. El dato esta en un registro.
3. Operandos en memoria. Mediante una direccion logica compuesta por un selector
de segmento y un desplazamiento.
Selector de segmento. Puede especificarse explıcitamente, o implıcitamente
• Implıcitamente.
Tipo de referencia Selector Segmento Regla de seleccion
Instrucciones CS Codigo Busqueda instrucciones
Pila SS Pila PUSH, POP,
y ref. a ESP o EBP
Datos locales DS Datos Ref. a datos
Destino bloques datos ES Datos Destino bloques datos
• Explıcitamente. Solo los datos locales.
MOV [ES:EBX],EAX
Desplazamiento. Esta compuesto de la base, el ındice, la escala y el desplaza-
miento propiamente dicho.
DESPLAZAMIENTO_FINAL = BASE + (INDICE*ESCALA) + DESPLAZAMIENTO
Despl = Base + (Indice ∗ Escala) + Desplazamiento
Base
EAX
EBXECX
EDX
ESPEBP
ESIEDI
EAX
EBXECX
EDX
EBP
ESI
EDI
1 None
2
4
8
8-bit
16-bit
32-bit
Indice Escala Desplazamiento
*+ +
40 Repertorio basico de instrucciones
4. Operandos en puertos de E/S.
Tiene 65536 puertos de E/S, que pueden ser accedidos como byte, word o dword. Se
direcciona de forma inmediata o directa al registro DX.
Direccionamiento en modo real. En este caso la direccion se forma como sigue:
; DIR. LINEAL = (SEL. SEGMENTO )*16 + DESPLAZAMIENTO EFECTIVO; (20 bits) (16 bits) (16 bits)
2.2. Repertorio basico de instrucciones
2.2.1. Transferencia de datos
MOV
Copia datos de la fuente al destino. No afecta a EFLAGS. Ejemplo:
MOV EAX ,[EBX +10]MOV DWORD [EBX +10] ,5MOV BX,ESMOV DS,AXMOV ES ,314 ; Error. Los registros de segmento se cargan
; desde otros registros
CMOVcc
Copia condicional de datos. Aparece a partir de Pentium Pro.
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 41
cc Condicion Significado
E/Z Equal or Zero =
NE/NZ Not Equal/Not Zero =A/NBE Above/Not Below or Equal > (Numeros sin signo)
AE/NB Above or Equal/Not Below ≥ (.. sin signo)
B/NAE Below/Not Above or Equal < (.. sin signo)
BE/NA Below or Equal/Not Above ≤ (.. sin signo)
G/NLE Great/Not Less or Equal > (Numeros con signo)
GE/NL Great or Equal/Not Less ≥ (.. con signo)
L/NGE Less/Not Great or Equal < (.. con signo)
LE/NG Less or Equal/Not Great ≤ (.. con signo)
C Carry Acarreo
NC Not Carry Sin acarreo
O Overflow Desbordamiento
NO Not Overflow Sin desbordamiento
S Sign Negativo
NS Not Sign Positivo
P/PE Parity/Parity Even Paridad par
NP/PO Not Parity/Parity Odd Paridad impar
Ejemplo:
CMOVE EDX ,EAX ; EDX = EAX solo si EFLAGS.ZF=1
XCHG
Intercambia contenido de fuente y destino. No afecta a EFLAGS. No admite operandos
inmediatos.
XCHG EAX ,EDX ; Intercambia el contenidoXCHG SI ,[BX]
BSWAP
Intercambia bytes. El dato de 32 bits pasa de formato Little Endian a formato Big
Endian. A partir de 486.
; EAX = 12345678h antesBSWAP EAX ; EAX = 78563412h despues
42 Repertorio basico de instrucciones
XADD
Intercambia y suma. A partir de 486.
XADD r/m8 ,r8XADD r/m16 ,r16XADD r/m32 ,r32
CMPXCHG
Compara e intercambia. A partir de 486.
Si Acumulador == DestinoEntonces
ZF = 1Destino = Fuente
SinoZF = 0Acumulador = Destino
CMPXCHG8B
Compara e intercambia 8 bytes. A partir de 486.
Si EDX:EAX == DestinoEntonces
ZF = 1Destino = ECX:EBX
SinoZF = 0EDX:EAX = Destino
PUSH
Introduce un dato de 16/32 bits en la pila.
1. Decrementa ESP en 2/4 bytes, dependiendo del modo de direccionamiento (16/32
bits).
2. Guarda [ESP]=rm16/32.
Ejemplo:
PUSH AX ; Guarda AX en la pilaPUSH DWORD [EBX] ; Guarda el contenido (32 bits) apuntado
; por DS:EBX en la pilaPUSH DWORD 1000H ; Introduce 00001000h en la pilaPUSHF ; Introduce el registro EFLAGS (parte baja)
; en la pila
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 43
POP
Extrae de la pila
1. Extrae rm16/32=[ESP]
2. Incrementa ESP en 2/4 bytes, dependiendo del modo de direccionamiento (16/32
bits)
Ejemplo:
POPFD ; Recupera dato de la pila en EFLAGSPOP WORD [SI] ; Recupera el contenido de la pila (16 bits)
; y lo guarda en la direccion apuntada por; DS:SI
POP ES ; Recupera dato de 16 bits en ES
PUSHA / PUSHAD / POPA /POPAD
Introduce/extrae de la pila todos los registros de proposito general de 16/32 bits. Los
introduce en este orden: EAX, ECX, EDX, EBX, ESP, EBP, ESI y EDI (igual para los de 16
bits). Los recupera en sentido inverso, pero descartando el valor de SP/ESP.
PUSHAD ; Guarda todos los registros de 32 bitsPOPAD ; Recupera todos los registros de 32 bits ,
; descarta ESPPUSHA ; Guarda todos los registros de 16 bitsPOPA ; Recupera todos los registros de 16 bits ,
; descarta SP
IN Op1,Op2
Lee de un puerto de E/S hardware de 8/16/32 bits
; Op1=PORT[Op2]; Op1=AL ,AX ,EAX; Op2=Inm8 , DXIN AL ,20IN EAX ,DX
IN AX ,7F8h ; Mal
MOV DX ,7F8hIN AX,DX ; Bien
OUT Op1,Op2
Escribe en un puerto de E/S hardware de 8/16/32 bits
44 Repertorio basico de instrucciones
; PORT[Op1]=Op2; Op1=Inm8 ,DX; Op2=AL,AX,EAXOUT 64h,ALOUT DX,EAX
CWD
Convierte word en dword extendiendo el signo.
CWD ; AX -> DX:AX
CDQ
Convierte dword en qword extendiendo el signo.
CDQ ; EAX -> EDX:EAX
CBW
Convierte byte en word.
CBW ; AL -> AX
CWDE
Convierte word en dword.
CWDE ; AX -> EAX , Ojo!
MOVSX r16/32,rm8/16
Copia y extiende el signo
MOVSX AX ,BH ; Antes AX= ? BH= 0F0h; Despues AX=0FFF0h BH= 0F0h
MOVZX r16/32,rm8/16
Copia y extiende con ceros
MOVZX AX ,BH ; Antes AX= ? BH= 0F0h; Despues AX= 00F0h BH= 0F0h
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 45
2.2.2. Aritmeticas
Todas estas instrucciones afectan a los flags CF, ZF, OF y SF siempre que no se indique
otra cosa.
ADD Op1,Op2
Suma: Op1=Op1+Op2.
ADD EAX ,EBX ; EAX = EAX + EBXADD WORD [BX+5],5ADD EBX ,[ESI]
ADC Op1,Op2
Suma con acarreo: Op1=Op1+Op2+CF.
ADD EAX ,EBX ; EDX EAX 64 bitsADC EDX ,ECX ; ECX EBX 64 bits
; Suma extendida CF EDX EAX 65 bits
SUB Op1,Op2
Resta: Op1=Op1-Op2
SUB EAX ,EBX ; EAX = EAX - EBXSUB EDI ,3 ; EDI = EDI - 3
SBB Op1,Op2
Resta con acarreo: Op1=Op1-Op2-CF
SBB EAX ,EBX ; EAX = EAX - EBX - CFSBB EDI ,3 ; EDI = EDI - 3 -CF
IMUL
Multiplicacion teniendo en cuenta el signo.
IMUL Op. Con un solo operando.
IMUL r/m8 ; AX = AL * r/m8IMUL r/m16 ; DX AX = AX * r/m16IMUL r/m32 ; EDX EAX = EAX * r/m32
IMUL Op1,Op2. Con dos operandos del mismo tamano.
IMUL Op1 ,Op2 ; Op1 = Op1 * Op2; Si el resultado no cabe , CF=OF=1
46 Repertorio basico de instrucciones
IMUL Op1,Op2,Op3. Con tres operandos del mismo tamano.
IMUL Op1 ,Op2 ,Op3 ; Op1 = Op2 * Op3; Op3 = Inm8 /16/32 con signo; Si el resultado no cabe , CF=OF=1
MUL Op
Multiplicacion sin signo. La diferencia con respecto a IMUL radica en como se modifica
EFLAGS para que se cumpla la regla de los signos, etc.
MUL r/m8 ; AX = AL * r/m8MUL r/m16 ; DX AX = AX * r/m16MUL r/m32 ; EDX EAX = EAX * r/m32
IDIV Op
Division con signo. Si el cociente no cabe se produce la excepcion 0 (Error en la
division).
IDIV r/m8 ; AX/rm8 , Cociente = AL, Resto = AHIDIV r/m16 ; (DX AX)/rm16 , Cociente = AX, Resto = DXIDIV r/m32 ; (EDX EAX)/rm32 , Cociente = EAX , Resto = EDX
INC Op
Incrementa el operando.
INC EAX ; EAX = EAX + 1, no afecta a EFLAGS.CF
DEC Op
Decrementa el operando.4
DEC AX ; AX = AX - 1, no afecta a EFLAGS.CF
NEG Op
Calcula el complemento a 2.
NEG EAX ; EAX = - EAX
4Cuidado con esta instruccion que no modifica el flag de acarreo (EFLAGS.CF). En los bucles que
disenemos despues de decrementar el contador deberemos compararlo con cero para que se modifique CF
y poder comparar para mayor o menor.
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 47
CMP Op1, Op2
Compara dos operando haciendo la resta Op1-Op2 y modificando EFLAGS. El resul-
tado de la resta no se almacena en ningun sitio.
CMP EAX ,EDX
2.2.3. Aritmetica BCD
Emplea el flag de semiacarreo EFLAGS.AF.
DAA
Ajuste decimal de AL despues de la suma. Para BCD empaquetado.
; AL = 79h (121) 79; BL = 35h (53) 35
ADD AL ,BL ; AL = AEh (174) valor no BCD ----DAA ; AL = 14h (20) y CF = 1 114
DAS
Ajuste decimal de AL despues de la resta. Para BCD empaquetado.
AAA
Ajuste ASCII despues de la suma. Para BCD no empaquetado.
AAS
Ajuste ASCII despues de la resta. Para BCD no empaquetado.
AAM
Ajuste ASCII despues del producto. Para BCD no empaquetado.
AAD
Ajuste ASCII antes de la division. Para BCD no empaquetado.
; 12h AAD 0Ch; ----- ======= > ------ = 3h; 4h 4h
48 Repertorio basico de instrucciones
2.2.4. Logicas
AND Op1,Op2
Operacion AND.
; AX = 1010101010101010bAND AX ,1111000011110000b ; AX AND 1111000011110000b
; AX = 1010000010100000b
OR Op1,Op2
Operacion OR.
; AX = 1010101010101010bOR AX ,1111000011110000b ; AX OR 1111000011110000b
; AX = 1111101011111010b
XOR Op1,Op2
Operacion XOR (OR exclusivo).
; AX = 1010101010101010bXOR AX ,1111000011110000b ; AX XOR 1111000011110000b
; AX = 0101101001011010b
NOT Op
Operacion NOT. Complemento a 1.
; AX = 1010101010101010bNOT AX
; AX = 0101010101010101b
2.2.5. Desplazamientos y rotaciones
SAR Op1,CL/Inm8
Desplazamiento aritmetico a la derecha un maximo de 31 posiciones. Es una division
(con signo) rapida por potencias de 2.
0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1
; EAX= 11111111000000001111111100000000bSAR EAX ,1 ; EAX= 11111111100000000111111110000000b CF = 0SAR EDX ,CL ; Desplaza CL posiciones de bit EDX
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 49
SHR Op1,CL/Inm8
Desplazamiento logico a la derecha un maximo de 31 posiciones. Es una division (sin
signo) rapida por potencias de 2.
0
0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1
; EAX= 11111111000000001111111100000010bSHR EAX ,2 ; EAX= 00111111110000000011111111000000b CF = 1
SAL/SHL Op1,CL/Inm8
Desplazamiento aritmetico/logico a la izquierda un maximo de 31 posiciones. Es un
producto rapido por potencias de 2.
0
0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 01
; EAX= 11111111000000001111111100000010bSAL EAX ,1 ; EAX= 11111110000000011111111000000100b CF = 1
SHRD rm16/32,r16/32,Inm8/CL
Desplazamiento doble a traves de otro registro a la derecha. El unico registro modifi-
cado es el destino (el primer operando).
Destino (Registro o Memoria) CF
31 0
Fuente (Registro)
31 0
Instruccion SHRD
; EAX= 12345678h, EBX =55555555hSHRD EAX ,EBX ,4 ; EAX= 51234567h, CF =1
SHLD rm16/32,r16/32,Inm8/CL
Desplazamiento doble a traves de otro registro a la izquierda. El unico registro modi-
ficado es el destino (el primer operando).
50 Repertorio basico de instrucciones
Destino (Registro o Memoria)CF
31 0
Fuente (Registro)
31 0
Instruccion SHLD
; EAX= 12345678h, EBX =55555555hSHLD EAX ,EBX ,4 ; EAX= 23456785h, CF =1
ROR Op1,CL/Inm8
Rotacion a la derecha.
Destino (Registro o Memoria) CF
031Instruccion ROR
; EAX= 11110000111100001111000011110000bROR EAX ,1 ; EAX= 01111000011110000111100001111000b CF=0
ROL Op1,CL/Inm8
Rotacion a la izquierda.
Destino (Registro o Memoria)CF
31 0Instruccion ROL
; EAX= 11110000111100001111000011110000bROL EAX ,1 ; EAX= 11100001111000011110000111100001b CF=1
RCR Op1,CL/Inm8
Rotacion a la derecha a traves del acarreo.
Destino (Registro o Memoria) CF
31 0Instruccion RCR
; EAX= 11110000111100001111000011110000b CF=1RCR EAX ,1 ; EAX= 11111000011110000111100001111000b CF=0
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 51
RCL Op1,CL/Inm8
Rotacion a la izquierda a traves del acarreo.
Destino (Registro o Memoria)CF
31 0Instruccion RCL
; EAX= 11110000111100001111000011110000b CF=1RCL EAX ,1 ; EAX= 11100001111000011110000111100001b CF=1
2.2.6. Manejo de bits o byte
BT rm16/32,r16/32/Inm8
Almacena el bit comprobado (indicado por el segundo operando) del primer operando
en EFLAGS.CF. Si se refiere a memoria el rango es [−231 . . . 231 − 1]
; Bit 7; EAX= 11110000111100001111000011110000b
BT EAX ,7 ; EFLAGS.CF=1
BTS rm16/32,r16/32/Inm8
Comprueba el bit y lo pone a ”1”.
; Bit 7; EAX= 11110000111100001111000001110000b
BTS EAX ,7 ; EAX= 11110000111100001111000011110000b; EFLAGS.CF=0
BTR rm16/32,r16/32/Inm8
Comprueba el bit y lo pone a ”0”.
; Bit 7; EAX= 11110000111100001111000011110000b
BTR EAX ,7 ; EAX= 11110000111100001111000001110000b; EFLAGS.CF=1
BTC rm16/32,r16/32/Inm8
Comprueba el bit y lo complementa.
; Bit 7; EAX= 11110000111100001111000011110000b
BTC EAX ,7 ; EAX= 11110000111100001111000001110000b; EFLAGS.CF=1
52 Repertorio basico de instrucciones
BSF rm16/32,r16/32
Busca el primer bit a ”1”hacia adelante en la fuente comenzando por el bit menos
significativo y almacena su posicion (con signo) en el destino. Si lo encuentra EFLAGS.ZF=1,
sino EFLAGS.ZF=0.
; Bit 4; EAX= 11110000111100001111000001110000b
BSF EBX ,EAX ; EBX= 4; EFLAGS.ZF=1
BSR rm16/32,r16/32
Busca el primer bit a ”1”hacia atras en la fuente comenzando por el bit mas signifi-
cativo y almacena su posicion (con signo) en el destino. Si lo encuentra EFLAGS.ZF=1, sino
EFLAGS.ZF=0.
; * bit 31; EAX= 11110000111100001111000001110000b
BSR EBX ,EAX ; EBX= 31; EFLAGS.ZF=1
SETcc rm8
Si se cumple la condicion (las mismas que tienen las instrucciones CMOVcc o Jcc intro-
duce un 1 en el destino, sino introduce un 0.
; EFLAGS.ZF=1SETZ AL ; AL = 1
; EFLAGS.CF=0SETC BH ; BH=0
TEST Op1,Op2
Realiza la funcion Op1 AND Op2 y segun el resultado se modifican EFLAGS.SF, EFLAGS.ZF
y EFLAGS.PF.
TEST AX ,BX ; AX and BX y modifica EFLAGS
2.2.7. Transferencia de control
JMP
Salto absoluto incondicional.
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 53
JMP rel8. Salto corto (SHORT). El operando indica el numero de bytes hacia adelante
(hasta 127) o hacia atras (hasta 128) con respecto a la posicion de EIP actual.
JMP rm16/rm32. Salto cercano (NEAR). Es un salto intrasegmento.
JMP ptr16/ptr32. Salto lejano (FAR). Es un salto intersegmento.
JMP Fin ; Salta a la etiqueta FinJMP NEAR OtroLado ; Salto NEARJMP 1230h:12838383h ; Salto FAR
Fin: ; El : indica que se codifique como salto; SHORT si se puede
Jcc rel16/32
Salto condicional relativo. Sirve solamente para salto intrasegmento. Utiliza las mismas
condiciones que las instrucciones CMOVcc o SETcc. Ademas existe la version:
JCXZ Direccion ; Salta si CX = 0, no decrementa CX ni; comprueba EFLAGS.ZF
JECXZ Dir2 ; Salta si ECX = 0, no decrementa ECX ni; comprueba EFLAGS.ZF
LOOP rel8
Bucle con CX/ECX como contador.
; Decrementa CX/ECX dependiendo del modo; de direccionamiento 16/32 bits; Si CX/ECX != 0 salta a la direccion; sino pasa a la instruccion siguiente
[BITS 16]MOV CX ,20 ; Repetira 20 veces el bucle
Bucle:...LOOP Bucle ; Fin del bucle
LOOPZ/LOOPE rel8
Igual que el anterior solo que repite si CX/ECX es distinto de cero y ademas EFLAGS.ZF = 1.
LOOPNZ/LOOPNE rel8
Igual que LOOP solo que repite si CX/ECX es distinto de cero y ademas EFLAGS.ZF = 0.
54 Repertorio basico de instrucciones
CALL
Llamada a subrutina.
CALL dir. Llamada cercana (NEAR) o intrasegmento.
; Direccionamiento de 16 bits[BITS 16]
...CALL dir16 ; El funcionamiento es el siguiente:
; SP = SP -2; [SP] = IP; IP = dir16
; Direccionamiento de 32 bits[BITS 32]
...CALL dir32 ; El funcionamiento es el siguiente:
; ESP = ESP -4; [ESP] = EIP; EIP = dir32
CALL sel:dir. Llamada lejana (FAR) o intersegmento.
; Direccionamiento de 16 bits[BITS 16]
...CALL sel:dir16 ; El funcionamiento es el siguiente:
; SP = SP -2; [SP] = CS; SP = SP -2; [SP] = IP; IP = dir16; CS = sel
; Direccionamiento de 32 bits[BITS 32]
...CALL sel:dir32 ; El funcionamiento es el siguiente:
; ESP = ESP -4; [ESP] = CS; ESP = ESP -4; [ESP] = EIP; EIP = dir32; CS = sel
Cuando se guarda CS en la pila de 32 bits la parte superior se rellena con ceros.
El funcionamiento de esta instruccion, ası como las instrucciones de salto intersegmento,
son mucho mas complejas en modo protegido.
RET/RET n
Retorno de subrutina. Recupera el registro IP/EIP de la pila si es un retorno NEAR. Si
se trata de un retorno FAR (RETF) ademas recupera el registro CS.
Si la instruccion tienen un operando inmediato, retorna igual y luego suma ESP=ESP+n.
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 55
INT Inm8
Llamada software a una interrupcion.
[BITS 16]; Direccionamiento de 16 bits
INT n ; El funcionamiento es el siguiente:; SP = SP - 2; [SP] = FLAGS; SP = SP - 2; [SP] = CS; SP = SP - 2; [SP] = IP; FLAGS.IF = 0; FLAGS.TF = 0; FLAGS.AC = 0; IP = [0:n*4]; CS = [0:n*4+2]
Con 32 bits serıa similar.
IRET/IRETD
Retorno de interrupcion 16/32 bits.
[BITS 16] ; Direccionamiento de 16 bits...IRET ; El funcionamiento es el siguiente:
; IP = [SP]; SP = SP + 2; CS = [SP]; SP = SP + 2; FLAGS = [SP]; SP = SP + 2; FLAGS.IF = 1
Estas instrucciones son mas complicadas en el modo de funcionamiento protegido del
microprocesador.
INT3
Identico a INT 3 solo que la instruccion se codifica en un solo byte. Se aprovecha para
poner puntos de ruptura en los programas depuradores de codigo.
INTO
Se produce INT 4 si EFLAGS.OF=1.
BOUND
Detecta un valor fuera de rango para indexar una matriz. Muy poco utilizada.
56 Repertorio basico de instrucciones
ENTER
Reserva una zona de datos en la pila para parametros locales. Se utiliza mucho en
compiladores de lenguajes de alto nivel. Para mas informacion acudir a la referencia [4]
LEAVE
Es la instruccion recıproca de ENTER. Para mas informacion acudir a la referencia [4]
2.2.8. Manejo de bloques de datos
Utiliza como punteros DS:ESI y ES:EDI si usamos un direccionamiento de 32 bits (di-
rectiva BITS 32) si no usara DS:SI y ES:DI.
MOVSB / MOVSW / MOVSD
Copia un bloque de datos
[ES:EDI ]=[DS:ESI]Si EFLAGS.DF=0 ESI=ESI+(1,2,4)
EDI=EDI+(1,2,4)Si EFLAGS.DF=1 ESI=ESI -(1,2,4)
EDI=EDI -(1,2,4)
CMPSB / CMPSW / CMPSD
Compara un bloque de datos
CMP [DS:ESI],[ES:EDI]ESI=ESI+-(1,2,4) ; Dependiendo de EFLAGS.DFEDI=EDI+-(1,2,4) ; y del operando
La salida es EFLAGS.ZF=1 si son iguales los bloques comparados
SCASB / SCASW / SCASD
Explora un bloque de datos en busca de un elemento
CMP Acumulador ,[ES:EDI] ; Acumulador = AL ,AX ,EAX , segun inst.EDI=EDI+-(1,2,4) ;
La salida es EFLAGS.ZF=1 si son iguales
LODSB / LODSW / LODSD
Lee un bloque de datos
Acumulador =[DS:ESI] ; Acumulador = AL ,AX ,EAX , segun inst.ESI=ESI+-(1,2,4) ;
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 57
STOSB / STOSW / STOSD
Escribe en un bloque de datos
[ES:EDI]= Acumulador ; Acumulador = AL ,AX ,EAX , segun inst.EDI=EDI+-(1,2,4) ;
INSB / INSW / INSD
Lee un bloque de datos desde un puerto de E/S
[ES:EDI]=Port[DX] ; El puerto podra ser de 8,16 o 32 bitsEDI=EDI+-(1,2,4)
OUTSB / OUTSW / OUTSD
Escribe un bloque de datos en un puerto de E/S
Port[DX]=[DS:ESI] ; El puerto podra ser de 8,16 o 32 bitsESI=ESI+-(1,2,4)
REP
Prefijo de repeticion. Decrementa CX/ECX y si no es cero repite la instruccion siguiente.
Ejemplo: Copia de un bloque
MOV AX ,DATOSMOV DS ,AXMOV ES ,AXMOV ESI ,TXTORG ; DS:ESI apunta al origenMOV EDI ,TXTDEST ; ES:EDI apunta al destinoCLD ; DF=0, incrementara punterosMOV ECX ,TAMANOREP MOVSB ; Lo copia
Ejemplo: Compara dos bloques
MOV AX ,DATOSMOV DS ,AXMOV AX ,DATOS2MOV ES ,AXMOV ESI ,TXTORG ; DS:ESI apunta al origenMOV EDI ,TXTDEST ; ES:EDI apunta al destinoCLD ; DF=0, incrementara punterosMOV ECX ,TAMANOREPZ CMPSB ; Si al salir ZF = 1 es que son iguales
; sino DS:ESI -1 apunta al primer dato; diferente
Ejemplo: Busqueda de un dato en un bloque
MOV AL ,CaracterMOV BX ,DATOSMOV ES ,BX
58 Repertorio basico de instrucciones
MOV EDI ,TXTDEST ; ES:EDI apunta al BLOQUECLD ; DF=0, incrementara punterosMOV ECX ,TAMANOREPNE SCASB ; Si al salir ZF = 1 es que encontro el dato en la
; posicion ES:EDI -1
REPZ / REPE
Prefijo de repeticion. Idem, y repite si CX/ECX no es cero y ZF=1.
REPNZ / REPNE
Prefijo de repeticion. Idem, y repite si CX/ECX no es cero y ZF=0.
2.2.9. Control de FLAGS
STC
Sin operandos. EFLAGS.CF=1
CLC
Sin operandos. EFLAGS.CF=0
CMC
Sin operandos. EFLAGS.CF=/CF
CLD
Sin operandos. EFLAGS.DF=0
STD
Sin operandos. EFLAGS.DF=1
CLI
Sin operandos. EFLAGS.IF=0
STI
Sin operandos. EFLAGS.IF=1
Capıtulo 2. Arquitectura Intel. Nivel aplicacion 59
LAHF
Carga los flags de condiciones en AH
AH= SF ,ZF ,AF ,PF ,CFBit 4 3 2 1 0
SAHF
Guarda AH en FLAGS
2.2.10. Acceso a registros de segmento
LDS,LES,LFS,LGS,LSS
Cargan un puntero FAR. Ejemplo:
LDS DX ,[ES:BX]
4
DS
DX
BX
ES
2.2.11. Miscelanea
LEA r16/32, mem
Cargan una direccion efectiva en el destino. Sirve para simplificar los accesos poste-
riores a la posicion de memoria especificada.
LEA BX ,[SI+16] ; BX = SI + 16LEA EAX ,[ES:EBX+EAX *4+16] ; EAX = EBX + EAX*4 + 16
NOP
Esta instruccion no realiza ninguna operacion. Su utilidad esta en poder alinear las
instrucciones con determinadas posiciones de memoria (direcciones pares o multiplos de
4, etc.)
60 Repertorio basico de instrucciones
NOP
UD2
Codigo de operacion para una instruccion no definida. Genera una excepcion de ins-
truccion no reconocida. Se trata de un codigo de operacion reservado para que pueda
servir de prueba para la excepcion de instruccion no reconocida. En cada nuevo mode-
lo de la Arquitectura Intel se anaden instrucciones que ocupan los codigos de operacion
disponibles.
XLATB
Traduce bytes usando una tabla de 256 valores
XLATB ; AL = [DS:EBX + (sin signo) AL]
CPUID
Introduce en EAX, EBX, ECX y EDX la informacion de identificacion del procesador. Para
mas informacion consultar la Ref. [4].
CPUID
Capıtulo 3
Unidad de punto flotante (FPU)
3.1. Introduccion
Los numeros en punto flotante estan compuestos por dos numeros enteros: mantisa
y exponente, ademas de un bit que indica el signo (cuando es igual a 1 el numero es
negativo). El valor que representan se construye como:
V alor = (−1)signo ∗ mantisa ∗ 2exponente
La FPU cumple los estandares IEEE 754 y 854.1 Trabaja con numeros normalizados
que son aquellos que llenan toda la mantisa y que dan la maxima precision. Su bit mas
significativo esta siempre a 1, y por lo tanto no necesitamos almacenarlo.
3.2. Tipos de datos
3.2.1. Numeros reales
Real corto (32 bits).
V alor = (−1)signo ∗ mantisa ∗ 2(exponente−127)
Trabaja con un exponente desplazado de 8 bits y con el bit mas significativo de la
mantisa a 1, pero no representado (oculto).
1IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Std 754-1985. Especifıca el for-
mato de los numeros, operaciones basicas, conversiones, y condiciones de excepcion. El estandar IEEE
854-1987 generaliza el 754 para cubrir la aritmetica binaria y decimal.
61
62 Tipos de datos
0
Punto Flotante de Precision Simple
3130 23 22
FraccionExp.Signo
Uno Implicito
El rango de valores representables con este formato esta entre
[−3,40 × 1038 . . . − 1,18 × 10−38] y [1,18 × 10−38 . . . 3,40 × 1038].
Real largo (64 bits)
V alor = (−1)signo ∗ mantisa ∗ 2(exponente−1023)
Tiene un exponente desplazado de 11 bits y tambien trabaja con un 1 oculto.
Sign
0
Punto Flotante de Precision Doble
63 62 Uno Implicito
Signo Exponente Fraccion
52 51
El rango de valores representables esta entre
[−1,79 × 10308 . . . − 2,23 × 10−308] y [2,23 × 10−308 . . . 1,79 × 10308].
Real temporal (80 bits)
V alor = (−1)signo ∗ mantisa ∗ 2(exponente−16383)
Tiene un exponente desplazado de 15 bits. El bit mas significativo de la mantisa
sı que esta presente y vale 1 cuando el numero esta normalizado, si no vale 0.
0
Punto Flotante de Doble Precision Extendida
79
Signo
78 6463
FraccionExponente
62 Uno Explicito
El rango de valores representables esta entre
[−1,18 × 104932 . . . − 3,37 × 10−4932] y [3,37 × 10−4932 . . . 1,18 × 104932].
Los reales cortos y largos estan siempre normalizados ya que tienen implıcitamente
un 1 oculto. Los reales temporales pueden estar o no normalizados.
3.2.2. Numeros enteros
Entero palabra (word integer), 16 bits, rango: [−32768 . . . 32767].
Entero corto (double word), 32 bits, rango: [−231 . . . 231 − 1].
Capıtulo 3. Unidad de punto flotante (FPU) 63
Entero largo (quadword), 64 bits, rango: [−263 . . . 263 − 1].
BCD empaquetado (Binary Coded Decimal) 18 dıgitos mas el signo (estandar Co-
bol).
0
Enteros BCD Empaquetados
79
D0
0
Entero Largo (Quadword)
63
4 Bits = 1 Digito BCD
0
Entero Corto (Dword)
31
0
Entero Palabra
15
Signo
D1D2D3D4D5D6D7D8D9D10D11D12D13D14D15D16D17
78 72 71
X
62
14
30
Signo
Signo
Signo
3.2.3. Numeros reales especiales
Entre estos estarıan:
Los infinitos, que se obtienen al dividir por cero.
Los ceros que tienen signo.
Los no normalizados, que aumentan la resolucion cerca del cero pero con menos
dıgitos de precision
Los no numeros, que pueden ser de senalizacion (SNaN: Signaling Not a Number)
o silenciosos (QNaN: Quiet Not a Number). Estos se obtienen como resultado de
operaciones del tipo:√−1 o log(−1).
1 0
S E Sig
−0
1 0−FinitoNo Normalizado
NaN
1 1...254 −FinitoNormalizado
1 255 −∞
255 SNaN
255 QNaN
0 0
S E Sig
0 0
NaN
0 1...254
0 255
X 255 1.0XX...
255 1.1XX...
+0
+FinitoNo Normalizado
+FinitoNormalizado
+∞
SNaN
QNaN X
X
X
Números Reales y Codificaciones NaN para Punto Flotante de 32-Bit
− Finito No Normalizado
−Finito Normalizado −0−∞ +∞
+Finito No Normalizado
+Finito Normalizado+0
0.XXX...
0.000...
1.000...
1.XXX...
1.000...
0.000...
0.XXX...
1.XXX...
1.0XX...
1.1XX...
64 Arquitectura de la FPU
3.3. Arquitectura de la FPU
La FPU opera en paralelo con las demas unidades aritmeticas del microprocesador.
3.3.1. Pila de registros de datos
Dispone de 8 registros de 80 bits (real temporal) que forman una pila circular de
8 entradas. El campo SW.TOP de 3 bit apunta a la cima de la pila. La estructura tipo
pila circular es muy util para la evaluacion de expresiones aritmeticas y nos ahorra el
almacenamiento en variables temporales intermedias. Las instrucciones trabajan con el
registro apuntado por TOP de forma implıcita y con cualquier otro si se explıcita. El registro
apuntado por TOP se llama ST0 y los demas se numeran a partir de ahı: ST1, ST2,. . . ST7.
7
6
5
4
3
2
1
0
Pila de Registros de Datos de la FPU
ST(2)
ST(1)
ST(0)
Top
011B
La PilaCrece Asi
3.3.2. Registro de estado (Status Word: SW)
Describe el estado de la unidad de punto flotante:
FPU Busy
15 1314 11 10 9 8 7 6 5 4 3 2 1 0
BIE
PE
OE
UE
ZE
DE
TOP
Top of Stack Pointer
Exception Flags Precision Underflow Overflow Zero Divide Denormalized Operand Invalid Operation
Stack Fault
Error Summary Status
Condition Code
C2
C1
C0
ES
SF
C3
Indicadores de excepcion.
• IE: Operacion invalida. Puede ser por:
Capıtulo 3. Unidad de punto flotante (FPU) 65
◦ Stack Overflow or Underflow. Pila llena o vacıa.
◦ Operacion aritmetica invalida.
• DE: Operando no normalizado.
• ZE: Division por cero.
• OE: Desbordamiento superior: numero muy grande.
• UE: Desbordamiento inferior: numero muy pequeno.
• PE: Perdida de precision.
SF: Stack fault. Fallo de pila.
• C1=1, Stack Overflow. Desbordamiento de la pila. No caben mas datos.
• C1=0, Stack Underflow. Desbordamiento de la pila. No se pueden sacar mas
datos porque esta vacıa.
C0, C1, C2, C3: Codigos de condicion de la FPU. Se trasladan al registro EFLAGS
como sigue:
FSTSW AX ; AX = SWSAHF ; C0 ,C1 ,C2 ,C3 se ponen en EFLAGSJcc @Salto
0
CodigoCondicion
BanderaEstado
C0C1C2C3
CF(nada)
PFZF
CF
1PF
ZF
731 Registro EFLAGS
0
C2
C1
C3
Registro AX
0C
15
0
C2
C1
C3
Palabra de Estado FPU (SW)
0C
15
Instruccion FSTSW AX
Instruccion SAHF
B: Busy. FPU ocupada con una excepcion. Identico a ES, por compatibilidad 8087.
ES: Error Status summary. Vale 1 cuando se produce una excepcion no enmascarada.
TOP: Senala la cima de la pila.
Los flags IE, DE, ZE, OE, UE, PE, ES, SF, B son bits pegajosos (sticky bits), esto es,
se ponen automaticamente a 1, pero es el programador el que debe ponerlos de nuevo a 0.
66 Arquitectura de la FPU
3.3.3. Registro de control (Control Word: CW)
Controla el funcionamiento de algunos detalles de la unidad de punto flotante.
15 1314 12 11 10 9 8 7 6 5 4 3 2 1 0
XIM
PM
OM
UM
ZM
DM
RC PC
Infinity ControlRounding ControlPrecision Control
Exception Masks Precision Underflow Overflow Zero Divide Denormal Operand Invalid Operation
Reserved
IC: Infinity control. Control de infinitos
• (=0) Infinito proyectivo (infinito y cero sin signo, solo 80287).
• (=1) Infinito afın (infinito y cero con signo). En los ultimos modelos de la
Arquitectura Intel de 32 bits este bit siempre vale 1.
Mascaras de excepcion. Permiten o prohıben las excepciones producidas por la FPU.
• IM: Operacion invalida.
• DM: Operando no normalizado.
• ZM: Division por cero.
• OM: Desbordamiento superior: numero muy grande.
• UM: Desbordamiento inferior: numero muy pequeno.
• PM: Perdida de precision.
PC: Control de precision. Indica con que precision se almacenan los resultados en
el destino en instrucciones de +, -, *, / y raız cuadrada; el resto usan real temporal
o su resolucion implıcita.
; PC Precision; ---------------------------------; 00: 24 bits mantisa(real corto); 01: Reservado; 10: 53 bits (real largo); 11: 64 bits (real temporal)
Capıtulo 3. Unidad de punto flotante (FPU) 67
RC: Modo de redondeo.
; RC Modo; ------------------------------------------; 00: al mas cercano o al par (por defecto); 01: hacia +infinito; 10: hacia -infinito; 11: truncado (hacia cero)
3.3.4. Registro de marcas (Tag Word: TW)
Tiene dos bits por cada registro de la pila circular e indica si esta ocupado o no. Indica
registro fısico, no referido a la cima de la pila.
015
Valores de TAG
TAG(7) TAG(5)TAG(6) TAG(4) TAG(3) TAG(2) TAG(1) TAG(0)
00 -- Valido01 -- Cero10 -- Especial: invalido (NaN, No soportados), infinito, o no normalizado11 -- Vacio
3.3.5. Punteros de operandos e instrucciones
Guardan punteros que apuntan hacia la ultima instruccion -no de control- ejecutada
y hacia su operando.
Puntero a la ultima instruccion en punto flotante.
Puntero al ultimo operando.
Opcode. Almacena el codigo de la operacion (12 bits) de la ultima instruccion de
punto flotante ejecutada2.
031
0
4
8
12
16
20
24
Formato en Modo Protegido de 32 Bit
Palabra de Control (CW)
15
Opcode 10...00
Palabra de Estado (SW)
Palabra de Marcas (TW)
Selector Puntero Instr. FPU
Selector Puntero Oper. FPU
Desplazamiento del Puntero a Operando de la FPU
0 0 0 0
Desplazamiento del Puntero de Instruccion de la FPU
Reservado
16
2Se ignora el prefijo de escape de la instruccion.
68 Repertorio de instrucciones
3.4. Repertorio de instrucciones
3.4.1. Transferencia de datos
Convierten el dato en real temporal al pasarlo a los registros de la pila FPU.
FLD. Carga un valor en punto flotante de la memoria en la cima de la pila. Hay que
especificar el tamano del dato.
.text; Pila FPU: ST0 ,ST1 ,...
FLD dword [Variable_real_corto] ; 12.0FLD qword [Variable_real_largo] ; 13.0 12.0FLD tword [Variable_real_temporal]; 14.0 13.0 12.0
.dataVariable_real_corto dd 12.0 ; Hay que especificar el puntoVariable_real_largo dq 13.0 ; decimalVariable_real_temporal dt 14.0
FST/FSTP. Almacena en memoria el valor en punto flotante que esta en la cima de la
pila. La version con la P final indica que el elemento ademas se elimina de la pila.
FILD. Carga un valor en formato entero en la cima3 de la pila. Hay que especificar
el tamano del dato: word, dword, qword.
FIST/FISTP. Almacena en memoria en formato entero.
FBLD. Carga de la memoria a la cima de la pila un numero en formato BCD empa-
quetado de 80 bits.
FBSTP. Almacena en memoria el valor de la cima de la pila en formato BCD empa-
quetado.
FXCH. Intercambia el contenido de dos posiciones de la pila. Si solo se especifica un
operando el otro es implıcitamente la cima de la pila.
; Pila FPU: ST0 , ST1 ,..; 14.0 13.0 12.0
FXCH ST1 ,ST0 ; 13.0 14.0 12.0FXCH ST2 ; 12.0 14.0 13.0
FCMOVcc. Realiza una copia condicional entre dos posiciones de la pila dependiendo
del contenido de EFLAGS. Las instrucciones se muestran en la siguiente tabla:
3Al cargar el dato siempre se convierte a formato real temporal de 80 bits.
Capıtulo 3. Unidad de punto flotante (FPU) 69
Table 8-5. Floating-Point Conditional Move Instructions
Mnemonico Instruccion Banderas de Estado Condicion
FCMOVB CF=1
FCMOVNB CF=0 No Menor
FCMOVE ZF=1 Igual
FCMOVNE ZF=0 No Igual
FCMOVBE CF=1 or ZF=1 Menor o Igual
FCMOVNBE CF=0 and ZF=0 Ni menor ni Igual
FCMOVU PF=1 Desordenado
FCMOVNU PF=0 Ordenado
Menor
3.4.2. Aritmeticas
La P final extrae un dato de la pila de la FPU
FADD/FADDP. Suma dos valores de la pila.
FADD ST1 ; ST0=ST0+ST1FADD ST7 ,ST0 ; ST7=ST7+ST0 , al menos uno de los dos
; operandos debe ser ST0FADDP ST2 ; ST2=ST2+ST0 y quita ST0
FIADD. Suma un entero que esta en memoria con la cima de la pila.
FIADD word [Entero] ; ST0=ST0+[ Entero], leyendo entero corto
FSUB/FSUBP Resta dos valores de la pila.
FSUB ST2 ; ST0=ST0 -ST2FSUB dword [EBP] ; ST0=ST0 -[EBP], leyendo un real cortoFSUB ST1 ,ST0 ; ST1=ST1 -ST0 , al menos uno de los dos
; debe ser ST0FSUBP ST2 ; ST2=ST2 -ST0 y quita ST0
FISUB. Resta entero.
FISUB dword [Entero]; ST0=ST0 -[ Entero], leyendo entero largo
FSUBR/FSUBRP. Resta inversa.
FSUBR ST2 ; ST0=ST2 -ST0FSUBR dword [EBP] ; ST0=[EBP]-ST0 , leyendo un real cortoFSUBR ST1 ,ST0 ; ST1=ST0 -ST1 , al menos uno de los dos
; debe ser ST0
FISUBR. Resta inversa entero.
FISUBR dword [Entero];ST0=[ Entero]-ST0 , leyendo entero largo
70 Repertorio de instrucciones
FMUL/FMULP. Multiplica.
FMUL ST2 ; ST0=ST0*ST2FMUL dword [EBP] ; ST0=ST0*[EBP], leyendo un real cortoFMUL ST1 ,ST0 ; ST1=ST1*ST0 , al menos uno de los dos
; debe ser ST0
FIMUL. Multiplica entero.
FDIV/FDIVP. Divide.
FDIV ST2 ; ST0=ST0/ST2FDIV dword [EBP] ; ST0=ST0/[EBP], leyendo un real cortoFDIV ST1 ,ST0 ; ST1=ST1/ST0 , al menos uno de los dos
; debe ser ST0
FIDIV. Divide por entero.
FDIVR/FDIVRP. Division inversa.
FDIVR ST2 ; ST0=ST2/ST0FDIVR dword [EBP] ; ST0=[EBP]/ST0 , leyendo un real cortoFDIVR ST1 ,ST0 ; ST1=ST0/ST1 , al menos uno de los dos
; debe ser ST0
FIDIVR. Division inversa por entero.
FABS. Valor absoluto.
FABS ; ST0=abs(ST0)
FCHS. Cambia el signo.
FCHS ; ST0=-ST0
FSQRT. Raız cuadrada.
FSQRT ; ST0=sqrt(ST0)
FPREM. Resto parcial. Resto = ST0-ST1*entero(ST0/ST1).
FPREM ; ST0=ST0 -ST1*entero(ST0/ST1)
FPREM1 Resto parcial IEEE. Idem redondeo mas proximo en vez de hacia 0.
FRNDINT. Redondea a entero (segun CW.RC).
FXTRACT. Extrae el exponente y la mantisa. ST0=mantisa, ST1=exponente.
FSCALE. Escala con potencias de 2. ST0=ST0×2entero(ST1).
FSCALE ; ST0=ST0 *2^( entero(ST1))
Capıtulo 3. Unidad de punto flotante (FPU) 71
3.4.3. De comparacion
La P final extrae un dato de la pila de la FPU. Si termina en PP elimina los dos datos
de la cima de la pila.
FCOM/ FCOMP/ FCOMPP. Compara y modifica SW segun el resultado, siendo:
(C1 = sin significado, C2 = Cero, C3 = Paridad, C0 = Acarreo.
FUCOM/ FUCOMP/ FUCOMPP. Comparacion sin orden y modifica SW. Igual, pero genera
excepcion si SNaN. C2=C1=C0=1 si QNaN, desordenados.
FICOM/ FICOMP. Comparacion con entero y modifica SW.
FCOMI/ FCOMIP. Compara y modifica EFLAGS.(ZF, PF, CF).
FUCOMI/ FUCOMIP. Compara sin orden y modifica EFLAGS.
FTST. Compara con 0.0
FXAM. Examina dato en la cima de la pila y devuelve C0, C2 y C3, siguiendo la tabla:
.
Clase C3 C2 C0
No Soportado 0 0 0
NaN 0 0 1
Numero Normal Finito 0 1 0
Infinito 0 1 1
Cero 1 0 0
Vacio 1 0 1
Numero No Normalizado 1 1 0
3.4.4. Funciones trigonometricas
FSIN. Halla el seno. ST0 = sin(ST0).
FCOS. Halla el coseno. ST0 = cos(ST0).
FSINCOS. Halla el seno y el coseno. ST1=sin(ST0), ST0=cos(ST0).
FPTAN. Halla la tangente. ST1=tg(ST0), ST0=1.0. SW.C2=1, si no se completa.
FPATAN. Halla el arcotangente. ST0=arctg(ST1/ST0) y elimina un dato de la pila. C2=1,
si no se completa. Devuelve un valor en el rango [−π, π]
72 Repertorio de instrucciones
3.4.5. Otras funciones trascendentales
FYL2X. Calcula: ST0=ST1*log2(ST0) y elimina un dato de la pila. Recordamos que
loga(b) = log2(b)log2(a)
FYL2XP1. Calcula: ST0=ST1*log2(ST0+1), siempre que (−1 +√
2/2 <ST0< 1 −√
2/2).
F2XM1. Calcula: ST0=2ST0-1, siempre que (−0,5 <ST0< 0,5).
3.4.6. Carga de constantes
Cargan en ST0 los valores indicados:
FLDZ. Carga ST0 = +0.0
FLD1. Carga ST0 = +1.0
FLDPI. Carga ST0 = π
FLDL2T. Carga ST0 = log2(10)
FLDL2E. Carga ST0 = log2(e)
FLDLG2. Carga ST0 = log10(2)
FLDLN2. Carga ST0 = loge(2)
3.4.7. Control de la FPU
FNxxx indica que no se comprueban las excepciones
FINIT/FNINIT. Inicializa FPU.
FLDCW. Carga la palabra de control CW.
FSTCW/FNSTCW. Almacena en memoria CW.
FSTSW/FNSTSW. Almacena la palabra de estado SW.
FCLEX/FNCLEX. Borra los flags de excepcion.
FLDENV. Carga el entorno de la FPU (todo menos la pila FPU).
FSTENV/FNSTENV. Almacena el entorno.
Capıtulo 3. Unidad de punto flotante (FPU) 73
FRSTOR. Recupera el estado de la FPU. Es todo lo relacionado con la FPU y ocupa
108 bytes.
FSAVE/FNSAVE. Salva el estado de la FPU.
FINCSTP. Incrementa el registro TOP.
FDECSTP. Decrementa el registro TOP.
FFREE. Vacıa un registro de la pila de la FPU.
FNOP. No operacion.
WAIT/FWAIT. Espera a la FPU para sincronizarse.
74 Repertorio de instrucciones
3.4.8. Resumen de instrucciones
En esta tabla se muestra un resumen de las instrucciones de la unidad de punto
flotante.
Instrucciones No Aritmeticas Instrucciones Aritmeticas
FABS F2XM1
FCHS FADD/FADDP
FCLEX FBLD
FDECSTP FBSTP
FFREE FCOM/FCOMP/FCOMPP
FINCSTP FCOS
FINIT/FNINIT FDIV/FDIVP/FDIVR/FDIVRP
FLD (registro a registro) FIADD
FLD (formato extendido desde memoria FICOM/FICOMP
FLD constante FIDIV/FIDIVR
FLDCW FILD
FLDENV FIMUL
FNOP FIST/FISTP
FRSTOR FISUB/FISUBR
FSAVE/FNSAVE FLD (formato doble y sencillo)
FST/FSTP (registro-a-registro) FMUL/FMULP
FSTP (formato extendido a memoria) FPATAN
FSTCW/FNSTCW FPREM/FPREM1
FSTENV/FNSTENV FPTAN
FSTSW/FNSTSW FRNDINT
WAIT/FWAIT FSCALE
FXAM FSIN
FXCH FSINCOS
FSQRT
FST/FSTP (formato doble y sencillo)
FSUB/FSUBP/FSUBR/FSUBRP
FTST
FUCOM/FUCOMP/FUCOMPP
FXTRACT
FYL2X/FYL2XP1
Capıtulo 4
Tecnologıa MMX
4.1. Introduccion
Es un conjunto de extensiones para mejorar el rendimiento en operaciones repetitivas
de calculo intensivo que se dan en aplicaciones multimedia: graficos, video, sonido, etc.
Consisten en:
Ocho registros MMX.
Cuatro tipos de datos MMX.
Cincuenta y siete instrucciones MMX.
4.2. Registros
MM7
MM6
MM5
MM4
MM3
MM2
MM1
MM0
63 0
Se dispone de 8 registros de 64 bits (MM0..MM7). Solo se pueden utilizar para realizar calculos
con tipos de datos MMX. No se puede direccionar la memoria con ellos, solo contienen
75
76 Tipos de datos
datos. Estan mapeados -son sinonimos- en los registros (R0 .. R7) de la pila de la unidad
de punto flotante (FPU).1
4.3. Tipos de datos
Hay 4 tipos:
Vector de words
Vector de bytes
Vector de doublewords
063
063
063
Vector de bytes (bytes empaquetados): 8 bytes agrupados en un registro MMX de
64 bits: vector de 8 valores enteros tamano byte.
Vector de words (words empaquetados): cuatro palabras agrupadas en un registro
MMX de 64 bits: vector de 4 valores enteros tamano word.
Vector de doublewords (dwords empaquetados): dos dwords agrupados en un registro
MMX de 64 bits: vector de 2 valores enteros tamano dword.
Quadword (cuadruple palabra): valor de 64 bits.
4.4. Modelo de ejecucion SIMD
La tecnologıa MMX utiliza la tecnica SIMD (Single Instruction Multiple Data) para
que una instruccion opere sobre varios datos a la vez como si se tratase de vectores.
Ej.:
PADDSB ; Suma 8 bytes con signo con 8 bytes con; signo y almacena el resultado en 8 bytes
Esta tecnica aumenta el rendimiento software al operar sobre los datos en paralelo.
Esta pensada para aplicaciones multimedia.
1Los registros ST0..ST7 se situan en los registros R0..R7 de la FPU de forma dinamica, dependiendo
del campo TOP del registro de estado de la FPU.
Capıtulo 4. Tecnologıa MMX 77
4.5. Formato de los datos en memoria
Sigue siendo little endian. Los registros MMX tienen dos modos de acceso:
1. Acceso de 64 bits.
Acceso a memoria con 64 bits.
Transferencia entre registros MMX.
Instrucciones PACK, logicas, aritmeticas.
Algunas instrucciones UNPACK.
2. Acceso de 32 bits.
Acceso a memoria con 32 bits.
Transferencia entre registros de 32 bits y MMX.
Algunas instrucciones UNPACK.
4.6. Saturacion y wraparound (enrollamiento)
La forma de tratar el desbordamiento es diferente segun el tipo de aritmetica utilizada:
Aritmetica con wraparound (enrollamiento). Los resultados que no caben (overflow,
underflow) por grandes o pequenos son truncados y solamente los bits menos sig-
nificativos forman el resultado. El acarreo se ignorara en el resultado (solo en las
operaciones MMX).
Aritmetica con saturacion. Los resultados que no caben (overflow, underflow) por
grandes o pequenos son saturados (recortados) y puestos en el lımite del rango de
los datos.
• Si se supera el rango de los datos se satura poniendo el valor maximo del rango.
• Si el resultado se queda por debajo del mınimo se satura el mismo poniendo el
valor mınimo del rango.
Este modo es muy util sobre todo en calculos con datos multimedia como los colores,
las senales de audio, etc.
Las instrucciones MMX no indican el overflow o underflow ni generando excepciones ni
modificando EFLAGS.
78 Conjunto de instrucciones
4.7. Conjunto de instrucciones
Todas las instrucciones MMX (excepto EMMS) tienen dos operandos: Destino y Fuen-
te y la operacion es
Destino = Destino operacion Fuente,
donde Destino y Fuente son memoria o un registro MMX. Si es una operacion de
transferencia de datos ademas puede ser un registro entero de 32 bits.
4.7.1. Transferencia de datos
MOVD Copia 32 bits. Ej.:
MOVD EAX ,MM0 ; EAX=parte baja (MM0)MOVD MM1 ,ECX ; La parte alta de MM1 a 0
MOVQ Copia 64 bits. Ej.:
MOVQ [ES:EBX],MM0MOVQ MM7 ,MM3 ; MM7=MM3
4.7.2. Aritmeticas
PADDB / PADDW / PADDD Suma empaquetada con enrollamiento Ej.:
; MM0=(1,2,3,4,5,6,7,8); MM1=(8,7,6,5,4,3,2,1)
PADDB MM0 ,MM1 ; MM0=(9,9,9,9,9,9,9,9)PADDD MM1 ,[ES:ESI] ; MM1 += [ES:ESI], 2xDWORD
PADDSB / PADDSW Suma empaquetada con saturacion y con signo.
PADDUSB / PADDUSW Suma empaquetada con saturacion y sin signo.
PSUBB / PSUBW /PSUBD Resta empaquetada con enrollamiento.
PSUBSB / PSUBSW Resta empaquetada con saturacion y con signo.
PSUBUSB / PSUBUSW Resta empaquetada con saturacion y sin signo.
PMULLW / PMULHW Multiplicacion empaquetada Hace 4 productos de 16 bits con resul-
tados de 32 bits de los que se elige la parte baja (PMULLW) o la parte alta (PMULHW).
Capıtulo 4. Tecnologıa MMX 79
X3 X2 X1 X0
Z3 = X3 ∗ Y3 Z2 = X2 ∗ Y2 Z1 = X1 ∗ Y1 Z0 = X0 ∗ Y0
Fuente
Destino
Destino
Y3 Y2 Y1 Y0
Temporal
Z3[15-0] Z2[15-0] Z1[15-0] Z0[15-0]
Ej.:
; MM0 = (40, 20, 10, 30); MM1 = (10, 20, 30, 40)
PMULLW MM0 ,MM1 ; MM0 = (Low(400) ,Low(400) ,Low(300), Low (1200)); = (400 ,400 ,300 ,1200)
PMADDWD Multiplicacion y suma.
X3 X2 X1 X0
X3 ∗ Y3 X2 ∗ Y2 X1 ∗ Y1 X0 ∗ Y0
Fuente
Destino
Destino
Y3 Y2 Y1 Y0
(X1∗ Y1) + X0∗ Y0)(X3∗ Y3) + X2∗ Y2)
Temporal
; MM0 = ( 40, 20, 10, 30); MM1 = ( 10, 30, 40, 20)
PMADDWD MM0 ,MM1 ; MM0 = ( 40*10+20*30 , 10*40+30*20); = ( 1000, 1000 )
4.7.3. De comparacion
PCMPEQB /PCMPEQW / PCMPEQD Comparacion para igual Hace las comparaciones elemen-
to a elemento y almacena todo ceros si no eran iguales y todo unos si eran iguales.
PCMPGTB /PCMPGTW / PCMPGTD Comparacion para mayor Hace las comparaciones ele-
mento a elemento y almacena todo ceros si no era mayor y todo unos si era mayor.
4.7.4. De conversion
PACKSSWB / PACKSSDW Empaqueta con saturacion y con signo. Los numeros de partida
son considerados con signo. PACKSSWB pasa de words a bytes. PACKSSDW pasa de dwords
a words.
80 Conjunto de instrucciones
D C
Fuente 64-Bit
Destino 64-Bit
D’ C’ B’ A’
Destino 64-Bit
B A
PACKUSWB Empaqueta con saturacion y sin signo. Los numeros de partida son consi-
derados con signo.
PUNPCKLBW /PUNPCKLWD / PUNPCKLDQ Desempaqueta y entremezcla (interleave) parte
baja.
X0X3 X2 X1 Y0Y3 Y2 Y1
X0X3 X2 X1Y0Y3 Y2 Y1 X4X7 X6 X5Y4Y7 Y6 Y5
Fuente Destino
Destino
PUNPCKHBW /PUNPCKHWD / PUNPCKHDQ Desempaqueta y entremezcla (interleave) parte al-
ta. Sirven para mezclar las partes altas y bajas de los resultados.
X4X7 X6 X5 Y4Y7 Y6 Y5
X0X3 X2 X1Y0Y3 Y2 Y1 X4X7 X6 X5Y4Y7 Y6 Y5
Fuente Destino
Destino
4.7.5. Logicas
PAND AND logico.
PANDN NOT destino AND fuente.
POR OR logico.
PXOR XOR logico.
Capıtulo 4. Tecnologıa MMX 81
4.7.6. Desplazamiento
PSLLW / PSLLD / PSLLQ Desplazamiento logico a la izquierda.
Pre-Despl.Destino
Destino
Desplzamiento a la
X0
X0 <<Cuenta
X3 X2 X1
X1 <<CuentaX2 <<CuentaX3 <<Cuenta
Izquierda conExtension con Ceros
PSRLW / PSRLD / PSRLQ Desplazamiento logico a la derecha.
PSRAW / PSRAD Desplazamiento aritmetico a la derecha.
Antes Despl.Destino
Destino
Desplazamiento a la
X0
X0 >>Cuenta
X3 X2 X1
X1 >>CuentaX2 >>CuentaX3 >>Cuenta
Derecha con Extension del Signo
4.7.7. Instruccion EMMS
EMMS (Empty MMx State) pone todas las marcas (tags) de la FPU en vacıo, es decir,
vacıa los registros de la FPU para poder hacer operaciones en punto flotante. Cualquier
instruccion MMX, excepto EMMS, pone a cero (ocupado con datos validos) todas las marcas
del la FPU (registro TW). Es la instruccion que hay que poner al acabar la zona de codigo
que usa MMX, a partir de ahı se podra usar la FPU. Debido a que los registros MMX
y la pila de la FPU comparten la misma localizacion es preciso separar las zonas de
codigo MMX de las de FPU. Antes de entrar en la zona MMX hay que procurar no dejar
informacion en la pila de datos de la FPU.
Deteccion de la arquitectura MMX:
mov eax ,1cpuid
test edx ,00800000h ; El bit 23 = 1 indica MMXjnz @MMXFound
; No MMX ...
@MMXFound:....
82 Conjunto de instrucciones
4.7.8. Resumen de instrucciones
En esta tabla se muestra un resumen de las instrucciones de la tecnologıa MMX.
Table 9-2. MMX Instruction Set Summary
CategoriaCon Signo
SaturacionSin Signo
Aritmeticas Suma
Resta
Multiplicacion
Multiplica y Suma
PADDB, PADDW, PADDD
PSUBB, PSUBW, PSUBD
PMULL, PMULH
PMADD
PADDSB, PADDSW
PSUBSB, PSUBSW
PADDUSB, PADDUSW
PSUBUSB, PSUBUSW
Comparacion Compara para Igual
Compara paraMayor que
PCMPEQB, PCMPEQW, PCMPEQD
PCMPGTPB, PCMPGTPW, PCMPGTPD
Conversion Empaquetado PACKSSWBPACKSSDW
PACKUSWB
Desempaqueta Alto
Bajo
PUNPCKHBW, PUNPCKHWD, PUNPCKHDQ
PUNPCKLBW, PUNPCKLWD, PUNPCKLDQ
Vectores Quadword
Logica And
And Not
Or
Exclusive OR
PAND
PANDN
POR
PXOR
Desplazamiento Logico a la Izquierda
Logico a la Derecha
Aritmetico a la Derecha
PSLLW, PSLLD
PSRLW, PSRLD
PSRAW, PSRAD
PSLLQ
PSRLQ
Doubleword Transfers Quadword Transfers
Transferencias Entre Registros
Desde Memoria
Hacia Memoria
MOVD
MOVD
MOVD
MOVQ
MOVQ
MOVQ
Limpia Registros MMX EMMS
SaturacionEnrrollamiento
Capıtulo 5
Arquitectura INTEL
(Nivel Sistema)
5.1. Introduccion
La familia Intel proporciona muchas facilidades hardware para la implementacion de
Sistemas Operativos seguros y con buenas prestaciones. Estas caracterısticas comprenden:
La gestion de la memoria.
La proteccion en modulos software.
La gestion de interrupciones y excepciones.
La multitarea.
La monitorizacion del rendimiento y la depuracion de aplicaciones.
La gestion del consumo y otros recursos hardware.
La gestion de las memorias cache.
El multiproceso con varios microprocesadores.
En la figura siguiente podemos ver de un vistazo la complejidad que permite la Ar-
quitectura Intel de 32 bits en cuanto al diseno de Sistemas Operativos.
83
84 Modos de operacion
Tabla de DescriptoresLocales (LDT)
Registro EFLAGS
Registros de Control
CR1CR2CR3CR4
CR0Tabla de Descriptores
Globales (GDT)
Tabla de Descriptoresde Interrupcion (IDT)
IDTR
GDTR
Interrupt Gate
Trap Gate
Desc. LDT
Desc. TSS
Codigo
Pila
Codigo
Pila
Codigo
Pila
Segmento de Estadode Tarea (TSS)
Codigo
Datos
Pila
Tarea
Controlador de Interrupciones
Controlador de Excepciones
Protected Procedure
Sel. Seg. TSS
Selector de Segmentode Puerta de Llamada
Dir Tabla Desplaz.
Direccion Lineal
Directorio de Paginas
E. Dir. Pag.
Espacio de Direcciones Lineal
Dir. Lineal
0
Desc. Seg.Sel. Segmento
Segmento de CodigoDatos o Pila
Vector deInterrupciones
Desc. TSS
Desc. Seg.
Task Gate
TSSActual
P. Llamada
Segmento deEstado de Tarea (TSS)
Codigo
Datos
Pila
Tarea
Desc. Seg.
TSSActual
TSSActual
Selector de Segmento
Direccion Lineal
Registro de Tarea
CR3*
Tabla de Paginas
E. Tabla Pag.
Pagina
Dir. Fisica
LDTR
Este mapeado de paginas es para paginas de 4 KBy con direcciones fisicas de 32 bit
Registro
*Direccion Fisica
Direccion Fisica
Se representan los mecanismos de gestion de la memoria como son la segmentacion y
la paginacion. Se ven las estructuras de datos necesarias para la gestion de la misma,
ademas de las estructuras necesarias para la gestion de las interrupciones, excepciones y
tareas. Tambien podemos ver algunos de los registros del sistema involucrados en dichos
mecanismos.
5.2. Modos de operacion
El diagrama de estados que describe los distintos modos de operacion y la forma de
conmutar entre ellos se muestra a continuacion:
Capıtulo 5. Arquitectura INTEL(Nivel Sistema) 85
Modo de
Modo Protegido
Virtual-8086Modo
ModoManejoSistema
PE=1Reset o
VM=1VM=0
PE=0
Reseto
RSM
SMI#
RSM
SMI#
RSM
SMI#
Reset
RealDireccionamiento
Para pasar de modo real a modo protegido es necesario poner CR0.PE=1, siempre y cuando
las estructuras de datos necesarias esten preparadas en memoria y ciertos registros apunten
a ellas, mientras que el retorno a modo real desde modo protegido se consigue haciendo
CR0.PE=0 o mediante la activacion de la patilla de RESET.
Para pasar de modo protegido al sub-modo Virtual86 hay que activar el bit EFLAGS.VM=1
y para retornar a modo protegido lo ponemos a cero.
Para pasar a modo de gestion del sistema desde cualquier otro modo de funcionamiento
es necesario que la patilla SMI# del microprocesador se active (se usara un espacio de
direcciones de memoria alternativo). El retorno al modo de origen se consigue con la
ejecucion de la instruccion RSM.
Desde cualquier modo la activacion de la patilla RESET del microprocesador hara que
se pase a modo de direccionamiento real.
Modo protegido
Es el modo nativo.
Todas las prestaciones hardware estan disponibles.
Se obtiene el maximo rendimiento del sistema.
Recomendado para la implementacion de Sistemas Operativos y aplicaciones.
Incorpora el sub-modo Virtual86 que permite ejecutar software 8086 con direccio-
namiento real en un entorno multitarea protegido.
86 Entorno de ejecucion
Modo de direccionamiento real
El entorno de trabajo es el de un 8086 con algunas extensiones.
El microprocesador comienza en este modo (tras un reset).
Modo de gestion del sistema
Permite el control del ahorro de energıa y otras caracterısticas OEM (Original Equip-
ment Manufacturer) de forma transparente e independiente del Sistema Operativo
instalado.
Aumenta la seguridad del sistema. Permite implementar un control de acceso inde-
pendiente del Sistema Operativo.
5.3. Entorno de ejecucion
5.3.1. Bits del sistema (EFLAGS)
Repasamos del registro EFLAGS los bits del sistema.
31 2930 28 27 26 25 24 23 22 21 20 19 18 17 16
0RF
ID
AC
VM
X Virtual-8086 Mode (VM)X Resume Flag (RF)
X Nested Task (NT)
X I/O Privilege Level (IOPL)X Overflow Flag (OF)
X Direction Flag (DF)X Interrupt Enable Flag (IF)
X Alignment Check (AC)
X ID Flag (ID)X Virtual Interrupt Pending (VIP)
15 1314 12 11 10 9 8 7 6 5 4 3 2 1 0
0CF
AF
PF 1
DF
IF
TF
SF
ZF
NT 000 0 0 0 0 0 0 0 0
VI
P
VIF
OF
IOPL
X Virtual Interrupt Flag (VIF)
X Trap Flag (TF)
S Sign Flag (SF)S Zero Flag (ZF)
S Auxiliary Carry Flag (AF)S Parity Flag (PF)
S Carry Flag (CF)
No deben ser modificados por los programas de usuario
IF (bit 9) Interrupt enable flag. Mascara de interrupciones. Enmascara las interrup-
ciones externas (patilla INTR) cuando vale cero. Los campos CPL, EFLAGS.IOPL y
CR4.VME determinan si puede o no ser modificado.
Capıtulo 5. Arquitectura INTEL(Nivel Sistema) 87
TF (bit 8) Trap flag. Ejecucion paso a paso. Habilita la depuracion paso a paso.
Cuando esta activado, tras la ejecucion de una instruccion se ejecuta una interrup-
cion para poder depurar el resultado de la instruccion.
IOPL (bits 12 y 13) I/O privilege level field. Nivel de privilegio de E/S. Si nues-
tro nivel de privilegio actual CPL≤EFLAGS.IOPL, podremos acceder directamente a
los puertos de E/S, sino habra que comprobar el mapa de acceso a E/S del TSS
(Segmento de Estado de Tarea) actual (ver pagina 136). Solo se puede modificar si
CPL=0.
NT (bit 14) Nested task. Senaliza que estamos en una tarea anidada.
RF (bit 16) Resume flag. Reanudacion. Controla la respuesta del procesador en las
excepciones de depuracion.
VM (bit 17) Virtual 8086 mode flag. Habilita el modo Virtual86. Al ponerse a cero
se retorna a modo protegido.
AC (bit 18) Alignment check flag. Habilita el chequeo del alineamiento en las refe-
rencias a memoria. Se enmascara con CR0.AM=0.
VIF (bit 19) Virtual interrupt flag. Imagen virtual de IF. Se usa junto con VIP. Solo
es valido si CR4.VME=1 y EFLAGS.IOPL<3.
VIP (bit 20) Virtual interrupt pending flag. Indica si hay una interrupcion pendiente.
El procesador solo lee este flag. Lo modifica el Sistema Operativo. Solo es valido si
CR4.VME=1 y EFLAGS.IOPL<3.
ID (bit 21) Identification flag. Indica el soporte o no de la instruccion CPUID.
5.3.2. Registros para la gestion de la memoria
Estos registros especifican donde se encuentran las estructuras de datos que controlan
el modelo de memoria segmentada.
047
GDTR
IDTR
Registros del Sistema para Tablas
Direccion Base Lineal 32-bit Lim. Tabla 16-bit
1516
Direccion Base Lineal 32-bit
0Registro de
LDTR
Registros de Segmentos
Sel. Seg.
15
Sel. Seg.
Direccion Base Lineal 32-bit Limite Segmento
Atributosdel Sistema
Direccion Base Lineal 32-bit Limite Segmento
Tarea (TR)
Lim. Tabla 16-bit
(Se Cargan Automaticamente)Registros de Descriptores de Segmento
88 Entorno de ejecucion
GDTR (Global Descriptor Table Register)
Registro que apunta a la Tabla de Descriptores Globales (GDT). Esta compuesto de:
BASE (32 bits): Direccion lineal primer byte de la tabla.
LIMITE (16 bits): Tamano en bytes de la tabla.
Inicialmente BASE=0, LIMITE=0FFFFh (64KB). Se debe tener la tabla preparada antes de
modificar este registro.
IDTR (Interrupt Descriptor Table Register)
Registro que apunta a la Tabla de Descriptores de Interrupcion. Tiene la misma com-
posicion que el anterior.
LDTR (Local Descriptor Table Register)
Registro que apunta a la Tabla de Descriptores Locales (LDT). Al modificar el selector
se buscan los datos en la GDT y se actualizan los registros cache.
TR (Task Register)
Registro de Tarea. Apunta al segmento que contiene el Segmento de Estado de Tarea
(TSS :Task State Segment) actual. Referencia a un descriptor de la GDT.
5.3.3. Registros de control
CR0
Controla el modo de operacion y los estados del procesador. La distribucion de bits se
puede observar en la siguiente figura:
W
P
A
M
N
W
P
G
C
D
P
E
E
M
M
P
T
S
N
E
E
T CR0
31 2930 30 19 18 17 16 15 6 5 4 3 2 1 0
Los bits que lo componen tienen el siguiente significado:
PG (Paging) Activa (=1) la paginacion (en modo protegido).
CD (Cache Disable) Desactiva (=1) la memoria cache (L1 y L2).
Capıtulo 5. Arquitectura INTEL(Nivel Sistema) 89
NW (Not Write-Trough) Desactiva (=0) el modo write-through de escritura de las
memorias cache.
Escritura
Lectura
Microprocesador Memoria Caché L1Memoria Caché L2
Memoria Principal (RAM)
Método WRITE-BACK, solo se vuelca a la memoria principal cuando se necesita la memoria caché para otros bloques
Método WRITE-THROUGH, cada vez que se escribe se lleva hasta la memoria principal
AM (Alignment Mask) Activa el chequeo de alineacion de datos en memoria. Para
ello EFLAGS.AC=1 con CPL=3 y en modo protegido.
WP (Write Protect) Prohıbe (=1) a las tareas de super usuario escribir en las paginas
de usuario de solo lectura. (=0) Permite escribir en esas paginas.
NE (Numeric Error) Habilita (=1) el mecanismo estandar de tratamiento de errores
de la FPU. Por defecto funciona de otra manera.
ET (Extension Type) Indicaba si habıa FPU. Actualmente vale siempre 1.
TS (Task Switched) Indica cambio de tarea (=1). Permite salvar el estado de la FPU
cuando se produce un cambio de tarea.
EM (Emulation) FPU emulada (=1) por software.
MP (Monitor coprocessor) FPU presente (=1). Auto-excluyente con EM.
PE (Protected Enable) Activa el MODO PROTEGIDO (=1).
CR1
Registro de 32 bits reservado.
CR1
31 0
90 Entorno de ejecucion
CR2
Registro de 32 bits que indica la direccion lineal del fallo de pagina.
Direccion Lineal del Fallo de Pagina CR2
31 0
CR3
Tambien llamado PDBR (Page Directory Base Register) es el registro base del direc-
torio de paginas. Contiene una direccion fısica (bits 31..12, los restantes se rellenan con
ceros).
Base del Directorio de PaginasPWT
PCD
CR3
31 12 11 5 4 3 2 0
(PDBR)
PCD (Page-Level Cache Disable) Activa (=0) la cache a nivel de paginas. Valido si
CR0.PG=1 y CR0.CD=0.
PWT (Page-Level Writes Transparent) Controla el mecanismo de write-through (=1)
o write-back (=0) a nivel de paginas. Valido si CR0.PG=1 y CR0.CD=0.
CR4
Contiene flags de control que activan algunas extensiones hardware. Los bits que lo
componen se describen a continuacion:
VME
PSE
TSD
DE
PVI
PGE
MCE
PAE
PCE
CR4Reservados (puestos a 0)
31 9 8 7 6 5 4 3 2 1 010
OSFXSROSXMMEXCPT
VME (Virtual-8086 Mode Extensions) Activa (=1) extensiones para el manejo de
excepciones e interrupciones en modo V86. Permite mejorar el rendimiento de este
tipo de aplicaciones.
PVI (Protected-Mode Virtual Interrupts) Permite el uso hardware en modo protegido
del bit EFLAGS.VIF.
TSD (Time Stamp Disable) Restringe (=1) la ejecucion de la instruccion RDTSC a
nivel 0.
Capıtulo 5. Arquitectura INTEL(Nivel Sistema) 91
DE (Debugging Extensions) (=1) Las referencias a los registros de depuracion DR4
y DR5 producen una excepcion de codigo de operacion no definido. (=0) Funciona
para compatibilidad.
PSE (Page Size Extensions) Permite paginas de 4MB y 4KB (=1), o solo de 4KB
(=0).
PAE (Physical Address Extensions) Activa (=1) el direccionamiento fısico de 36 bits
(solo funciona con paginacion).
MCE (Machine Check Enable) Permite (=1) la excepcion de chequeo de maquina.
PGE (Page Global Enable) Permite paginas globales (compartidas por varios usua-
rios). Ası no se borran las entradas de la TLB (es una memoria cache de traduccion
de paginas) al cambiar de tarea (mejor rendimiento).
PCE (Performance Monitoring Counter Enable) Permite (=1) la ejecucion de la
instruccion RDPMC, de lectura de contadores de monitorizacion del rendimiento, desde
cualquier nivel de privilegio. (=0) Solo desde nivel 0.
OSFXR (Operating System Support for FXSAVE and FXRSTOR instructions). In-
dica que las instrucciones FXSAVE y FXRSTOR estan presentes. Salvaran el estado de los
registros XMMn y MXCSR de las tecnologıas SSEx ademas del estado de la FPU/MMX.
OSXMMEXCPT (Operating System Support for Unmasked SIMD Floating-Point
Exceptions). No hablamos de este.
5.4. Instrucciones a nivel del sistema
La mayorıa de estas instrucciones solo pueden ejecutarse desde nivel de privilegio 0.
5.4.1. Carga y almacenamiento en registros del sistema.
LLDT r/m16 Carga el registro LDTR.
SLDT m Almacena el registro LDTR.
LGDT m16-32 Carga GDTR.
SGDT m Almacena GDTR.
LIDT m16-32 Carga IDTR.
92 Instrucciones a nivel del sistema
SIDT m Almacena IDTR.
LTR r/m16 Carga el registro de tarea TR.
STR m Almacena TR.
MOV CRn,r32 Carga los registros de control CRn.
MOV r32, CRn Almacena los registros de control.
SMSW r/m16 Almacena la palabra de estado maquina (MSW).
LMSW r/m16 Carga MSW (Machine Status Word: 16 bits bajos de CR0).
CLTS Borra CR0.TS.
5.4.2. Verificacion de los privilegios de acceso
ARPL r/m16,r16 Ajusta el RPL (Requested Privilege Level) del selector de segmento
especificado.
LAR r16, r/m16 Carga los derechos de acceso (atributos del segmento). Solo Modo
Protegido.
LAR r32,r/m32 Idem.
LSL r16,r/m16 Carga el lımite del segmento apuntado por el selector especificado.
LSL r32,r/m32
VERR r/m16 Verifica segmento para lectura. EFLAGS.ZF=1 si correcto.
VERW r/m16 Verifica segmento para escritura. EFLAGS.ZF=1 si correcto.
5.4.3. Carga y almacenamiento en registros de depuracion
Existen 8 registros de depuracion DR0..DR7 de 32 bits.1
MOV DRn,r32 Carga el registro de depuracion DRn.
MOV r32,DRn Almacena el registro DRn.
1Ver Capıtulo 11 en la pagina 149.
Capıtulo 5. Arquitectura INTEL(Nivel Sistema) 93
5.4.4. Invalidacion de caches y TLBs
INVD Invalida la cache. No se produce un write-back. Se pierden datos.
WBINVD Invalida la cache, pero con write-back. No pierde datos.
INVLPG m Invalida una entrada de la TLB (Translation Lookaside Buffer: Bufer de
traduccion de paginas)
5.4.5. Control del procesador
HLT Para el procesador. La activacion de la patilla NMI, RESET u otras saca al
procesador de este estado.
LOCK (prefijo) Bloquea los buses. Sirve para poder ejecutar instrucciones atomicas
(indivisibles). Por ejemplo para la realizacion de semaforos2, en entornos multipro-
cesador.
RSM Retorno del modo de gestion del sistema (SMM :System Management Mode).
5.4.6. Contadores de Monitorizacion del Rendimiento
Los registros especıficos del modelo (MSR) son contadores que sirven para la verifica-
cion, depuracion y monitorizacion del rendimiento y deteccion de los errores de chequeo
de la maquina. Su numero es grande y dependen del modelo de micro. Son de 64 bits.
RDMSR (Read Model Specific Register) Carga el registro especıfico del modelo (MSR)
indicado en ECX en los registros EDX:EAX.
WRMSR Almacena en el MSR indicado por ECX el contenido de EDX:EAX. Tambien escribe
informacion en los MTRR (Memory Type Range Registers) que aparecieron a partir
del Pentium Pro.
RDPMC (Read Performance Monitoring Counter). Los 40 bits inferiores del registro
PMC indicado en ECX se copian en EDX:EAX.
2Los semaforos en el ambito del diseno de Sistemas Operativos son variables que advierten del uso
actual de un recurso del sistema por parte de alguna CPU o subsistema. Las CPUs deben consultar
esta variable antes de usar el recurso hardware, y para evitar problemas se debe hacer una lectura-
modificacion-escritura de la variable en un unico ciclo no interrumpible para evitar que entre nuestra
lectura y modificacion otra CPU pueda modificar el estado de la variable llegando a un conflicto por usar
el recurso desde dos CPUs diferentes.
94 Instrucciones a nivel del sistema
RDTSC (Read Time Stamp Counter). El registro TSC (Time Stamp Counter) es un
MSR que cuenta los ciclos de reloj desde que se empezo a alimentar el microprocesa-
dor. Es un contador de 64 bits. Para poder utilizar esta instruccion debe cumplirse
que, o bien CR4.TSD = 0 (Time Stamp Disable), o bien que CR4.TSD = 1 y CPL=0. Tras
ejecutar la instruccion en el conjunto EDX:EAX se encuentra el valor de la cuenta.
Cuestion
Escribe un pequeno programa que sea capaz de esperar durante 1 segundo, sabiendo que la velocidad
de la CPU es de 3.8 GHz (3,8 109 Hercios).
Solucion
La solucion esta clara, hay que usar la instruccion RDTSC que nos devuelve en EDX:EAX el numero de
ciclos de reloj transcurridos desde que se arranco el microprocesador:
rdtsc ; EDX EAX contienen una marcamov ecx ,edxmov ebx ,eax ; La memorizo en ECX EBX
@espera:rdtsc ; Leo una nueva marcasub eax ,ebxsbb edx ,ecx ; Hallo la diferenciacmp eax ,3800000000 ; 3 800 000 000 * 1 segjbe @espera ; Repite hasta que se supere
; el numero de ciclos
Capıtulo 6
La memoria en modo protegido
6.1. Introduccion
La memoria en modo protegido dispone dentro de la Arquitectura Intel de dos meca-
nismos para ser accedida, uno de ellos obligatorio: la segmentacion, y el otro opcional: la
paginacion.
Segmentacion
Consiste en dividir la memoria en zonas denominadas segmentos que estaran definidas
por un origen (base), un tamano (lımite) y un conjunto de propiedades o atributos que
definiran su comportamiento. Estos segmentos de memoria permiten aislar la zona de
codigo, de datos y de pila de cada programa de forma que no puedan interferirse unos
segmentos con otros, ni unos programas con otros si no se ha definido ası. Estas propie-
dades se almacenan en unas estructuras de datos denominadas descriptores de segmento
que se encuentran situadas en unas tablas de descriptores dentro de la memoria.
El mecanismo de la segmentacion de memoria no se puede deshabilitar y trabaja con
un espacio de direcciones lineales. Es posible hacer que los segmentos se solapen bajo la
responsabilidad del programador.
La segmentacion soporta la memoria virtual1 definiendo un espacio de direcciones
virtuales mucho mas grande que el espacio de direcciones lineales. De esta manera, se
consiguen 64TB (1 TeraByte = 240 bytes) de direcciones virtuales o logicas
1Se define la memoria virtual como aquella que se presenta al programador en el entorno de ejecucion
y que no necesariamente reside en la memoria principal fısica del computador. Puede estar localizada
en la memoria masiva del sistema: disco duro, CDROM, etc.; o a traves de la red de comunicaciones
distribuida en otras maquinas.
95
96 Introduccion
(214) ∗ (232) = (246) = 64TB
frente a los 4GB (232) de direcciones lineales que tiene por defecto.
Paginacion
La paginacion consiste en dividir la memoria fısica2 del sistema en bloques denomi-
nados paginas, de un tamano tıpico de 4KB, que comienzan en direcciones multiplo de
4KB. Las paginas no se solapan por definicion. La paginacion es un mecanismo opcional
que interviene despues de la segmentacion.
Las direcciones lineales generadas por el mecanismo de la segmentacion seran, si se
usa la paginacion, traducidas al espacio de direcciones fısicas. Si no se usa la paginacion
el espacio de direcciones lineales coincide con el espacio de direcciones fısicas.
Permite implementar un sistema de memoria virtual bajo demanda de paginas de
forma que el entorno de ejecucion de un programa quede mapeado en memoria tal como
se necesite. Cada segmento se divide en paginas que se almacenan en la memoria y en
el disco. El Sistema Operativo mantiene unas estructuras de datos especiales: directorio
de paginas y tablas de paginas para ser capaz de traducir las direcciones lineales en
fısicas y seguir la pista a las paginas. La ventaja fundamental de la paginacion es que
los programas no necesitan ocupar un bloque de posiciones de memoria contiguas, si no
que pueden utilizar diferentes paginas que estaran colocadas en la memoria principal de
manera que se ocupe completamente rellenando los huecos de diversos tamanos dejados
por otros programas ejecutados y finalizados en un Sistema Operativo multitarea.
Al acceder a una direccion lineal, esta se convierte en fısica. Si la pagina que incluye
esa direccion no esta en memoria fısica, se interrumpe la ejecucion (excepcion de fallo
de pagina) para leerla del disco y continuar. El intercambio de paginas (swapping) es
transparente3 a la ejecucion de los programas.
Un esquema general del funcionamiento del acceso a la memoria se puede observar en
la figura siguiente.
2Aquı entendemos por memoria fısica la memoria principal: RAM, ROM; del computador. En otras
palabras la memoria que esta conectada directamente a los buses de direcciones y datos del microproce-
sador.3Cuando el trasiego de paginas entre la memoria masiva (disco duro) y la memoria principal (RAM) es
muy frecuente ralentizando la ejecucion de los programas se habla de trashing, que significa en traduccion
literal que se le esta dando una paliza al sistema.
Capıtulo 6. La memoria en modo protegido 97
Global (GDT)Tabla Descripcion
Espacio DireccionesLineales
Segmento
DescriptorSegmento
Desplazamiento
Direccion Logica
Direccion Basedel Segmento
Pagina
Dir. FisicaDir. Lineal
SelectorSegmento
Dir Tabla Desplaz.
Direccion Lineal
Tabla de Paginas
Directorio Pag.
Entrada
Espacio
Fisicas
Entrada
(o Puntero Lejano (FAR))
PaginacionSegmentation
Direcciones
Pagina
6.2. Segmentacion
6.2.1. Modelos de memoria
Con la segmentacion de la memoria se pueden definir diferentes modelos de memoria
sobre los que se puede trabajar.
Modelo plano
Es un espacio de direcciones no segmentado. Necesita al menos de dos descriptores de
segmento (codigo y datos4) que tendran un tamano de 4GB cada uno empezando ambos
en la direccion lineal 0.
4La pila necesaria para el funcionamiento de cualquier programa puede utilizar el mismo descriptor
de segmento que es segmento de datos.
98 Segmentacion
Espacio de Direcciones Lineales(o Memoria Fisica)
Datos y
FFFFFFFFHSegmento
LimiteAcceso
Direccion Base
Registros de
CS
SS
DS
ES
FS
GS
Codigo
0
de Codigo y DatosDescriptores de Segmento
Pila
No Presente
Modelo plano protegido
Funciona igual solo que si intentamos acceder a posiciones de memoria fısica no pre-
sentes, generara una excepcion.
Espacio Direcciones Lineales(o Memoria Fisica)
Datos y
FFFFFFFFHRegistros de
LimiteAcceso
Direccion Base
Segmento
CS
ES
SS
DS
FS
GS
Codigo
0
Descriptores deSegmento
LimiteAcceso
Direccion Base
Memoria E/S
Pila
No Presente
Modelo multi-segmentado
Los segmentos son privados y del tamano justo, aunque tambien pueden ser comparti-
dos. Cada tarea tiene su conjunto de segmentos. Se vigila si nos salimos de los segmentos
y se puede prohibir realizar determinadas acciones en algunos segmentos (solo lectura,
niveles de proteccion).
6.2.2. Direcciones logicas, lineales y fısicas
Direcciones Logicas y Lineales
La direccion logica o virtual se compone de un selector de segmento (16 bits) y de un
desplazamiento (32 bits).
El selector de segmento indexa en la Tabla de Descriptores Globales (GDT) o en la
Tabla de Descriptores Locales (LDT) actual un descriptor de segmento. Una vez com-
probado que el desplazamiento esta en los lımites del segmento y que tengamos nivel de
Capıtulo 6. La memoria en modo protegido 99
privilegio suficiente para acceder se le suma la direccion base y se obtiene la direccion
lineal segun se hace notar en la figura:
Desplazamiento
0
Direccion Base
Tabla Descriptores
DescriptorSegmento
31
Selector Seg.
015DireccionLogica
+
Direccion Lineal
031
Para pasar de la direccion lineal a la direccion fısica esta el mecanismo de la paginacion.
Si la paginacion esta desactivada, entonces, las direcciones lineales son directamente las
direcciones fısicas.
Direcciones Fısicas
En modo protegido se dispone de 4GB de espacio de direcciones fısicas (las que se
ponen en el bus de direcciones). Puede estar ocupado con memoria (RAM, ROM) y/o
con dispositivos perifericos de Entrada/Salida.
A partir de Pentium Pro CR4.PAE = 1 activa una extension del direccionamiento fısico
hasta 64 GB (236) aunque solamente funciona si esta activada la paginacion.
6.2.3. Registros selectores de segmento
Disponemos de 6 registros de segmento: CS, DS, ES, FS, GS, SS de 16 bits. Disponen de
una parte oculta (cache) que contiene el descriptor del segmento al que apuntan para
acelerar las referencias a memoria5.
El formato interno de los registros selectores de segmento tiene el siguiente significado
en modo protegido:
15 3 2 1 0
TI
Indice
Indicador Tabla
0 = GDT 1 = LDTNivel de Privilegio Requerido (RPL)
RPL
5El acceso a las tablas de descriptores solo ocurre cuando modificamos un selector de segmento. Las
posteriores referencias a los registros selectores de segmentos hacen uso del valor memorizado en la parte
oculta de los registros.
100 Segmentacion
El ındice selecciona una de las 8192 (213) entradas (como maximo) de la GDT o una
de las 8192 (213) entradas de la LDT actual.
El indicador de tabla selecciona la tabla (a traves de GDTR o LDTR).
RPL (Requested Privilege Level) sera el nivel de privilegio solicitado para acceder al
segmento.
6.2.4. Tablas de Descriptores de segmento
La primera entrada de la GDT se usa como selector de segmento nulo. Si intentamos
acceder al segmento apuntado por el se producira una excepcion.
A continuacion mostramos el esquema de funcionamiento:
Selector deSegmento
Tabla deDescriptores
T
Primer Descriptor enGDT no se utiliza
TI = 0I
56
40
48
32
24
16
8
0
TI = 1
56
40
48
32
24
16
8
0
Globales (GDT)
Tabla deDescriptores
Locales (LDT)
Direccion Base
Limite
Registro GDTR Registro LDTR
Direccion Base
Sel. Seg.
Limite
6.2.5. Descriptores de segmento
Los descriptores de segmento son estructuras de datos que se encuentran en la GDT,
LDT o IDT (Interrupt Descriptor Table) y que describen los segmentos. El formato general
de los descriptores es:
Capıtulo 6. La memoria en modo protegido 101
31 24 23 22 21 20 19 16 15 1314 12 11 8 7 0
PBase 31:24 GDPL
TypeS0
31 16 15 0
Direccion Base 15:00 Limite Segmento 15:00
Base 23:16D/B
AVL
LimiteSeg.19:16
Lımite Tamano del segmento (20 bits). Si el campo G=0 se mide en bytes obteniendo
un rango de tamanos hasta 1 MB. Si el campo G=1 se mide en bloques o paginas
de 4 KB pudiendo definir tamanos de hasta 4 GB.
Base
Limite
TYPE.E=0 TYPE.E=1
0FFFFh si D/B=00FFFFFFFFh si D/B=1
Definicion del segmento, mediante la Base y el Limite
El tamano dependera del tipo de direccionamiento (32 bits si D/B=1 o de 16 bits si
D/B=0). Dependera de si se expande hacia arriba (TYPE.E=0) o de si se expande
hacia abajo (TYPE.E=1)
Base Senala la direccion lineal base del segmento (32 bits).
S (System) Cuando esta a cero indica que es un descriptor de un segmento especial del
sistema. En el siguiente epıgrafe se relacionan los segmentos del sistema.
TYPE Este campo ocupa los bits 8-11. Su significado es variable:
S=1, Bit 11 = 0 Se trata de un segmento de DATOS.
Bit 10 = A (Accessed) Indica si se ha accedido al segmento o no, tanto
para lectura como para escritura.
Bit 9 = W (Write Enable) Senala que esta permitido escribir en este seg-
mento de datos. Logicamente un valor nulo indica proteccion contra la
escritura.
102 Segmentacion
Bit 8 = E (Expansion Direction) Indica la forma de interpretar el valor
del lımite: (=1) Down. Se trata de un segmento de pila. (=0) Up. Se trata
de un segmento de datos convencional.
S=1, Bit 11 = 1 Se trata de un segmento de CODIGO
Bit 10 = A (Accessed) Senala que si se ha accedido al segmento. El Sistema
Operativo lo usa y lo borra. Es un bit pegajoso.
Bit 9 = R (Read Enable) Indica que del segmento se puede leer su conte-
nido ademas de ejecutarlo.
Bit 8 = C (Conforming) Cuando esta activado las transferencias de eje-
cucion a segmentos conformados se pueden hacer manteniendo el nivel de
privilegio actual.
DPL (Descriptor Privilege Level) Nivel de privilegio del segmento. No se puede ac-
ceder al segmento si no se tiene suficiente privilegio o esta conformado.
P (Present-segment) Indica si el segmento esta en memoria. Permite un sistema de
memoria virtual basado en la segmentacion.
D/B (Default Operation Size/Default Stack Size) Tamano de operacion por de-
fecto. (=1) Direccionamiento de 32 bits y usa ESP. (=0) Direccionamiento de 16 bits
y usa SP.
G (Granularity) Granularidad. (=0) Lımite medido en bytes. (=1) Lımite medido en
bloques de 4 KB. (Se ignoran los 12 bits menos significativos del offset). Si Lımite=0
los offsets 0.. 4095 son validos.
AVL (Available to software) Disponible para su uso por parte del Sistema Operativo.
Descriptores de segmentos del sistema
Cuando el campo S=0 se trata de un segmento del sistema. En la siguiente figura se
desglosan los distintos tipos de segmentos del sistema. Se ve que en algunos de ellos hay
versiones de 32 bit y de 16 bits. Estos ultimos estan por compatibilidad con el microproce-
sador 80286 que implemento una primera version del modo de funcionamiento protegido.
Actualmente no se utilizan estos segmentos del sistema de 16 bits.
Capıtulo 6. La memoria en modo protegido 103
For more information on the system-segment descriptors, see Section 3.5.1., “Segment
Table 3-2. System-Segment and Gate-Descriptor Types
Campo Tipo
Decimal 11 10 9 8 Descripcion
0 0 0 0 0 Reservado
1 0 0 0 1 16-Bit TSS (Disponible)
2 0 0 1 0 LDT
3 0 0 1 1 16-Bit TSS (Ocupado)
4 0 1 0 0 16-Bit Puerta Llamada (Call Gate)
5 0 1 0 1 Puerta Tarea (Task Gate)
6 0 1 1 0 16-Bit Puerta Interrupcion (Interrupt Gate)
7 0 1 1 1 16-Bit Puerta de Excepción (Trap Gate)
8 1 0 0 0 Reservado
9 1 0 0 1 32-Bit TSS (Disponible)
10 1 0 1 0 Reservado
11 1 0 1 1 32-Bit TSS (Ocupado)
12 1 1 0 0 32-Bit Puerta Llamada (Call Gate)
13 1 1 0 1 Reservado
14 1 1 1 0 32-Bit Puerta Interrupcion (Interrupt Gate)
15 1 1 1 1 32-Bit Puerta de Excepción (Trap Gate)
Su uso y utilidad se analizara en Capıtulos posteriores.
6.3. Paginacion
6.3.1. Paginacion normal
El espacio de direcciones lineal se divide en paginas (4 KB) que se hacen corresponder
con la memoria fısica y el disco de almacenamiento masivo. La paginacion traduce la
direccion lineal en direccion fısica. Si la pagina no esta en memoria, se produce una
excepcion de fallo de pagina y se intercambia una pagina entre memoria y disco.
Para agilizar la traduccion se dispone de los TLBs (Translation Lookaside Buffers:
Buferes de Busqueda de Traduccion6) que mantienen la traduccion para las entradas
recientemente accedidas. La mayorıa de las traducciones se hacen utilizando el contenido
de las TLBs. Cuando no se encuentra la traduccion se descarta una entrada de la TLB y se
leen todas las tablas (tacceso tablas ≈ 900× tacceso TLB). Las TLBs solo se pueden modificar
con maximo privilegio (nivel 0). Se invalidan automaticamente cuando se modifica CR3 o
se conmuta de tarea, excepto para las entradas de paginas globales.
6Los TLBs son memorias asociativas integradas dentro del circuito integrado que representa el micro-
procesador, esto es, On-Chip. Los microprocesadores Pentium y Pentium Pro tienen TLBs independientes
para direcciones que apuntan a datos e instrucciones. Ademas, el segundo, distingue TLBs diferentes para
paginas de 4KB y de 4MB.
104 Paginacion
La paginacion se activa poniendo CR0.PG = 1, pero antes es necesario tener preparadas
en memoria las tablas necesarias y que el registro CR3 apunte a la tabla directorio de
paginas.
En el modo de funcionamiento por defecto de la paginacion implementada en la Ar-
quitectura Intel de 32 bits se permiten paginas de dos tamanos diferentes: 4KB y 4MB.
El funcionamiento y las estructuras necesarias para el mismo se describen a continuacion:
Traduccion de paginas de 4KB
La direccion lineal es descompuesta en tres pedazos que van a indexar dos estructuras
de datos y la pagina traducida. En la tabla denominada Directorio de Paginas, que tiene
el tamano de una pagina de 4KB, se permiten un total de 1024 entradas. Esta tabla es
apuntada mediante CR3 que contiene una direccion fısica. Desde aquı se apunta a la base
(direccion fısica) de una Tabla de Paginas que es indexada por un segundo pedazo de la
direccion lineal y, finalmente, se obtiene una direccion base fısica de la pagina final. A
esta base se le anade el desplazamiento que procede de la direccion lineal.
En total tendremos 1024 entradas al directorio * 1024 entradas a la tabla = 220 paginas
de 4 KB que suman un total de 4GB de posiciones, lo que coincide con el espacio de
direcciones fısicas.
0
Directorio Tabla Desplazamiento
Directorio de Paginas
Entrada Dir.
CR3 (PDBR)
Tabla de Paginas
Entrada Tab. Pag.
Pagina 4-KBytes
Direccion Fisica
31 21 111222
Direccion Lineal
1024 PDE ∗ 1024 PTE = 220 Paginas32*
10
12
10
*32 bits alineados en multiplos de 4-KBytes
20
Traduccion de paginas de 4MB
Las paginas de 4MB son una extension que se activa con CR4.PSE = 1 (Page Size Ex-
tension) y es necesario encontrar el campo PS = 1 (Page Size) en la entrada del directorio
de paginas. En la figura se muestra la forma en la que el microprocesador trata la direc-
cion lineal de partida y como se indexan las diferentes tablas. En total tendremos 1024
Capıtulo 6. La memoria en modo protegido 105
entradas al directorio de paginas lo que da un maximo de 1024 paginas de 4MB que dan
la posibilidad de direccionar 4GB. Se pueden mezclar las paginas de 4KB y 4MB en el
mismo directorio de paginas.
0
Directorio Desplazamiento
Directorio de Paginas
Entrada Dir.
CR3 (PDBR)
Pagina 4-MBytes
Direccion Fisica
31 2122
Direccion Lineal
1024 PDE = 1024 Paginas
10
22
32*
*32 bits alineados en un multiplo de 4-KBytes
10
Registro CR3: Base del directorio de paginas
En el registro CR3 se almacena la direccion fısica donde se encuentra el directorio de
paginas. La pagina de 4KB donde esta contenido el directorio de paginas debe encontrarse
en memoria antes de que CR3 apunte a ella.
Base del Directorio de PaginasPWT
PCD
CR3
31 12 11 5 4 3 2 0
(PDBR)
Formato de las entradas de las tablas
Las entradas al directorio de paginas tienen el siguiente formato cuando van a apuntar
a una pagina de 4KB:
31 12 11 9 8 7 6 5 4 3 2 1 0
PS
PCA0D
PPWT
U/S
R/
WGDisponibleDireccion Base Tabla de Paginas
Entrada de Directorio de Pagina (Tabla de Paginas de 4-KBytes)
Si se trata de apuntar a una pagina de 4MB la entrada del directorio de paginas cambia
ligeramente.
31 12 11 9 8 7 6 5 4 3 2 1 0
PS
PCADD
PPWT
U/S
R/
WGDisponibleDireccion Base de la Pagina
Entrada de Directorio de Pagina (Pagina de 4-Mbytes)
22 21
ReservadoPAT
13
106 Paginacion
Finalmente, la entrada a la tabla de paginas en el caso de paginas de 4KB se muestra
seguidamente:
31 12 11 9 8 7 6 5 4 3 2 1 0
PCADD
PPWT
U/S
R/
WDisponibleDireccion Base de la Pagina
Entrada de Tabla de Paginas (Pagina de 4-KBytes)
PAT
G
En las figuras anteriores aparecen una multitud de campos que ahora se explican:
Base Direccion fısica que apunta a una tabla de paginas o a una pagina. Debera ser
multiplo de 4KB o 4MB dependiendo de a quien apunte.
P (Present). Indica si la pagina esta o no en memoria. Si al acceder no esta se produce
un fallo de pagina. Este bit lo modifica el Sistema Operativo, el microprocesador
solamente lo lee.
R/W (Read/Write). Indica si se puede escribir en la pagina o tabla o es de solo lectura.
U/S (User/Supervisor). Privilegio necesario para acceder a las paginas: si vale 0 se co-
rresponde con los niveles de privilegio 0, 1, 2 de la segmentacion (supervisor); si vale
1 se corresponde con un nivel 3 (usuario).
PWT (Page-Level Write-Through). Apunta el modo de funcionamiento de la memoria
cache en la pagina a la que apunta la entrada: (=1) Write-through, (=0) Write-back.
Si CR0.CD = 1 (Cache Disable) se ignora.
PCD (Page-Level Cache Disable). Desactiva la memoria cache para la pagina en cuestion.
Si CR0.CD = 1 se ignora este campo.
A (Accessed). Indica si se ha accedido a la pagina. El micro lo pone a uno y el Sistema
Operativo lo borra. Permite algoritmos de descarte de paginas.
D (Dirty). Indica si se ha escrito en la pagina. El micro lo pone a uno cuando se escribe
en la pagina y el Sistema Operativo debera borrarlo.
PS (Page size). Tamano de la pagina apuntada: (=0) 4 KB, (=1) 4 MB si no existe
una extension del direccionamiento fısico (Physical Address Extension) CR4.PAE = 0
o 2MB si CR4.PAE=1.
G (Global). Indica pagina global. Si CR4.PGE = 1 (Page Global Enable) y G=1 no se invali-
dara la entrada de esta pagina en la TLB ni siquiera cuando cambie CR3 o se cambie
de tarea. El Sistema Operativo lo escribe y el micro lo lee.
Capıtulo 6. La memoria en modo protegido 107
AVL (Available to software). Disponible para el software.
PAT (Page Attribute Table). A partir del microprocesador Pentium III, este bit selecciona
una entrada en la tabla de atributos de pagina (PAT). Controla el funcionamiento
de la memoria cache junto con PCD y PWT.
6.3.2. Extension del direccionamiento fısico
En los ultimos microprocesadores disenados por Intel se ha considerado necesario au-
mentar el espacio de direcciones fısicas disponibles pasando de utilizar 32 bits (4GB) a
usar 36 bits (64GB). Para poder utilizar esta extension del direccionamiento fısico sin
cambiar el tamano de los registros, etc. se hace necesario el uso de la paginacion.
Si CR4.PAE = 1 se activa la extension del direccionamiento fısico de 32 bits a 36 bits. En
este caso la paginacion pasara a funcionar con paginas de 4KB y 2MB7. El microprocesador
proporciona 4 pines extra en el bus de direcciones.
Traduccion de paginas de 4 KB
Las entradas ocupan 8 bytes (en vez de 4). La direccion lineal de 32 bits se descompone
en cuatro pedazos que indexan 3 tablas y la pagina final. Ahora las entradas contienen
unas direcciones base de 36 bits.
0
Directorio Tabla Desplazamiento
Directorio de Paginas
Entrada Dir.
Tabla de Paginas
Entrada Tab. Pag.
Pagina 4-KBytes
Direccion Fisica
31 20 111221
Direccion Lineal
Tabla de Punteros a
Entrada P. Dir.
CR3 (PDPTR)
30 29
Directorios de Pagina
Puntero a Directorio
4 PDPTE ∗ 512 PDE ∗ 512 PTE = 220Paginas
2
9
32*
12
9
*32 bits alineados en un multiplo de 32-bytes
24
7Las nuevas paginas grandes reducen su tamano con respecto a la paginacion normal despues de un
analisis del uso que se hacıa en el software de las paginas de 4MB
108 Paginacion
En total tendremos 4 entradas a la tabla de punteros a directorios de pagina * 512
entradas al directorio de paginas * 512 entradas en la tabla de paginas = 220 paginas de
4KB (4GB).
Se puede acceder a 4GB al mismo tiempo aunque no necesariamente contiguos. Para
acceder al resto de los 64GB direccionables es necesario usar otras tablas de punteros a
directorios de pagina que deberan ser apuntadas por CR3. Tambien se pueden modificar
de forma dinamica las entradas para apuntar a nuevas zonas de memoria.
Traduccion de paginas de 2 Mb
En este caso tendremos 4 punteros a directorios de pagina * 512 entradas al directorio
de paginas = 2048 paginas de 2 Mb (=4GB). El funcionamiento es similar.
0
Directorio Desplazamiento
Directorio de Paginas
Entrada Directorio
Pagina 2-MBytes
Direccion FIsica
31 2021
Direccion Lineal
Tabla de Punteros a
Entrada P. Dir.
CR3 (PDPTR)
30 29
Directorio de Pagina
Puntero aDirectorio
4 PDPTE ∗ 512 PDE = 2048 Paginas
2
32*
9
21
*32 bits alineados en uin multiplo de 32-bytes
15
Registro CR3
El formato del registro CR3 se modifica ligeramente para dar cabida a estos nuevos 4
bits:
31 0
0Direccion Base a la Tabla de punteros a Directorios de Pagina PCD
PWT
00
For Evaluation Only.
Formato de las entradas de las tablas
El significado de los diferentes campos es el mismo que en el caso de la paginacion
normal. Las entradas de las diferentes tablas para apuntar a paginas de 4KB tienen el
siguiente formato:
Capıtulo 6. La memoria en modo protegido 109
63 36 35 32
DireccionReservado (en 0)
Entrada a la Tabla de Punteros al Directorio de Paginas
31 12 11 9 8 5 4 3 2 0
PCD
PWT
DisponibleDireccion Base Directorio de Paginas
Base
Res.Reservado
63 36 35 32
DireccionReservado (en 0)
Entrada Directorio de Paginas (Tabla de Paginacion 4-KBytes)
31 12 11 9 8 7 6 5 4 3 2 1 0
PC0D
PPWT
Direccion Base de la Tabla de Paginas
Base
0 0 AR/
W
U/S
63 36 35 32
DireccionReservado (en 0)
Entrada de Tabla de Paginas (Pagina de 4-KBytes)
31 12 11 9 8 7 6 5 4 3 2 1 0
PCDD
PPWT
Direccion Base de la Pagina
Base
G AR/
W
U/S
Disponible
Disponible
1
1
PAT
En cuanto a las paginas de 2MB podemos ver como cambia el formato de las entradas
en la siguiente figura:
63 36 35 32
DireccionReservado (en 0)
Entrada Directorio-Pagina (Pagina 2-MBytes)
31 12 11 9 8 7 6 5 4 3 2 1 0
PCDD
PPWT
Dir. Base Pagina
Base
G 1 AReservado (en 0)
21 20 13
R/
W
U/S
63 36 35 32
DireccionReservado (en 0)
Entrada a la Tabla de Punteros al Directorio de Paginas
31 12 11 9 8 5 4 3 2 0
PCD
PWT
DisponibleDireccion Base Directorio de Paginas
Base
Res.Reservado
Disponible
1
1
PAT
110 Paginacion
Capıtulo 7
Proteccion en el acceso a memoria
7.1. Introduccion
La proteccion limita el acceso a memoria y E/S1. Esta proteccion es necesaria para la
implementacion de Sistemas Operativos multitarea y multiusuario. Debe impedir que un
programa (proceso, tarea, thread, etc.) pueda acceder involuntaria o voluntariamente a
los segmentos de codigo, datos o pila de otro, si el programador de la segunda aplicacion
no decidio que ası fuera.
La proteccion permite a las aplicaciones utilizar codigo del Sistema Operativo de forma
controlada. Sirve tambien para localizar problemas de diseno y bugs en las aplicaciones.
La comprobacion (nivel de privilegio, lımites, tipos, puntos de entrada a procedimientos,
conjunto de instrucciones empleado) se realiza de forma paralela a los accesos de memoria
y no afectan al rendimiento. Cualquier violacion de los privilegios produce una excepcion.
Segmentacion de la memoria
La proteccion en la segmentacion se activa en el momento en el que conmutamos
al modo de funcionamiento protegido. Este se activa con CR0.PE = 1 (Protected Enable).
Proporciona 4 niveles de privilegio, de 0..3, de mayor a menor privilegio.
Se puede desactivar parte de la proteccion asignando nivel 0 a todos los selectores
(RPL=0) y descriptores de segmentos (DPL=0). Las comprobaciones de lımite, tipo, etc
no pueden desactivarse.
1La proteccion a E/S se analiza con detalle en el Capıtulo dedicado a las Tareas.
111
112 Proteccion en la segmentacion
Paginacion de la memoria
La proteccion en la paginacion se activa en cuanto activamos la paginacion con CR0.PG = 1.
Existen dos niveles de privilegio: usuario y supervisor. Estos se definen a traves del campo
U/S de las entradas del directorio de paginas y de las tablas de paginas.
Se puede desactivar haciendo CR0.WP = 0 (Write Protection) y en cada entrada de las
tablas de paginas R/W=1 y U/S=1.
7.2. Proteccion en la segmentacion
La proteccion en la segmentacion se consigue mediante 4 niveles de privilegio. El
nucleo del Sistema Operativo deberıa residir en el nivel 0, que es el de maximo privilegio
y proteccion. Los servicios del Sistema deberıan tener un nivel de privilegio inferior (nivel
1 o 2) y las aplicaciones de los usuarios el menor nivel de privilegio (nivel 3). En la figura
se representan en forma de anillos los distintos niveles de proteccion.
Nivel 0
Nivel 1
Nivel 2
Nivel 3
Anillos de proteccion
Nucleo
ServiciosSistema Operativo
Sistema
Operativo
Aplicaciones
Para poder acceder a la memoria es necesario definir los niveles de privilegio a traves
de una serie de campos:
Nivel de privilegio actual (CPL:Current Privilege Level). Se encuentra en CS y SS.
Coincide con el nivel de privilegio del segmento de codigo en ejecucion. Se cambia
al transferir el control a un segmento de codigo con diferente nivel (mas seguro),
excepto con segmentos conformados (accesibles desde cualquier nivel)
Nivel de privilegio del descriptor (DPL:Descriptor Privilege Level). Coincide con el
menor nivel de privilegio con el que puede accederse a un segmento.
Nivel de privilegio solicitado o requerido (RPL:Requested Privilege Level). Es el que
se situa en el registro selector de segmento cuando se pretende acceder a un dato o
se pretende ejecutar una zona de codigo.
Capıtulo 7. Proteccion en el acceso a memoria 113
Existen unas reglas de acceso que emplean estos tres campos. Estas reglas distinguen
el acceso a segmentos de datos del acceso a segmentos de codigo.
7.2.1. Acceso a segmentos de datos
La regla de acceso que debe cumplirse numericamente es:
DPL ≥ max(RPL, CPL)
En la figura tenemos un ejemplo de acceso a segmentos de datos:
El segmento de codigo A puede acceder al segmento de datos E empleando el selector
de segmento E1 ya que se cumple la regla: 2 ≥ max(2, 2).
El segmento de codigo B puede acceder al segmento de datos E empleando el selector
de segmento E2 ya que 2 ≥ max(1, 1).
El segmento de codigo C no puede acceder al segmento de datos E usando el selector
de segmento E3 ya que 2 < max(3, 3).
D no puede acceder a E usando E3 ya que 2 < max(3, 0).
Segmento
Privilegio Minimo
Privilegio Maximo
Datos E
3
2
1
0
CPL=1
CPL=3
CPL=0
DPL=2CPL=2
Sel. Segmento E3RPL=3
Sel. Segmento E1RPL=2
Sel. Segmento E2RPL=1
SegmentoCodigo C
SegmentoCodigo D
SegmentoCodigo A
SegmentoCodigo B
7.2.2. Acceso a segmentos de codigo
El acceso a segmentos de codigo se hace mediante las instrucciones JMP, CALL, RET,
INT n, IRET y todos los mecanismos de excepcion e interrupciones.
En particular, las instrucciones JMP y CALL pueden realizar dos tipos de saltos: directos
o indirectos, dependiendo del tipo de descriptor al que apunten.
114 Proteccion en la segmentacion
Saltos Directos:
• Apunta a un descriptor de segmento de codigo diferente del actual.
Saltos Indirectos:
• Apunta a un descriptor de puerta de llamada (Call Gate), que apuntara a su
vez a un segmento de codigo.
• Apunta a un Segmento de Estado de Tarea (TSS: Task State Segment) que
apunta a un segmento de codigo. Se vera en el Tema de Tareas.
• Apunta a una puerta de tarea (Task Gate) que apunta a un TSS que apunta a
un segmento de codigo. Se vera en el Tema de Tareas.
Llamadas o saltos directos
Solo se comprueba en las llamadas intersegmento (CALL FAR, JMP FAR).
SegmentoCodigo C
Privilegio Minimo
Privilegio Maximo
CPL=3
Segmento CodigoNo Conformado
Segmento Codigo
Conformado
3
2
1
0
CPL=2DPL=2
DPL=1
Sel. Segmento D1RPL=2
Sel Segmento D2RPL=3
Sel. Segmento C2RPL=3
Sel. Segmento C1RPL=2
SegmentoCodigo B
SegmentoCodigo A
SegmentoCodigo D
Se diferencian las reglas de acceso dependiendo de si el segmento de codigo al que se
llama esta conformado o no (Bit C: Conforming del descriptor de segmento de codigo).
Segmentos no conformados. El nivel de privilegio actual, CPL, no cambia por estar
en el mismo nivel.
CPL = DPL, y RPL ≤ CPL
Capıtulo 7. Proteccion en el acceso a memoria 115
• Desde el segmento de codigo A se puede saltar al segmento de codigo C utili-
zando el selector de segmento C1 porque (2 = 2) y (2 ≤ 2)
• Desde el segmento de codigo B no se puede saltar al segmento de codigo C
usando el selector de segmento C2 porque (3 = 2) y (3 ≤ 3)
Segmentos conformados. El nivel de privilegio actual, CPL, no cambia.
CPL ≥ DPL
• Desde el segmento de codigo A se puede saltar al segmento de codigo confor-
mado D usando el selector de segmento D1 ya que (2 ≥ 1)
• Desde el segmento de codigo B se puede saltar al segmento de codigo confor-
mado D utilizando el selector de segmento D2 ya que (3 ≥ 1)
Llamadas o saltos indirectos: puertas de llamada
Facilitan la transferencia de control entre distintos niveles de privilegio. Tambien se
usa para transferir el control entre aplicaciones de 32 y 16 bits. Las puertas de llamada
son descriptores del sistema que pueden residir en la GDT o en la LDT.
31 16 15 1314 12 11 8 7 0
PDesplazamiento en segmento 31:16DPL
Type
0
31 16 15 0
Selector Segmento Desplazamiento en segmento 15:00
Cont.
0011
PDPL
Puerta ValidaNivel de Privilegio del Descriptor
Param.
456
0 0 0
En el formato de la puerta de llamada:
Se especifica el segmento de codigo a saltar mediante un selector de codigo.
Se define el punto de entrada en el segmento de codigo. Esto significa que se ignora
el desplazamiento codificado en la instruccion.
Se especifica el nivel de privilegio del descriptor (DPL) que se usara en las reglas de
acceso.
Se indica el numero de parametros a copiar entre las pilas de diferente nivel de
privilegio cuando se produce un cambio de pila.
116 Proteccion en la segmentacion
Se senala el tamano de los datos que se copian entre pilas. Es to se distingue con el
campo TYPE que define el tipo de puerta de llamada: 16 vs. 32 bits Call Gate.
El modo de acceso se puede observar en la siguiente figura donde usando unicamente
el selector de segmento que apunta al descriptor de la puerta de llamada, se obtienen el
nuevo segmento y el nuevo desplazamiento del punto de entrada.
DesplazamientoSelector Segmento
Puntero lejano a la Puerta de Llamada
Requerido pero no utilizado por el procesador
Puerta-Llamada
Descriptor
DescriptorSegmento-Codigo
Tabla de Descriptores
Desplazamiento
Base
Base
Desplazamiento
Base
Selector Segmento
+
Punto de Entrada al Procedimiento
Las reglas de acceso que se deben cumplir son las siguientes:
CPL ≤ DPLpuerta de llamada; RPL ≤ DPLpuerta de llamada
Ademas si el segmento esta conformado debera cumplirse que DPL ≤ CPL. Si el
segmento no esta conformado entonces la regla es diferente dependiendo de si se produce
el salto con la instruccion CALL (DPL ≤ CPL) o con la instruccion JMP (DPL = CPL).
SegmentoCodigo A
Hay Conmutacion
No Hay Conmutacion
de Pila
Privilegio Mínimo
Privilegio Maximo
3
2
1
0
PuertaLlamada A
PuertaLlamada B
Segmento CodigoNo Conformado
Segmento CodigoConformado
Selector Puerta ARPL=3
Selector Puerta B1RPL=2
Selector Puerta B2RPL=1
CPL=3
CPL=2
CPL=1
DPL=3
DPL=2
DPL=0 DPL=0
Selector Puerta B3RPL=3
SegmentoCodigo B
SegmentoCodigo C
SegmentoCodigo D
SegmentoCodigo E
de Pila
Capıtulo 7. Proteccion en el acceso a memoria 117
Ası a modo de ejemplo:
A la puerta de llamada A se accede desde cualquier nivel por que CPL ≤ 3
A la puerta de llamada B solo se accede desde los niveles 0, 1 y 2.
Las puertas de llamada permiten a un segmento de codigo tener diferentes niveles de
privilegio.
Cuando a traves de una puerta de llamada se accede a un segmento no conformado
de mayor privilegio (DPL < CPL) se produce una conmutacion de pila. Se hace para
dar un grado mas de proteccion ya que se podrıa dar el caso de que se llene la pila o se
meta en ella informacion extra que haga funcionar mal el Sistema.
Hay una pila para cada nivel de privilegio (0..3) dentro de cada tarea. El conjunto
SS:ESP apunta a la pila de nivel 3 cuando estamos en nivel 3. Los punteros para las pilas
de otros niveles estan almacenados en el segmento de estado de tarea (TSS). Son valores
de solo lectura. Cada vez que hay una conmutacion de pila a un nivel superior se utiliza
una nueva pila usando los valores del TSS actual. Todo esto lo define el Sistema Operativo.
Las pilas deben tener el tamano suficiente.
Parametro 1
Parametro 2
Parametro 3
SS Llamante
ESP Llamante
CS Llamante
EIP Llamante
Pila del Procedimiento Llamado
ESP
ESP
Pila del Procedimiento Llamante
Parametro 1
Parametro 2
Parametro 3
El procedimiento que sigue el microprocesador para la conmutacion de pila es el siguiente:
Se usa el DPL del segmento llamado -via puerta de llamada- para leer el nuevo
puntero de pila del TSS actual.
Se comprueba el segmento de pila y los privilegios.
Se salvan los valores viejos de SS:ESP en la nueva pila.
Se copia el numero de parametros especificados en Contador de Parametros de la
pila vieja a la nueva.
118 Proteccion en la paginacion
Se guarda en la pila nueva el puntero de retorno CS:EIP y continua la ejecucion.
Si el acceso a la puerta de llamada se realizo mediante una instruccion CALL entonces
el retorno de la subrutina o procedimiento llamado se hace de la siguiente manera:
Si es una instruccion RET NEAR, solo se comprueban los lımites (que EIP este dentro
del segmento).
Si es una instruccion RET FAR, pero se retorna a un segmento de codigo con el mismo
privilegio, se recupera CS:EIP y se comprueban los privilegios.
Si se trata de una instruccion RET FAR, pero retornando a un segmento con distinto
nivel de privilegio el proceso se describe a continuacion. Solo se puede retornar a un
segmento de menor nivel de privilegio (DPL > CPL).
• Se comprueba el nivel de privilegio de retorno.
• Se cargan CS, EIP y se comprueban.
• Se leen SS:ESP viejos y se comprueban.
• Se ajusta ESP con el numero de bytes indicados (RET n) y se comprueba.
• Se comprueban todos los registros de segmento (si DPL < CPL, excepto si
esta conformado, se borra el registro de segmento: descriptor nulo)
7.3. Proteccion en la paginacion
Cada referencia a memoria se comprueba antes de comenzar el ciclo de lectura/escri-
tura. Si falla el chequeo se produce fallo de pagina.
La proteccion consiste en:
La restriccion del dominio direccionable: usuario/supervisor a traves del campo U/S
de cada entrada de la tabla de paginas.
La comprobacion del tipo de pagina (solo lectura vs. lectura/escritura) es aplicable
en modo usuario. Tambien en modo supervisor si CR0.WP = 1.
Al acceder a una pagina hay dos comprobaciones de proteccion, una a nivel entrada
en el directorio de paginas y otra en la entrada de la tabla de paginas. Siempre vence
supervisor y solo lectura (si usuario).
Si combinamos la proteccion en la segmentacion y en la paginacion, se comprueba
primero en la segmentacion. Si falla se produce una excepcion en el mecanismo de la
Capıtulo 7. Proteccion en el acceso a memoria 119
segmentacion. Una vez corregido el problema por el Sistema Operativo, se comprueba la
proteccion en el mecanismo de la paginacion.
Algunos Sistemas Operativos (Linux) restringen la proteccion del acceso a memoria al
empleo de la paginacion, no siendo por ello menos seguros.
120 Proteccion en la paginacion
Capıtulo 8
Gestion de interrupciones y
excepciones
8.1. Introduccion
Las interrupciones y las excepciones son transferencias de control forzadas por deter-
minados sucesos. Los procedimientos que son ejecutados se llaman subrutinas de atencion
a la interrupcion (ISR:Interrupt Service Routine) o excepcion. Al retornar de la subrutina
(instruccion IRET) se vuelve al programa que se estaba ejecutando. Su ejecucion debe ser
transparente a la ejecucion del programa principal1.
Un ejemplo de interrupcion Imaginen que estan estudiando en su casa. Quiza sea
mucho imaginar. En un momento determinado alguien llama a la puerta: ustedes estan
recibiendo una peticion de interrupcion. Es mas urgente ver quien llama a la puerta que
seguir estudiando. Se levantan del lugar de estudio y abren la puerta de su casa: es el
vecino que, como casi todas las veces, necesita algun ingrediente para cocinar y nos entre-
tiene contandonos alguna historia. Entretanto, alguien llama al telefono: se trata de otra
interrupcion. En este caso tenemos una interrupcion anidada. Le indicamos al vecino que
espere un momento, que llaman al telefono. Atendemos la llamada de telefono: son tus
padres que avisan que vienen. Al colgar el telefono, estamos retornando de interrupcion,
acudimos a la puerta a continuar la conversacion con el vecino. Al irse el vecino retorna-
mos de interrupcion y regresamos de nuevo a la mesa de estudio, quizas con mas ganas
de estudiar que antes, o definitivamente sin ninguna gana despues del pequeno jaleo que
se ha montado en un momento en casa.
1Esto significa que las ISRs deberan guardar en la pila todos aquellos registros que se vayan a utilizar,
al principio de la rutina, y recuperarlos antes de retornar.
121
122 Introduccion
8.1.1. Clasificacion
La Arquitectura Intel implementa interrupciones vectorizadas, lo que significa que
existe una tabla que contiene las direcciones de salto que se deben leer cuando se produce
una interrupcion o excepcion determinada. La mejor manera de empezar a hablar de las
interrupciones y excepciones es clasificarlas:
Interrupciones
Basicamente hablamos de interrupciones cuando es algo externo al microprocesador
el causante de la misma. Estas pueden ser:
Externas. Las produce algun dispositivo periferico conectado al microprocesador a
traves de las patillas de interrupciones del mismo.
• Patilla /NMI (Non Maskable Interrupt). Interrupcion no enmascarable. Se
activa por flanco y se memoriza un nivel de peticiones. Su atencion se realiza
mediante el vector no 2.
• Patilla /INTR. Interrupcion enmascarable con EFLAGS.IF = 0. Es activa por
nivel. Vector entre 0 y 255. Ver gestion de interrupciones mas adelante.
Internas. Generadas por software por medio de la instruccion INT n.
Excepciones
Las excepciones son situaciones provocadas por el propio funcionamiento del micro-
procesador.
Hardware.
• Faults. Se producen antes de ejecutar la instruccion. CS:EIP se guarda en la
pila y apunta a la direccion que produjo el fallo. Se reintentan al retornar de
la excepcion.
• Traps. Se producen despues de la ejecucion de la instruccion. CS:EIP apunta
a la instruccion siguiente. Algunos traps permiten continuar la ejecucion del
programa, otros no.
• Aborts. Cuando hay errores graves (errores hardware, valores ilegales o no
consistentes en las tablas). No se puede continuar la ejecucion del programa.
No siempre se puede precisar la localizacion exacta.
Software. Excepciones como: INTO, INT3, BOUND, INT n.
Capıtulo 8. Gestion de interrupciones y excepciones 123
8.1.2. Vectores de interrupcion y excepcion
Distinguen el tipo de interrupcion o excepcion producida. El vector es colocado en el
bus de datos cuando se trata de una interrupcion externa (/INTR) para que el micropro-
cesador la reconozca. Hay 32 vectores preasignados/reservados. Los vectores del 32 al 255
pueden ser empleados por el usuario.
Vector Descripcion Tipo Codigo Fuente
No Error
0 #DE Error en division Fault No Instrucciones DIV e IDIV
1 #DB Depuracion Fault No Referencias a codigo o datos o INT 1.
/Trap
2 - Interrupcion NMI Interrupt No Interrupcion externa no enmascarable.
3 #BP Breakpoint Trap No Instruccion INT 3.
4 #OF Desbordamiento Trap No Instruccion INTO.
5 #BR Rango BOUND excedido Fault No Instruccion BOUND.
6 #UD Codigo invalido Fault No Instruccion UD2 o codigo invalido.
7 #NM No hay coprocesador Fault No Instruccion FPU.
8 #DF Doble Fallo Abort Si Cuando hay una excepcion dentro
(Cero) de una excepcion
9 Acceso de la FPU fuera Fault No Instruccion FPU.
del segmento
10 #TS TSS no valido Fault Si Acceso a TSS o conmutacion de tarea.
11 #NP Segmento no presente Fault Si Acceso a registros de segmento.
12 #SS Fallo en segmento de pila Fault Si Operaciones con la pila o SS.
13 #GP Fallo de proteccion general Fault Si Cualquier referencia a memoria.
14 #PF Fallo de pagina Fault Si Cualquier referencia a memoria.
15 - (Reservada) No
16 #MF Fallo de la FPU Fault No Instruccion matematica FPU.
17 #AC Chequeo de alineamiento Fault Si Cualquier referencia a memoria.
(Cero)
18 #MC Chequeo de maquina Abort No Dependiente del modelo.
19 #XF Excepcion FPU instr. SIMD Fault No Instrucciones SSE y SSE2.
20-31 - Reservado
32- 255 - Para el usuario Interrupt Instruccion INT n o interrupcion externa
8.1.3. Prioridades
Cuando se produce mas de una condicion de interrupcion y/o excepcion hay un orden
establecido de prioridades para ser atendidas. En la tabla siguiente se describen de mayor
a menor las prioridades. En el caso de que dos interrupciones tengan la misma prioridad,
el orden de atencion vendra determinado por el modelo de microprocesador.
124 Gestion en modo real
Prioridad Descripciones
1 (Mayor) Reset Hardware y Chequeos de la Maquina
- RESET
- Chequeo de la Maquina
2 Excepcion al Conmutar de Tarea
- Bit TSS.T = 1
3 Hardware Externo
- FLUSH
- STOPCLK
- SMI
- INIT
4 Excepciones en la Instruccion Previa
- Breakpoints
- Excepciones de Depuracion (EFLAGS.TF=1 o breakpoint de datos o E/S)
5 Interrupciones Externas
- Interrupcion NMI
- Interrupciones Enmascarables
6 Fallos en la Busqueda de la Siguiente Instruccion
- Breakpoint de Codigo
- Violacion del Limite en Segmento de Codigo
- Fallo de Pagina de Codigo
7 Fallos al Decodificar la Siguiente instruccion
- Longitud de Instruccion > 15 bytes
- Codigo de Operacion Ilegal
- Coprocessor No Disponible
8 (Menor) Fallos al Ejecutar la Instruccion
- Desbordamiento
- Error en Bound
- TSS No Valido
- Segmento No Presente
- Fallo de Pila
- Fallo de Proteccion General
- Fallo de Pagina de Datos
- Chequeo de Alineamiento
- Excepcion FPU
- Excepcion SIMD FPU
8.2. Gestion en modo real
8.2.1. Tabla de Vectores de Interrupcion
En modo real se habla de una tabla de vectores de interrupcion. Esta tabla esta situada
en la direccion 0000:0000 de la memoria. En modo real las direcciones fısicas y lineales
coinciden. La tabla tendra 256 entradas y cada entrada ocupara 4 bytes. Esto hace que
se necesite 1KB para almacenar la tabla.
8.2.2. Funcionamiento
El funcionamiento varıa ligeramente dependiendo del tipo de interrupcion o excepcion.
Capıtulo 8. Gestion de interrupciones y excepciones 125
Interrupciones vectorizadas enmascarables.
Los pasos que se siguen son:
1. Se activa la patilla /INTR.
2. Si EFLAGS.IF = 1 se atiende, si no se ignora.
3. Se termina de ejecutar la instruccion en curso, excepto si la instruccion lleva el
prefijo de repeticion REP, en cuyo caso se interrumpe la repeticion.
4. Se guardan en la pila IP, CS y FLAGS.
5. Se lee del bus de datos (pines D0..D7) del microprocesador un vector de interrup-
ciones de 8 bits que coloca el dispositivo periferico. Lo llamo VECTOR.
6. Se direcciona con 0000:VECTOR*4 la tabla de vectores de interrupcion que se encuentra
en el primer KB de la memoria.
7. Se cargan IP = [0000:VECTOR*4] y CS = [0000:VECTOR*4+2].
8. Se pone EFLAGS.IF = 0 automaticamente para evitar el anidamiento2 de interrupcio-
nes y EFLAGS.TF = 0.
9. Se salta a CS:IP y se ejecuta la subrutina de servicio a la interrupcion (ISR).
10. Cuando en la ISR se ejecuta la instruccion IRET de retorno de interrupcion se recupe-
ran de la pila FLAGS, CS e IP y se continua la ejecucion del programa interrumpido.
El servicio de atencion a las interrupcion no debe modificar ningun registro. Los re-
gistros que se usen se deben guardar en la pila al entrar en la subrutina y recuperar justo
antes de salir.
Interrupcion /NMI
Igual pero no hay enmascaramiento posible y siempre se usa el vector de interrupcion
2 (no se lee del bus de datos).
2Si se quieren anidar las interrupciones, es posible hacerlo poniendo ese bit a uno al entrar en la rutina
de servicio de la interrupcion.
126 Gestion en modo real
8.2.3. Ejemplo
Listado 8.1: Ejemplo de uso de las interrupciones.[BITS 16]
[SEGMENT CODIGO] ; ------------------------------------------..start:
5 ; Inicio vector de interrupciones no 100cli ; Desactivo las interrupciones
mov ax,CODIGOmov [0:100*4+2] , ax ; Vector de interrupciones 100
10 ; Primero el segmentomov ax,ISRmov [0:100*4] , ax ; Segundo el desplazamieto
sti ; Activo las interrupciones15
; Devuelvo el control al sistema operativo; dejando el programa residente
mov dx,FIN_TSR ; Terminate and Stay Resident20 ; Solo en MSDOS
int 27h ; Continua el S.O. dejando el; programa en memoria
; Servicio de interrupcion ----------------------------------25 ISR: pushad ; Guardo los registros a usar
; Cuidado con los registros; de segmento , pushad no los; guarda
push ds
30 mov ax, DATOSmov ds,ax
fsave [ds:COPRO] ; Guardo el estado de la FPUfinit ; y la inicio. Si se usa
35
; .... Aqui lo que tenga que ser ......
frstor [ds:COPRO] ; Recupero el estado de la FPU; Cuidado con los registros de
40 ; segmentopop ds
popad ; Recupero los registros
iret ; Retorno de interrupcion45
[SEGMENT DATOS] ; -------------------------------------------COPRO RESW 54 ; Total 108 bytesFIN_TSR
50 [SEGMENT PILA STACK] ; --------------------------------------RESW 512
Capıtulo 8. Gestion de interrupciones y excepciones 127
8.3. Gestion en modo protegido
8.3.1. Tabla de Descriptores de Interrupcion: IDT
En modo protegido la Tabla de Vectores de Interrupcion pasa a llamarse Tabla de
Descriptores de Interrupcion.
La IDT puede estar situada en cualquier lugar de la memoria segun lo indique el regis-
tro IDTR. Este registro se modifica con las instrucciones LIDT (lectura) y SIDT (escritura),
siempre que se tenga un nivel de privilegio CPL=0.
Limite IDTDireccion Base IDT
+Tabla de Descriptoresde Interrupcion (IDT)
Puerta para
0
Registro IDTR
Interrupcion #n
Puerta paraInterrupcion #3
Puerta paraInterrupcion #2
Puerta paraInterrupcion #1
151647
031
0
8
16
(n−1)∗ 8
El tamano de la IDT se define tambien con el registro IDTR pero su tamano maximo
sera de 2KB en el caso de completar las entradas para los 256 vectores de interrupciones
posibles. Cada entrada sera un descriptor del sistema y ocupara 8 bytes.
Descriptores de IDT
La IDT solo puede contener los siguientes tipos de descriptores:
Descriptor de puerta de interrupcion (Interrupt Gate).
31 16 15 1314 12 8 7 0
PDesplazamiento 31..16D
PL
0 4
31 16 15 0
Selector de Segmento Desplazamiento 15..0 0
011D
Puerta de Interrupciones
45
0 0 0
Descriptor de puerta de excepcion (Trap Gate).
128 Gestion en modo protegido
31 16 15 1314 12 8 7 0
PDesplazamiento 31..16D
PL
0 4
31 16 15 0
Selector de Segmento Desplazamiento 15..0 0
111D
Puerta de Excepcion
45
0 0 0
Descriptor de puerta de tarea (Task Gate), que se analizara en el Capıtulo siguiente.
31 16 15 1314 12 8 7 0
PD
PL
0 4
31 16 15 0
Selector de Segmento TSS 0
1010
Puerta de Tarea
8.3.2. Funcionamiento
Los pasos que se siguen son:
1. Se activa la patilla /INTR.
2. Si EFLAGS.IF = 1 se atiende, si no se ignora.
3. Se termina de ejecutar la instruccion en curso, excepto si la instruccion lleva el
prefijo de repeticion REP, en cuyo caso se interrumpe la repeticion.
4. Se salvan en la pila los registros EIP, CS y EFLAGS de la tarea actual. Dependiendo
del nivel de privilegio con que se pretenda acceder a la subrutina de tratamiento de
interrupciones se usara la pila actual
Codigo Error
EFLAGS
CS
EIP
ESP Despues delSalto a la Subrutina
Uso de la Pila cuando no hayCambio de Nivel de Privilegio
Pila de la Subrutina y del Procedimiento Interrumpido
Salto a la SubrutinaESP Antes del
Capıtulo 8. Gestion de interrupciones y excepciones 129
O se conmutara a una pila de nivel superior, en cuyo caso se guardaran tambien los
registros SS y ESP.
CS
Codigo Error
ESP Antes delSalto a la Subrutina
EFLAGS
EIP
SS
ESP
Uso de la Pila cuando hayCambio de Nivel de Privilegio
Pila del Procedimiento Pila de la Subrutina
ESP Despues delSalto a la Subrutina
Interrumpido
5. Se lee del bus de datos (pines D0..D7) del microprocesador un vector de interrup-
ciones de 8 bits que coloca el dispositivo periferico. Lo llamo VECTOR.
6. Se direcciona la IDT segun se ve en la figura:
IDT
Puerta de Interrupcion
Destino
Selector de Segmento
GDT o LDT
Descriptor de
Vector de
Interrupciones
DireccionBase
Segmento de Codigo
InterrupcionSubrutina de
+
Segmento
o Excepcion
Desplazamiento
7. Se pone EFLAGS.IF = 0 automaticamente si se trata de una interrupcion.
130 Gestion en modo protegido
8. Se ponen EFLAGS.TF = 0, EFLAGS.VM = 0, EFLAGS.RF = 0 y EFLAGS.NT = 0.
9. Se salta a la subrutina de servicio a la interrupcion (ISR).
10. Cuando en la ISR se ejecuta la instruccion IRET de retorno de interrupcion se recu-
peran de la pila los registros que se guardaron no sin antes comprobar los privilegios
(como si se tratara de una instruccion CALL), etc. y se continua la ejecucion del
programa interrumpido.
Cuando una excepcion esta relacionada con un segmento especıfico, automaticamente
se introduce en la pila un codigo de error cuyo formato es:
31 0
ReservadoIDT
TI
123
Indice Selector de SegmentoEXT
ındice del selector de segmento. Pues eso.
EXT: External event. Indica si fue un evento externo el que produjo la excepcion.
IDT: Descriptor location. Indicara que es un descriptor de la IDT cuando valga
uno. En caso contrario el descriptor estara en la GDT o en la LDT.
TI: Table index. Distinguira la localizacion del descriptor en el caso de que el bit
anterior valga cero. Estara en la GDT con un valor cero, de lo contrario estara en
la LDT.
El tamano del codigo de error sera word o dword dependiendo del tamano de la puerta
(16 o 32 bits). Este codigo se introduce en la pila, pero no se recupera con IRET (se ignora).
Con la excepcion de fallo de pagina tiene un formato diferente [5].
8.3.3. Habilitacion y deshabilitacion
Manejo de NMI multiples
Mientras se atiende una NMI el procesador deshabilita las llamadas anidadas de NMIs
hasta ejecutar IRET, aunque memoriza una peticion de NMI.
Deshabilitacion de las interrupciones enmascarables
Si EFLAGS.IF = 0 se inhiben las interrupciones externas debidas a la patilla /INTR.
Esto se hace mediante la instruccion CLI (STI pone a uno este bit). Estas instrucciones
se pueden ejecutar si tenemos un nivel de privilegio suficiente: CPL<=EFLAGS.IOPL. Sino se
produce una excepcion de Fallo de Proteccion General. Tambien se pueden cambiar con
las instrucciones POPF e IRET, pero existe la misma proteccion.
Capıtulo 8. Gestion de interrupciones y excepciones 131
Desactivacion de las excepciones de depuracion
Si EFLAGS.RF = 1 no se produce una excepcion de depuracion tras la ejecucion de una
condicion de breakpoint de instrucciones. El procesador pone EFLAGS.RF = 0 despues de
cada instruccion excepto con las instrucciones que provocan un cambio de tarea.
Desactivacion de excepciones e interrupciones cuando cambiamos de pila
Cuando modificamos SS, el micro inhibe las interrupciones y excepciones hasta despues
de la ejecucion de la siguiente instruccion (tıpicamente MOV ESP,... ) para evitar guardar
datos en una pila inconsistente.
132 Gestion en modo protegido
Capıtulo 9
Gestion de tareas
9.1. Introduccion
Una tarea es una porcion del trabajo que realiza el procesador. Puede ser un programa,
un proceso, una rutina, un hilo de ejecucion (thread), etc. El objetivo es conseguir un
Sistema Operativo multitarea, es decir, que la ejecucion de una tarea no afecte o pueda
afectar al funcionamiento de otras tareas.
Es evidente que si el computador solo dispone de un microprocesador entonces las
tareas no se ejecutan simultaneamente. Sin embargo, parece que se ejecutan ası. Esto lo
consigue el Sistema Operativo mediante un proceso planificador (scheduler) de la ejecucion
de las diferentes tareas, permitiendo, que se ejecuten las tareas secuencialmente durante
un quanto de tiempo determinado (que dependera de la prioridad de las mismas).
9.2. Estructuras de datos de una Tarea
La Arquitectura Intel facilita el diseno de Sistemas Operativos multitarea mediante la
gestion hardware de tareas. Las tareas se componen de:
1. Espacio de ejecucion de la Tarea.
Que define los segmentos relacionados con una tarea concreta1.
Segmento de codigo actual.
Segmentos de pila, uno por cada nivel de proteccion (en total 4).
Segmento de datos actual.
2. El segmento de estado de tarea (TSS:Task State Segment).
1Hace referencia a los segmentos actuales de la tarea que viene siendo ejecutada. Una tarea podrıahacer uso de diferentes segmentos de codigo y datos.
133
134 Estructuras de datos de una Tarea
Esta estructura especifıca el espacio de ejecucion actual de la tarea. Ademas permite
enlazar las tareas dentro de un Sistema Operativo.
De esta manera el registro de tarea TR apuntara a la tarea actual a traves de su
segmento de estado de tarea como podemos observar en la figura:
Segmentode Codigo
Segmentode PilaNivel de Priv.
Segmentode Datos
Seg. PilaPriv. Nivel 0
Segmento deEstado de Tarea
(TSS)
Registro de Tarea
CR3
Actual
Seg. PilaPriv. Nivel 1
Seg. PilaPriv. Nivel 2
Registro de Tarea
En realidad el registro de tarea TR apunta a un descriptor de un TSS. Ese descriptor
estara en la GDT. El siguiente grafico nos ayudara a clarificar estas relaciones.
Segmento LimiteSelector
+
GDT
Descriptor TSS
0
Direccion BaseR e g i s t r o
Parte InvisibleParte Visible
TSS
de Tarea
Capıtulo 9. Gestion de tareas 135
Descriptor del Segmento de Estado de Tarea
El formato del descriptor se muestra a continuacion, pero basicamente define el seg-
mento TSS y sus propiedades de acceso.
31 24 23 22 21 20 19 16 15 1314 12 11 8 7 0
PBase 31:24 GDPL
Type
0
0
31 16 15 0
Direccion Base 15:00 Segmento Limite 15:00
Base 23:16AVL
Limite19:16
0
1B01
Descriptor de Segmento de Estado de Tarea (TSS)
0
4
El bit B del descriptor nos indicara si esta ocupado o no esta ocupado el segmento de
estado de tarea al que se accede.
Segmento de Estado de Tarea (TSS)
El TSS almacena el estado (contexto) de las tareas. Tiene campos dinamicos, que son
actualizados cuando se cambia de tarea y campos estaticos que se definen al comenzar
una nueva tarea pero que no se modifican dinamicamente.
1. Campos dinamicos
Registros de proposito general.
Registros selectores de segmentos.
Registro EFLAGS.
Puntero de instruccion EIP.
Enlace a la tarea previa que no es otra cosa que el selector de segmento del
TSS anterior. Se actualiza solo cuando se espera retornar de una tarea (llamada
mediante la instruccion CALL, una interrupcion o una excepcion).
136 Estructuras de datos de una Tarea
031
100
96
92
88
84
80
76
Direccion Base Mapa de Bits E/S
15
Selector Segmento LDT
GS
FS
DS
SS
CS
72
68
64
60
56
52
48
44
40
36
32
28
24
20
SS2
16
12
8
4
0
SS1
SS0
ESP0
Enlace a Tarea Anterior
ESP1
ESP2
CR3 (PDBR)
T
ES
EDI
ESI
EBP
ESP
EBX
EDX
ECX
EAX
EFLAGS
EIP
Bits Reservados. Poner a 0
2. Campos estaticos.
Selector que apunta al descriptor de la LDT empleada. Se permite a cada tarea
tener su propia tabla de descriptores local.
CR3. Direccion fısica del directorio de paginas. Igualmente se permite a cada
tarea tener su propio directorio de paginas.
Punteros de pila (y selectores de segmento) de nivel 0, 1 y 2.
Bit T. Cuando vale uno provoca una excepcion de depuracion cuando se cambia
de tarea.
Direccion base del mapa de acceso de entrada/salida.
Es un desplazamiento de 16 bits (<DFFFh) que apunta al mapa de permisos de
entrada salida, que esta contenido en el propio TSS. Sirve para limitar el acceso
a E/S. El tamano es variable. Es un acceso limitado a E/S para las tareas con
grano fino ya que podemos definir a que puertos se accede y a cuales no.
Capıtulo 9. Gestion de tareas 137
Direccion Base del Mapa de E/S
Segmento de Estado de Tarea (TSS)
64H
31 24 23 0
1 1111111
Mapa de Bits de Permisos de E/S
0
El ultimo byte delmapa de bits debetener todos losbits a uno
Si CPL>EFLAGS.IOPL se comprueba el mapa de permisos de E/S para ver si pode-
mos acceder, si no el acceso esta permitido. Cada bit del mapa se corresponde
con el permiso de acceso a un puerto (byte).
; Ejemplo:; el bit 1 del sexto byte:; indica el puerto 41 = (6 -1)*8 + 1; si vale 1 esta prohibido el acceso; si vale 0 esta permitido el acceso
Si todos los bits del puerto accedido valen 0 podemos acceder (si es de tamano
dword se representara con 4 bits), sino se producira una excepcion de protec-
cion general. Las direcciones E/S no representadas se consideran a 1, es decir
prohibidas.
Cuestion
En una aplicacion funcionando en modo protegido, tenemos un segmento de estado de tarea (TSS)
cuyo campo direccion base del mapa de E/S apunta a los siguientes datos colocados en posiciones de
memoria crecientes:
MapaES db 01101100b, 11111111b, 00000000b, 00000000b, 11111111bdb 01010101b, 10101010b, 01010100b, 10100101b, 11111111b
El flag EFLAGS.IOPL=3 y nuestro CPL=2, ¿se puede acceder a la direccion de E/S, 23 en tamano byte?
¿Porque? ¿Y a la 33 en tamano dword?¿Por que?
Y si EFLAGS.IOPL=1 y nuestro CPL=2, ¿se puede acceder a la direccion de E/S, 23 en tamano byte?
¿Porque? ¿Y a la 33 en tamano dword?¿Por que?
Solucion
En el caso de que EFLAGS.IOPL=3, se tiene acceso a la E/S desde cualquier nivel de privilegio
(CPL<=EFLAGS.IOPL), luego se podra acceder tanto a la direccion de E/S 23 en tamano byte como la
33 en tamano dword.
138 Funcionamiento
En el segundo caso no se cumple que CPL<=EFLAGS.IOPL, luego se debe consultar la tabla de permisos
de E/S.
Bit 23 * Bit 36,35,34,33 ****MapaES db 01101100b, 11111111b, 00000000b, 00000000b, 11111111b
db 01010101b, 10101010b, 01010100b, 10100101b, 11111111b
El bit 23 vale 0 con lo que sı se permite el acceso en tamano byte a ese puerto. Los bits 33-36 valen
1 con lo que estara prohibido el acceso al puerto 33 en tamano dword.
Descriptor de Puerta de Tarea
Este es un descriptor especial del sistema que proporciona una forma indirecta y
protegida de acceso a una tarea. Puede residir en la GDT, LDT o IDT. El formato del
mismo se muestra a continuacion:
31 16 15 1314 12 11 8 7 0
PDPL
Type
0
31 16 15 0
Selector Segmento TSS
1010
DPLPTYPE
Nivel de Privilegio del DescriptorSegmento PresenteTipo de Descriptor
Reservado
4
0
Se puede ver que basicamente proporciona el selector del segmento de estado de tarea
al que se va a saltar. Proporciona un nivel extra de proteccion y una manera de producir
un cambio de tarea mediante el uso de las interrupciones y excepciones.
9.3. Funcionamiento
La llamada a tareas no es recursiva. Normalmente se conmuta de tarea, lo que
significa que se guarda el estado de la tarea anterior antes de comenzar con la siguiente.
Se conmuta de tarea cuando:
Se ejecuta JMP o CALL dirigido a un TSS en la GDT.
Se ejecuta JMP o CALL dirigido a una puerta de Tarea (en GDT o LDT).
Un vector de interrupcion o excepcion apunta a una puerta de tarea (en IDT).
Se ejecuta IRET y EFLAGS.NT=1 (Nested Task: tarea anidada).
Capıtulo 9. Gestion de tareas 139
Los pasos que se realizan son:
1. Se comprueba si la tarea actual puede conmutar de tarea
CPL≤TSS.DPL y RPL≤TSS.DPL, en los casos de llamadas JMP o CALL con un selector
de TSS.
CPL≤TaskGate.DPL y RPL≤TaskGate.DPL, en los casos de llamadas JMP o CALL con
un selector que apunte a una puerta de tarea.
En los otros dos casos siempre se produce la conmutacion.
2. Se comprueba si el nuevo TSS esta presente y tiene un lımite valido (≥67h).
3. Se comprueba que el nuevo TSS, el viejo TSS y todos los descriptores de segmentos
empleados en la conmutacion (viejos y nuevos) estan paginados en memoria.
4. Se salva el estado de la tarea actual (viejo TSS).
5. Se carga TR con el selector del nuevo TSS, se marca como ocupado y se senaliza la
conmutacion con CR0.TS = 1 (Task Switched).
6. Se carga el nuevo estado de tarea del nuevo TSS y se continua la ejecucion.
El viejo TSS se marca como disponible solo si no hay anidamiento de tareas. Si lo hay,
queda ocupado y se marca EFLAGS.NT = 1. Habra anidamiento de tarea si empleamos CALL,
interrupcion o excepcion. En la siguiente figura se muestra un ejemplo:
Tarea deNivel Superior
NT=0
Enlace a
TSS
TareaAnidada
NT=1
TSS
Tarea anidadaMas Profunda
NT=1
TSS
Tarea ejecutandoseactualmente
NT=1
EFLAGS
Registro de Tarea
Tarea PreviaEnlace aTarea Previa
Enlace aTarea Previa
En la tabla siguiente se muestra el estado de algunos de los campos utilizados al con-
mutar de tarea de diferentes maneras:
140 Funcionamiento
Campo o bit Instruccion JMP Instruccion CALL Instruccion IRETBit B tarea nueva B=1 B=1 No cambia (estaba a 1)
Deberıa estar a 0 Deberıa estar a 0 Deberıa estar a 1Bit B tarea vieja B=0 No cambia B=0
Deberıa estar a 1Bit NT tarea nueva No cambia NT=1 NT=TSS-Nueva.NTBit NT tarea vieja No cambia No cambia NT=0Enlace (tarea nueva) No cambia Enlace = Selector TSS-Vieja No cambiaEnlace (tarea vieja) No cambia No cambia No cambiaCR0.TS 1 1 1
Capıtulo 10
Estado inicial y gestion delprocesador
10.1. Estado inicial del microprocesador
10.1.1. Introduccion
Analizamos lo que ocurre cuando el microprocesador es alimentado electricamente o
cuando se activa alguna de las patillas que provocan un reinicio del mismo.
La patilla RESET# realiza un reset hardware o reinicio del microprocesador. Este
reinicio consiste en:
1. Opcionalmente, dependiendo de como este conectado el microprocesador, se realiza
un test interno (BIST:Built-In Self Test1) del mismo que dara como resultado que
el registro EAX = 0 si todo fue bien.
2. Se inician los registros con un estado conocido y situa al procesador en modo de
funcionamiento real.
3. Se invalidan las memorias caches, TLBs, BTB (Branch Target Buffer: bufer para la
prediccion de saltos).
4. Se ejecuta la inicializacion multiprocesador a traves del bus APIC (no lo vemos).
5. Comienza la ejecucion software.
6. La FPU se inicializa con un estado conocido.
La patilla INIT# del microprocesador tiene una respuesta similar a la patilla RE-
SET#, solo que las memorias cache internas, MSRs y FPU permanecen sin cambios.
Al arrancar el registro EDX contiene la identificacion del microprocesador segun se ve
en la siguiente figura:
1Viene a durar unos 5 millones de ciclos de reloj.
141
142 Estado inicial del microprocesador
31 12 11 8 7 4 3 0
EDX
Familia (1111B para la Familia del Pentium 4)
Modelo (Comenzando con 0000B)
1314
Tipo de Procesador
ModeloFamiliaVersion
ID
15
ModeloFamilia
1619202324
La primera instruccion software ejecutada esta en la direccion fısica FFFFFFF0h. En
esta direccion debera accederse a una memoria, habitualmente, de solo lectura (ROM,
EPROM, etc.).
Esta direccion se encuentra fuera del primer MB direccionable en el modo de funcio-
namiento real (modo en el que arranca). Esto lo soluciona el procesador almacenando en
CS=F000h y su Base=FFFF0000h, algo que no es coherente (EIP=FFF0h).
Una vez que se terminen las inicializaciones y comprobaciones de la ROM se hace un
salto FAR para que vuelva a ser coherente CS con su Base (parte oculta del registro).
Sera necesario en la inicializacion software crear la IDT para manejar las interrupciones
y las excepciones. Por defecto la IDT, que en modo real se denomina Tabla de Vectores de
Interrupcion, se encuentra en la direccion fısica 0. En modo protegido se puede cambiar
su localizacion. La rutina de tratamiento de NMIs (Non Maskable Interrupts) debe estar
desde el principio (en la memoria de solo lectura).
Despues se tendra que cargar el Sistema Operativo a traves del BIOS (Basic Input
Output System), que no es otra cosa que el software que se incluye en la memoria de solo
lectura.
10.1.2. Estado inicial de los registros
Los valores que mostramos a continuacion son validos para los microprocesadores
Pentium 4 y Xeon. Para otros modelos mas antiguos o nuevos debera consultarse el
manual del microprocesador.
Registros de proposito general
EFLAGS 00000002HEIP 0000 FFF0HCR0 60000010HCR2 , CR3 , CR4 00000000HCS Selector = F000H
Base = FFFF0000HLimite = FFFFHAR = Present , R/W, Accessed
SS, DS, ES, FS , GS Selector = 0000HBase = 00000000HLimit = FFFFHAR = Present , R/W, Accessed
Capıtulo 10. Estado inicial y gestion del procesador 143
EDX 00000 FxxHEAX 0EBX , ECX , ESI , EDI , EBP ,ESP 00000000H
Registros del sistema
Sus valores iniciales son los siguientes:
GDTR , IDTR Base = 00000000HLimit = FFFFHAR = Present , R/W
LDTR , Task Register Selector = 0000HBase = 00000000HLimit = FFFFHAR = Present , R/W
Registros de depuracion
Estos contienen los siguientes valores:
DR0 , DR1 , DR2 , DR3 00000000HDR6 FFFF0FF0HDR7 00000400H
Registros de la FPU
El software puede determinar la presencia de la FPU mediante la instruccion CPUID
y activar los flags de CR0 que senalizan la presencia de esta. El reset hardware inicializa
los registros de la FPU de forma diferente que FINIT. Si vamos a usar la FPU hay que
ejecutar primeramente FINIT.
ST0..ST7 Arranque o Reset: +0.0FINIT/FNINIT: Sin cambios
x87 FPU Control Word Arranque o Reset: 0040HFINIT/FNINIT: 037FH
x87 FPU Status Word Arranque o Reset: 0000HFINIT/FNINIT: 0000H
x87 FPU Tag Word Arranque o Reset: 5555HFINIT/FNINIT: FFFFH
x87 FPU Data Operand Arranque o Reset: 0000Hand CS Seg. Selectors FINIT/FNINIT: 0000H
x87 FPU Data Operand and Arranque o Reset: 00000000HInst. Pointers FINIT/FNINIT: 00000000H
MM0..MM7 Arranque o Reset: 0000000000000000HINIT or FINIT/FNINIT: Sin cambios
Registros SIMD
Su valor inicial es el mostrado a continuacion:
XMM0..XMM7 Arranque o Reset: 0H (128 bits)INIT: No cambian
MXCSR Arranque o Reset: 1F80HINIT: No cambian
144 Gestion del microprocesador
Registros especıficos del modelo: MSRs
Algunos se inicializan y otros necesitan se inicializados por software.
Time -Stamp Counter Arranque o Reset: 0HINIT: No cambian
Contadores de rendimiento Arranque o Reset: 0Hy de seleccion de eventos INIT: No cambian
Resto de MSRs Arranque o Reset: No definidosINIT: No cambian
Memorias cache
Despues de un reset hardware estan habilitadas las caches L1 y L2 (CR0.CD=0) y todas
las lıneas son invalidas. Habrıa que configurar el funcionamiento de la cache al arrancar
(CR0.NW y PCD y PWT en la paginacion). Los MTRRs (Memory Type Range Registers) pre-
sentes a partir del Pentium Pro controlan la cache de regiones de memoria especıficas.
Habrıa que indicarlos.
Data and Code Cache , TLBsInvalid Fixed MTRRs Arranque o Reset: Desactivados
INIT: No cambianVariable MTRRs Arranque o Reset: Desactivados
INIT: No cambianMachine -Check Architecture Arranque o Reset: No definidos
INIT: No cambianAPIC Arranque o Reset: Activados
INIT: No cambian
10.2. Gestion del microprocesador
10.2.1. Conmutacion a modo de funcionamiento protegido
Antes de conmutar a modo protegido es preciso que un numero mınimo de estructuras
se encuentren en memoria:
Una nueva Tabla de Descriptores de Interrupcion, IDT, de modo protegido (2KB).
La Tabla de Descriptores Globales: GDT.
Opcionalmente, un Segmento de Estado de Tarea: TSS.
Una Tabla de Descriptores Local: LDT (opcional).
Si queremos paginacion, al menos un directorio de paginas y una tabla de paginas.
Un segmento de codigo de modo protegido.
Capıtulo 10. Estado inicial y gestion del procesador 145
Uno o mas segmentos de codigo que atiendan las interrupciones y las excepciones.
A continuacion el programa que conmute a modo protegido debera seguir los siguientes
pasos:
1. Desactivar las interrupciones. Se debe asegurar el software que no se van a producir
NMIs durante la conmutacion.
2. Cargar GDTR con la direccion base de la GDT.
3. Poner CR0.PE = 1 y opcionalmente CR0.PG = 1 si se quiere activar la paginacion.
4. Inmediatamente ejecutar una instruccion de salto lejano, tıpicamente un JMP FAR a
la instruccion siguiente, para vaciar la cola de instrucciones y que las instrucciones
siguientes se decodifiquen correctamente en modo protegido2 y se actualice CS. El
codigo de los pasos 3o y 4o debe estar contenido en una pagina en la que la direccion
lineal coincida con la fısica si hemos activado la paginacion.
5. Si vamos a usar una LDT, cargar LDTR.
6. Para actualizar el resto de los registros de segmento deben recargarse sus valores
o se debe conmutar a una tarea.
7. Si no hemos cambiado de tarea inicializamos la tarea con la instruccion LTR.
8. Actualizamos IDTR con la nueva tabla IDT.
9. Activamos las interrupciones.
10.2.2. Ejemplo
Este programa ejemplo de conmutacion a modo protegido esta incompleto. Se muestra
a modo de ejemplo de como se debe hacer la conmutacion:
Listado 10.1: Protegido.asm; Autor: Jesus M. Hernandez Mangas; Fecha: Enero 2004; Ensamblador: NASM
5 ; Ejemplo de conmutacion a modo protegido.[BITS 16]
[SEGMENT CODIGO]
10 ..start:
2Las instrucciones tienen diferentes codigos de operacion en modo real y en modo protegido.
146 Gestion del microprocesador
cli
mov ax,DATOSmov ds,ax
15
; Preparo puntero para LGDTmov ebx , GDTmov dword [gdt_ptr],ebx ; Basemov word [gdt_ptr +4] ,5*8 ; Lımite (5 descriptores)
20
; Ejecuto LGDT de 32 bitsa32 lgdt [gdt_ptr]
; Entro en modo protegido25 mov ebx ,cr0
or ebx ,1mov cr0 ,ebx
; Borra la cola de ejecucion de instrucciones30 ; y actualiza CS
jmp far @siguiente
[BITS 32]@siguiente:
35
; Actualiza DS y ESmov cx,LINEAR_SELmov ds,cxmov es,cx
40
; Otras inicializaciones; ....
45 ; Preparo puntero para LIDTmov ebx , IDTmov dword [idt_ptr],ebx ; Basemov word [idt_ptr +4] ,5*8 ; Lımite (5 descriptores)
50 ; Ejecuto LIDT de 32 bitslidt [idt_ptr]
; ...........
55 ;-------------------------------------------------------------------; Subrutinas de atencion a las interrupciones/excepciones
isr0: pushad
; ...60 popad
iret
; .....
; ------------------------------------------------------------------65 ; Segmento de DATOS
[SEGMENT DATOS]
gdt_ptr resw 3 ; 48 bits para cargar GDTR70 idt_ptr resw 3
; Tabla de Descriptores Global (GDT) -------------------------------
Capıtulo 10. Estado inicial y gestion del procesador 147
GDT; Descriptor NULO
75 dw 0 ; limit 15:0dw 0 ; base 15:0db 0 ; base 23:16db 0 ; typedb 0 ; limit 19:16 , flags
80 db 0 ; base 31:24
; Descriptor segmento de datos linealLINEAR_SEL equ $-GDT
dw 0xFFFF ; limit 0xFFFFF85 dw 0 ; base 0
db 0db 0x92 ; present , ring 0, data , expand -up , writabledb 0xCF ; page -granular , 32-bitdb 0
90
; Descriptor de segmento de codigoSYS_CODE_SEL equ $-GDT
dw 0xFFFF ; limit 0xFFFFFdw 0 ; (base gets set above)
95 db 0db 0x9A ; present , ring 0, code , non -conforming , readabledb 0xCF ; page -granular , 32-bitdb 0
100 ; Descriptor de segmento de codigo para modo REAL; (16-bit , byte -granular , limit =0 xFFFF)REAL_CODE_SEL equ $-GDT
dw 0xFFFFdw 0 ; (base gets set above)
105 db 0db 0x9A ; present , ring 0, code , non -conforming , readabledb 0 ; byte -granular , 16-bitdb 0
110 ; Descriptor de segmento de datos para mode REAL; (16-bit , byte -granular , limit =0 xFFFF)REAL_DATA_SEL equ $-GDT
dw 0xFFFFdw 0 ; (base gets set above)
115 db 0db 0x92 ; present , ring 0, data , expand -up , writabledb 0 ; byte -granular , 16-bitdb 0
120 ; -------------------------------------------------------------------; Tabla de Descriptores de Interrupcion (IDT)
IDT:dw isr0 ; entry point 15:0
125 dw SYS_CODE_SEL ; selectordb 0 ; word countdb 0x8E ; type (32-bit Ring 0 interrupt gate)dw 0 ; entry point 31:16 (XXX - isr0 >> 16)
130 ; ....
148 Gestion del microprocesador
10.2.3. Conmutacion a modo real
En el improbable caso de que queramos conmutar al modo de funcionamiento real, los
pasos a seguir son los siguientes:
1. Desactivamos las interrupciones.
2. Si hay paginacion
a) Ejecutamos instrucciones en una pagina en la que la direccion fısica coincida
con la lineal.
b) Nos aseguramos de que la GDT y la IDT esten en direcciones lineales que
coincidan con las fısicas.
c) Hacemos CR0.PG = 0.
d) Hacemos CR3 = 0 para borrar las TLBs.
3. Transferimos el control del programa a un segmento con un lımite de 64KB (se
actualizara CS).
4. Cargamos los registros de segmento con un descriptor en el que el lımite sea de
64KB, G=0, E=0, W=1, P=1, Base=cualquiera.
5. LIDT para situar la IDT dentro del primer MB.
6. Conmutamos a modo real: CR0.PE = 0.
7. JMP FAR para borrar la cola de instrucciones y actualizar CS.
8. Cargamos los registros de segmento con los valores apropiados.
9. Activamos las interrupciones.
Capıtulo 11
Depuracion y monitorizacion
11.1. Depuracion
El soporte hardware de la depuracion de aplicaciones se hace a traves de los registros de
depuracion: DR0..DR7 y de algunos registros especıficos del modelo1: MSR (Model Specific
Register). Con esto se proporciona:
1. Registros.
a) Registros de direccion del punto de ruptura (DR0..DR3). Hasta 4 puntos de
ruptura (breakpoints hardware).
b) Registro de estado de depuracion: DR6.
c) Registro de control de depuracion: DR7.
d) Registro DebugCtl (MSR).
e) Registros LastBranchToIP y LastBranchFromIP (MSR).
f ) Registros LastExceptionToIP y LastExceptionFromIP (MSR).
2. Excepciones de depuracion.
a) Excepcion de depuracion (#DB, vector 1).
b) Excepcion de punto de ruptura (#BP, vector 3): mediante la ejecucion de la
instruccion INT 3. Util si se quieren puntos de ruptura de codigo o mas de 4
breakpoints hardware .
3. Bits especiales.
1Aun a pesar de que los registros especıficos del modelo dependen del microprocesadores, existenalgunos que vienen apareciendo en todos ellos y que es de suponer seguiran existiendo en modelos futuros.Es por ello que los estudiamos.
149
150 Depuracion
a) Bit TSS.T (Trap). Cuando este activado se producira una excepcion de depu-
racion al conmutar de tarea.
b) Bit EFLAGS.RF (Resume flag).
c) Bit EFLAGS.TF (Trap flag).
El depurador (debugger) sera una tarea aparte y se llamara cuando se produzca alguno
de los sucesos siguientes:
Conmutacion de tarea.
Ejecucion de la instruccion INT 3.
Ejecucion de cualquier instruccion.
Ejecucion de una instruccion en una direccion concreta.
Lectura o escritura de un byte, word o dword en una direccion concreta.
Lectura o escritura de un byte, word o dword en un puerto de E/S especıfico.
Intento de modificacion de un registro de depuracion.
11.1.1. Registros de depuracion
Se accede a ellos por medio de la instruccion MOV DRn,_ que se puede ejecutar en modo
real, modo de gestion del sistema (SMM), o modo protegido con2 CPL=0.
Registros DR0..DR3
Contienen la direccion lineal de 32 bits de cada punto de ruptura (las condiciones se
especificaran en DR7). Hay 4 puntos de ruptura hardware disponibles.
31 0
DR3Direccion Lineal del Punto de Ruptura 3
31 0
DR2Direccion Lineal del Punto de Ruptura 2
31 0
DR1Direccion Lineal del Punto de Ruptura 1
31 0
DR0Direccion Lineal del Punto de Ruptura 0
2De lo contrario se producira una excepcion del tipo: Fallo de proteccion general.
Capıtulo 11. Depuracion y monitorizacion 151
Registros DR4 y DR5
Registros reservados en Pentium Pro. Si CR4.DE = 1 (Debug Extensions) el acceso a estos
registros produce una excepcion #UD de codigo de operacion desconocido. Si CR4.DE = 0
entonces DR4 = DR6 y DR5 = DR7.
31 0
DR5Reservado
31 0
DR4Reservado
Registro DR6 (Estado de Depuracion)
En este registro se guarda el estado de la depuracion.
31 16 15 1314 12 11 8 7 0
DR6B0
123456910
B1
B2
B3
0 1 1BD
BS
BT
1 11 1 11Reservado (puesto a 1)
B0..B3. Condicion de breakpoint detectada. Se activan aun cuando el punto de
ruptura no este habilitado.
BD. Acceso a registro de depuracion detectado. Indica que la siguiente instruccion
accedera a un registro de depuracion (DR0..DR7). Esta prestacion solo esta activa si
DR7.GD = 1 (General Detection flag).
BS. Indica que la excepcion de depuracion se produjo por el modo paso a paso de
ejecucion (EFLAGS.TF=1) que es la excepcion de depuracion de mayor prioridad.
BT. Indica que la excepcion se produjo por una conmutacion de tarea (TSS.T = 1).
Este registro es un registro pegajoso (sticky register), lo que significa que el micropro-
cesador pone a 1 los bits, pero no los borra automaticamente. El Sistema Operativo debe
borrar estos bits.
Registro DR7 (Control de Depuracion)
Este registro controla el comportamiento del hardware de depuracion.
31 24 23 22 21 20 19 16 15 1314 12 11 8 7 0
DR7L
0
1234569101718252627282930
G
0
L
1
L
2
L
3
G
3
L
E
G
E
G
2
G
10 0 10 0
G
D
R/W
0
LEN
0
R/W
1
LEN
1
R/W
2
LEN
2
R/W
3
LEN
3
152 Depuracion
L0..L3. Local breakpoint enable. Habilita el punto de ruptura correspondiente para
la tarea actual. Al conmutar de tarea se borra automaticamente.
G0..G3. Global breakpoint enable. Habilita el punto de ruptura para cualquier tarea.
LE y GE. Local and Global Exact breakpoint enable. Permite, para modo de tarea
local y global respectivamente, detectar la instruccion exacta que produjo el punto de
ruptura de acceso a datos. No soportado en Pentium Pro, Pentium II, y posteriores
debido a la ejecucion desordenada de instrucciones (Dynamic Execution) que tienen.
GD. General Detect enable. Habilita la proteccion en el acceso a los registros de de-
puracion. Se producira una excepcion de depuracion antes de ejecutar la instruccion.
Este bit se pone a 0 automaticamente cuando se entra en la rutina de tratamiento
de la excepcion de depuracion.
R/W0..R/W3. Define el tipo de breakpoint siguiendo la tabla siguiente:
R/Wn CR4.DE=0 CR4.DE=1
00 Ejecucion de instruccion Ejecucion de instruccion
01 Escritura de datos Escritura de datos
10 No definido Lectura/escritura en un puerto de E/S
11 Lectura/escritura de datos Lectura/escritura de datos
LEN0..LEN3. Tamano de la localizacion del breakpoint:
LENn Longitud
00 Byte
01 Word
10 No definido
11 Double word
Puntos de ruptura
Algunas consideraciones acerca de los breakpoints:
Los breakpoints de instrucciones necesitan tener una longitud de 1 byte (LEN=00).
Los breakpoints de datos deben estar alineados. Si son de tamano word la direccion
debe ser multiplo de 2. Si son de tamano dword la direccion debe ser multiplo de 4.
Si queremos un breakpoint de un dato no alineado, podemos construirlo con dos
breakpoints de datos alineados, aunque luego habrıa que tener en cuenta esto en el
programa de depuracion.
Capıtulo 11. Depuracion y monitorizacion 153
Las direcciones de E/S de 16 bits se extienden con ceros a 32 bits para los puntos
de ruptura de acceso a E/S.
11.1.2. Excepciones de depuracion
Hay dos excepciones de depuracion:
1. Excepcion de depuracion (#DB): vector 1. Cuando se produce una excepcion
hay que distinguir cual ha sido su causa.
a) Paso a Paso. Esta activo cuando EFLAGS.TF = 1. Es una excepcion tipo Trap.
No se activa el modo paso a paso hasta la 2a instruccion despues de modificar
TF. Ademas este flag se pone a cero al entrar en la rutina de excepcion. Las
instrucciones INT n, INTO desactivan TF.
b) Breakpoint de instrucciones. Se produce al intentar ejecutar una instruc-
cion situada en alguna de las direcciones apuntadas por DR0..DR3. Se genera
antes de ejecutar la instruccion (Fault). Es el breakpoint de mayor prioridad.
La rutina de excepcion debe poner EFLAGS.RF = 1 en la imagen contenida en la
pila antes de retornar. Esto evita que se vuelva a producir un breakpoint de
instruccion hasta que la instruccion que lo produjo inicialmente se haya ejecu-
tado. EFLAGS.RF=0 despues de ejecutar cada instruccion. Sin embargo, aunque
EFLAGS.RF = 1, se pueden producir en la misma direccion otros breakpoint no
de instruccion.
c) Breakpoint de datos o E/S. Se producen cuando se intenta acceder a una
direccion de memoria o E/S para leer (no la busqueda de la instruccion) o
escribir un dato. Se genera despues de ejecutar la instruccion que accede a
la direccion (Trap). El dato original se pierde, por lo que si se desea conocer
lo que valıa, habra que memorizarlo cuando se defina el breakpoint. Los bits
DR7.GE y DR7.LE son ignorados a partir del microprocesador Pentium Pro. Este
es incapaz de localizar exactamente los breakpoint de datos cuando usamos
REP STOSn o REP MOVSn.
d) Deteccion general. Si DR7.GD = 1 y se intenta acceder DR0..DR7, se produce
este tipo de excepcion. Se comprueba con DR6.BD = 1. Se produce antes de
ejecutar la instruccion (Fault).
e) Conmutacion de tarea. Se produce cuando se conmuta de tarea y TSS.T=1.
Ocurre antes de ejecutar la primera instruccion de la tarea nueva. El bit DR6.BT
lo senaliza.
154 Depuracion
2. Excepcion de breakpoint (#BP): vector 3. Tiene el vector de interrupcion No
3 y la produce la instruccion INT 3. Antes de disponer de las prestaciones hardware
para depuracion era el unico mecanismo para poner breakpoints de instrucciones. Es
util si se quieren poner mayor numero que el de disponibles por hardware.
Resumen
Condicion DR6 DR7 Tipo excepcion
Excepcion paso a paso BS = 1 Trap
Breakpoint de instr. Bn = 1 (Gn o Ln = 1)
R/Wn = 0 Fault
Breakpoint escritura Bn = 1 (Gn o Ln = 1)
datos R/Wn = 1 Trap
Breakpoint lectura o Bn = 1 (Gn o Ln = 1)
escritura en E/S R/Wn = 2 Trap
Lectura/escritura datos Bn = 1 (Gn o Ln = 1)
no busqueda instr. R/Wn = 3 Trap
Acceso a registros BD = 1 Fault
de depuracion
Conmutacion de tarea BT = 1 Trap
11.1.3. MSRs para depuracion
A partir de Pentium Pro se proporcionan cinco MSRs (Model Specific Registers) para
almacenar el ultimo salto, interrupcion o excepcion ocurrido en el procesador. Se leen con
la instruccion RDMSR.
DebugCtlMSR
31 7 6 5 4 3 2 1 0
P
B
2
P
B
1
P
B
0
B
T
F
T
R
L
B
R
P
B
3
Se modifica con WRMSR y controla algunas cosas
LBR (Last Branch/Interrupt/Exception). Se almacenan las direcciones fuente y
destino del ultimo salto/interrupcion/excepcion antes de que ocurra una excepcion
de depuracion, momento en el que automaticamente se borra este flag.
Capıtulo 11. Depuracion y monitorizacion 155
BTF (Single Step on Branches). Cuando se activa, el micro considera que EFLAGS.TF
activa el modo paso a paso de un salto a otro en vez de instruccion a instruccion.
Se borra automaticamente cuando ocurre una excepcion de depuracion.
PBn (Performance Monitoring/Breakpoint pins). Hace que las patillas BP0#..BP3#
del micro indiquen si hubo una excepcion de depuracion correspondiendose con
DR0..DR3.
TR (Trace Messages Enable). Activa que el micro envıe por el bus las direcciones
fuente/destino del ultimo salto/interrupcion/excepcion. Para depuracion desde un
dispositivo externo.
LastBranchToIP/ LastBranchFromIP
Direccion a la que se salta y Direccion de la instruccion de salto
LastExceptionToIP/ LastExceptionFromIP
Idem para interrupciones y excepciones. Estos 4 ultimos registros de 32 bits permiten
la depuracion hardware hacia atras (backtrace), permitiendo regresar al punto donde se
produjo el salto.
11.2. Monitorizacion
El soporte de la monitorizacion se realiza mediante el uso de algunos registros es-
pecıficos del modelo: MSR (Model Specific Register). A continuacion analizamos los mas
interesantes. Para mas informacion acudir al manual del microprocesador en cuestion.
11.2.1. Time-stamp counter
Aparecio a partir del Pentium. Es un contador de 64 bits que cuenta el numero de
ciclos de reloj desde que comenzo a funcionar el micro (o reset hardware). Es un contador
dependiente del modelo.
Cuando ejecutamos la instruccion CPUID, EDX.TSC=1 (bit 4) indica la existencia de este
contador. Se lee con la instruccion RDTSC (si CR4.TSD=0 o CPL=0). Devuelve en EDX:EAX el
valor del contador. Tambien se lee/escribe con RDMSR/WRMSR, aunque solo se puede acceder
a los 32 bits mas bajos, el resto se extiende con ceros.
156 Monitorizacion
11.2.2. Monitorizacion del sistema
Existen dos contadores de 40 bits que permiten monitorizar dos sucesos simultanea-
mente. Se pueden usar desde cualquier nivel de privilegio. Pueden citar el numero de veces
que ocurrio el suceso o el numero de ciclos de reloj entre los dos sucesos.
PerfEvtSel0 / PerfEvtSel1
31 8 7 0
Event SelectCounter Mask
EE
N
I
N
T
19 1618 15172021222324
I
N
V
P
C
U
S
R
O
SUnit Mask (UMASK)
(CMASK)
Solamente se pueden modificar si CPL=0 y seleccionan el tipo de evento a monitorizar.
Event Select. Selecciona el evento. Consultar la lista de eventos disponibles en el
manual del microprocesador.
Unit Mask. Subselecciona tipo de evento.
USR. Solo contabiliza en modo usuario (niveles 1, 2 y 3).
OS. Solo contabiliza en modo supervisor (nivel 0).
E. Deteccion del suceso por flanco.
PC. Conmuta la salida de los pines PMi pulso durante dos ciclos cuando vale cero.
Idem cuando hay un desbordamiento del contador en el caso de valer uno.
INT. Genera una excepcion a traves de su APIC local si hay un desbordamiento
del contador.
EN. Habilita los dos contadores.
INV. Invierte el resultado de la comparacion contador/mascara.
Counter Mask. Cuando es distinta de cero solo se incrementa el contador cuando
la cuenta interna de sucesos por ciclo de reloj, supera esta cantidad. Sirve para
contar el no de veces que ocurre un suceso en un ciclo de reloj.
PerfCtr0/ PerfCtr1
Son los MSR contadores y se pueden leer con RDPMC desde cualquier nivel de privilegio.
Si CR4.PCE = 0, entonces es necesario que CPL=0.
Apendice A
Sistemas de numeracion
La memoria en un ordenador es un almacen de numeros1. Estos no se almacenan en
el sistema decimal (base 10). Dado que se simplifica enormemente el diseno hardware,
los computadores almacenan toda la informacion en formato binario (base 2). Revisemos
primeramente el sistema decimal.
A.1. Decimal
En base 10 los numeros se componen de 10 posibles dıgitos (0-9). Cada dıgito de un
numero tiene una potencia de 10 asociada con el basada en su posicion en el numero. Por
ejemplo:
234 = 2 × 102 + 3 × 101 + 4 × 100
A.2. Binario
En base 2 los numeros se componen de 2 posibles dıgitos (0 y 1). Cada dıgito de un
numero tiene una potencia de 2 asociada con el basada en su posicion en el numero. (Un
dıgito binario se llama bit) Por ejemplo:
110012 = 1 × 24 + 1 × 23 + 0 × 22 + 0 × 21 + 10
= 16 + 8 + 1
= 25
Esto muestra como los numeros binarios se convierten en decimales.
....
1Esta seccion se ha extraıdo del libro PC Assembly Language de Paul A. Carter de dominio publicodisponible en http://www.drpaulcarter.com/pcasm.
157
158 Hexadecimal
A.3. Hexadecimal
Los numeros hexadecimales utilizan base 16. Se usan para manejar los numeros bina-
rios en un formato mas corto. Los hexadecimales tienen 16 posibles dıgitos. Dado que no
hay sımbolos numericos para representar todos los dıgitos posibles, se utilizan las primeras
letras del abecedario ( 0-9, A, B, C, D, E y F). El dıgito A es equivalente a 10 en decimal,
B es 11, etc. Cada dıgito en un numero hexadecimal tiene una potencia de 16 asociada a
el. Ejemplo:
2BD16 = 2 × 162 + 11 × 161 + 13 × 160
= 512 + 176 + 13
= 701
A.4. Trabajando con enteros
A.4.1. Representacion de los enteros
Los numeros enteros pueden tener o no signo. Los numeros enteros sin signo se repre-
sentan en binario de una manera directa. El numero 200 se representarıa como 11001000b
(o C8h en hexadecimal). Los enteros con signo se representan de maneras mas complica-
das.
Por ejemplo consideremos el valor -56. Si el valor 56 se representa como 111000b, el
valor -56 podrıa representarse como -111000b. Pero ¿como se almacena esto en la memoria
del computador? Hay tres tecnicas que se han usado para representar los enteros con signo
y todas ellas emplean el bit mas significativo como bit de signo. Este bit vale cero si el
numero es positivo y uno si es negativo.
Signo-magnitud El primer metodo y mas simple se llama signo-magnitud. Representa
el numero entero como dos partes. La primera parte es el bit de signo y la segunda parte es
la magnitud del entero. Luego el numero 56 se representarıa como el byte 00111000b (el bit
de signo esta subrayado) y el valor -56 serıa 10111000b. El valor mas grande almacenable
en un byte serıa +127 y el de valor mas negativo el -127. Para negar un valor se cambia
el bit de signo. Este metodo es directo pero tiene sus desventajas. Primero, hay dos
posibles representaciones del valor 0. Dado que el cero ni es positivo ni es negativo ambas
representaciones deberıan actuar de la misma manera. Esto complica la logica aritmetica
de la CPI. Segundo, la aritmetica general tambien se complica. Si 10 es sumado a -56,
implica cambiar el signo y restar 10 de 56, De nuevo, esto complica la logica de la CPU.
Capıtulo A. Sistemas de numeracion 159
Complemento a uno El segundo metodo se conoce como complemento a uno. El
complemento a uno de un numero se obtiene cambiando cada bit del numero. Por ejemplo,
el complemento a no de 00111000b (+56) es 11000111. Con esta tecnica complementar
los bits equivale a negar. Luego 1100111b serıa el valor -56. Se ve que el bit de signo ha
cambiado y al complementar dos veces se obtiene el numero original y positivo. Pero,
como el primer metodo tiene dos representaciones del cero: 00000000b (+0) y 11111111b
(-0). La aritmetica de los numeros en complemento a uno es complicada.
Complemento a dos Los dos primeros metodos solamente se emplearon en los compu-
tadores mas antiguos. Los actuales utilizan el metodo denominado de complemento a dos.
El complemento a dos de un numero se consigue en dos pasos:
1. Se obtiene el complemento a uno del numero en binario.
2. Se suma uno al resultado.
Como consecuencia: dos negaciones devuelven el numero original y la aritmetica es
muy sencilla.
160 Trabajando con enteros
Apendice B
Codigos ASCII
Tabla ASCII
Dec Hex Car Dec Hex Car Dec Hex Car Dec Hex Car
0 00 NUL 32 20 Espacio 64 40 @ 96 60 ‘1 01 SOH 33 21 ! 65 41 A 97 61 a2 02 STX 34 22 " 66 42 B 98 62 b3 03 ETX 35 23 # 67 43 C 99 63 c4 04 EOT 36 24 $ 68 44 D 100 64 d5 05 ENQ 37 25 % 69 45 E 101 65 e6 06 ACK 38 26 & 70 46 F 102 66 f7 07 BEL 39 27 ’ 71 47 G 103 67 g8 08 BS 40 28 ( 72 48 H 104 68 h9 09 HT 41 29 ) 73 49 I 105 69 i
10 0A LF 42 2A * 74 4A J 106 6A j11 0B VT 43 2B + 75 4B K 107 6B k12 0C FF 44 2C , 76 4C L 108 6C l13 0D CR 45 2D - 77 4D M 109 6D m14 0E SO 46 2E . 78 4E N 110 6E n15 0F SI 47 2F / 79 4F O 111 6F o16 10 DLE 48 30 0 80 50 P 112 70 p17 11 DC1 49 31 1 81 51 Q 113 71 q18 12 DC2 50 32 2 82 52 R 114 72 r19 13 DC3 51 33 3 83 53 S 115 73 s20 14 DC4 52 34 4 84 54 T 116 74 t21 15 NAK 53 35 5 85 55 U 117 75 u22 16 SYN 54 36 6 86 56 V 118 76 v23 17 ETB 55 37 7 87 57 W 119 77 w24 18 CAN 56 38 8 88 58 X 120 78 x25 19 EM 57 39 9 89 59 Y 121 79 y26 1A SUB 58 3A : 90 5A Z 122 7A z27 1B ESC 59 3B ; 91 5B [ 123 7B {28 1C FS 60 3C < 92 5C \ 124 7C |29 1D GS 61 3D = 93 5D ] 125 7D }30 1E RS 62 3E > 94 5E ^ 126 7E ~31 1F US 63 3F ? 95 5F _ 127 7F DEL
161
162
Apendice C
Problemas
C.1. Aritmetica extendida: producto de 64 bits
Enunciado
Realiza una subrutina en ensamblador que sea capaz de realizar un producto de
64x64⇒128 bits. El resultado se guarda en la variable RESULT que esta en memoria, y
los valores a multiplicar estan apuntados por DS:ESI y ES:EDI respectivamente. Al salir los
unicos registros que se modifican son ES:EDI, que apuntan a la variable RESULT.
Solucion
Listado C.1: Aritmetica extendida: producto de 64 bits[BITS 16][SEGMENT CODIGO]..start:
MOV AX,DATOS5 MOV DS,AX
MOV ES,AXMOV ESI ,NUM1MOV EDI ,NUM2CALL MULT64
10
MOV AX ,4C00H ; Retorna al MSDOSINT 21H
; Algoritmo.;
15 ; H1 L1 98; x H2 L2 72; ------- ----; L2L1 16; L2H1 18
20 ; H2L1 56; H1H2 63; ------------ ------; R1R2R3R4 7056MULT64:
25 PUSH EAX
PUSH EBX
PUSH ECX
PUSH EDX ; Guardo los registros al entrar
163
164 Aritmetica extendida: producto de 64 bits
30 MOV EAX ,[DS:ESI] ; Tomo L1MOV EDX ,[ES:EDI] ; Toma L2MUL EDX ; EDX EAX = L2L1
MOV DWORD [DS:RESULT],EAX35 ; Los 32 bits mas bajos ya son correctos
MOV EBX ,EDX ; Guardo temporalmente los 2 o ’s 32 bits
MOV EAX ,[DS:ESI +4] ; Tomo H140 MOV EDX ,[ES:EDI] ; Tomo L2
MUL EDX ; EDX EAX = L2H1
ADD EBX ,EAX ; Incremento los 2 o ’s 32 bitsADC EDX ,0 ; Tengo en cuenta el posible acarreo
45 MOV ECX ,EDX ; Guardo temporalmente los 3 o ’s 32 bits
MOV EAX ,[DS:ESI] ; Tomo L1MOV EDX ,[ES:EDI +4] ; Tomo H2MUL EDX ; EDX EAX = H2L1
50
ADD EBX ,EAX ; Incremento los 2 o ’s 32 bitsMOV DWORD [DS:RESULT +4],EBX
; Guardo los 2 o ’s 32 bitsADC ECX ,EDX ; Incremento los 3 o ’s 32 bits
55 PUSHFD ; Guardo el posible acarreo
MOV EAX ,[DS:ESI +4] ; Tomo H1MOV EDX ,[ES:EDI +4] ; Tomo H2MUL EDX ; EDX EAX = H2H1
60
ADD ECX ,EAX ; Incremento los 3 o ’s 32 bitMOV DWORD [DS:RESULT +8],ECX
; Los guardoADC EDX ,0 ; Sumo el posible acarreo
65 POPFD ; Recupero el posible acarreoADC EDX ,0 ; Sumo el posible acarreoMOV DWORD [DS:RESULT +12],EDX
; Guardo los 4 o ’s 32 bitMOV AX ,DATOS
70 MOV ES ,AXMOV EDI ,RESULT ; La direccion del resultado
POP EDX
POP ECX
75 POP EBX
POP EAX ; Recupero los registros al salir
RET
80 [SEGMENT DATOS ALIGN =16]NUM1 DD 100000 ,0 ; Multiplicando = 100000NUM2 DD 20,0 ; Multiplicador = 20RESULT RESQ 1 ; Reserva espacio parte baja del resultado
RESQ 1 ; Resultado parte alta85
[SEGMENT PILA STACK]RESW 512
Capıtulo C. Problemas 165
C.2. Aritmetica extendida: producto de 64 bits, (2)
Enunciado
Se pide implementar una subrutina que usando aritmetica entera de 32 bits sea capaz
de multiplicar dos numeros de 64 bits de la manera mas rapida posible empleando el
Algoritmo de Karatsuba, que se describe a continuacion:
Sean dos numeros de 64 bits U y V que se pueden descomponer en dos partes de 32
bits (U0 y V0 las partes bajas y U1 y V1 las partes altas): U = U0 + U1B y V = V0 + V1B
donde B = 232, entonces el producto U ∗ V se puede escribir como:
U ∗ V = (1 + B)U0V0 + B(U1 − U0)(V0 − V1) + (B + B2)U1V1
donde se observa que solamente se realizan 3 productos (el resto son sumas y despla-
zamientos)1. La subrutina, escrita en ensamblador de Pentium 4, 32 bits, se podra llamar
desde lenguaje C con la siguiente cabecera:
void ProductoKaratsuba( int *U, int *V, int *R);
Y se usara:
int U[2], V[2], R[4];ProductoKaratsuba(U,V,R);
Se recuerda que el lenguaje C pasa la direccion (desplazamiento de 32 bits) cuando la
variable es una matriz de datos. El tipo int es de 32 bits.
Solucion
El programa serıa el siguiente:
[BITS 32][GLOBAL _ProductoKaratsuba][SECTION .text]; El algoritmo se resume en:
5 ; i U0V0 1*U0V0; ii U0V0 B*U0V0; iii UUVV B*(U1 -U0)(V0 -V1); iv U1V1 B*U1V1; v U1V1 B^2* U1V1
10 ; ------------; R4R3R2R1; Algunas definiciones%define U_Pointer [ebp +8]%define V_Pointer [ebp +12]
15 %define R_Pointer [ebp +16]
; La rutina
1Este algoritmo permite reducir el numero de productos empleados para la rutina de multiplicacionextendida. Ası si los numeros a multiplicar estan compuestos de N partes con la anchura del productoimplementado en la arquitectura del microprocesador, con la aritmetica convencional serıan necesariasN2 productos (en el ejemplo a implementar N = 2, luego se necesitarıan 4 productos), con el algoritmodescrito tiende a N log(3)/ log(2) (en el ejemplo = 2,9999 productos).
166 Aritmetica extendida: producto de 64 bits, (2)
_ProductoKaratsubapush ebp
20 mov ebp ,esp ; Prologo para rutinas en Cpushad
mov esi ,U_Pointermov edi ,V_Pointer
25 mov ebx ,R_Pointer
mov dword[ebx +12],0 ; R4 = 0
mov eax ,[esi] ; EAX=U030 imul dword [edi] ; EDX_EAX = U0*V0
mov [ebx],eax ; Guarda R1 definitivoadd eax ,edxadc edx ,0 ; Suma el termino ii
35 mov [ebx+4],eax ; Guarda R2 temporalmov [ebx+8],edx ; Guarda R3 temporaladc dword[ebx +12],0 ; Guarda R4 temporal
mov eax ,[esi +4] ; EAX=U140 sub eax ,[esi] ; EAX=U1 -U0
mov edx ,[edi] ; EDX=V0sub edx ,[edi +4] ; EDX=V0 -V1
45 imul edx ; EDX_EAX = (U1 -U0)*(V0 -V1); Suma el termino iii
add [ebx+4],eax ; Actualiza R2adc [ebx+8],edx ; Actualiza R3bt edx ,31 ; Si es negativo suma -1
50 jc @Negativoadc dword [ebx +12],0 ; Actualiza R3jmp @Sigue
@Negativo:adc dword [ebx+12],-1
55 @Sigue:mov eax ,[esi +4] ; EAX=U1mov edx ,[edi +4] ; EDX=V1
imul edx ; EDX_EAX = U1V160 add [ebx+4],eax
adc [ebx+8],edxadc dword [ebx +12],0 ; Suma el termino iv
add [ebx+8],eax65 adc [ebx+12],edx ; Suma el termino v
popad
pop ebp ; Epilogo para rutinas en Cret
El programa en C para probarlo:
1 #include <stdio.h>
extern void ProductoKaratsuba(int *U, int *V, int *R);
int main()6 {
int U[2], V[2], R[4], i;
Capıtulo C. Problemas 167
U[0]=0x0;U[1]=0x1; /* U = 2^32 */
11
V[0]=0 x10;V[1]=0x0; /* V = 16 */
ProductoKaratsuba(U,V,R);16
for(i=3; i>=0; i--) printf(" %08X␣",R[i]);printf("\n");
}
Y el fichero makefile:
1 # Compilado desde CygWin (Windows XP)
karatsuba.exe: karatsuba.c karatsuba.asmnasm -fwin32 -g karatsuba.asm -o karatsuba_asm.ogcc -c -g karatsuba.c
6 gcc karatsuba.o karatsuba_asm.o
168 Comparacion de cadenas de datos
C.3. Comparacion de cadenas de datos
Enunciado
Realizar una subrutina que compare dos cadenas de caracteres apuntadas por DS:ESI
y ES:EDI respectivamente y que esten terminadas en CERO (ASCIIZ). Debe incluir la
posibilidad de tener los caracteres N y n insertados en su lugar correspondiente.
Solucion
Comienzo
i=0
¿C1[i]==0?
¿C2[i]==0?
¿C1[i]>C2[i]?
menor <
i=i+1
NO
NO
Cadena 1 despuésCF=0
Retorna
> mayor
= igual
Cadena 2 despuésCF=1
¿C1[i]==C2[i]?
NO
SI
SI
ZF=1
SI
Subrutina que compara dos cadenas de caracteres queestán terminadas con CERO (ASCIIZ).Debe incluir los caracteres Ñ y ñ insertados en su lugarcorrespondiente.
Listado C.2: Comparacion de cadenas de datos[BITS 16][SEGMENT CODIGO]..start:
MOV AX ,DATOS5 MOV DS ,AX
MOV ES ,AXMOV ESI ,CAD1MOV EDI ,CAD2CALL COMPARA
10
MOV AX ,4C00HINT 21H
;
Capıtulo C. Problemas 169
; Compara caracter a caracter. Si uno de los caracteres es cero , esta15 ; antes la de menor longitud.
;COMPARA:
CLD ; Preparo para direcciones crecientes
20 @LAZO: MOV AL ,[DS:ESI]CMP AL ,0 ; Si es cero saleJZ @CAD2 ; la cadena 2 despues
MOV BL ,[ES:EDI]25 CMP BL ,0 ; Si es cero sale
JZ @CAD1 ; la cadena 1 despues
CALL COMPCAR ; Comparo los dos caracteres; IN : AL Car1
30 ; BL Car2; OUT: Los flags de acuerdo con la; CMP Car1 ,Car2
35 JG @CAD1 ; y si es mayor el primero , estaJL @CAD2 ; despues la cadena 2, si no la 1
INC EDI
INC ESI ; Incremento los punteros y continuo40 JMP @LAZO
@CAD1: CLC ; CF=0 CAD1 DespuesRET
45 @CAD2: MOV BL ,[ES:EDI] ; Compruebo si la otra tambien acabaCMP AL,BL ; Si son iguales lo indico
STC ; CF=1 CAD2 Despues
50 RET ; Y salgo;; Compara un caracter segun la tabla; IN : AL Car1; BL Car2
55 ; OUT: Modifica CX ,; Los flags de acuerdo con la comparacion Car1 ,Car2
COMPCAR:PUSH EDI
60 PUSH ESI ; Guardo al entrar
MOV EDI ,TABLAMOV CX,TAMANOREPNE SCASB ; Busca el primer caracter
65
MOV ESI ,EDI ; Guarda la posicion
XCHG AL,BL ; Toma el segundo caracter a buscar
70 MOV EDI ,TABLAMOV CX,TAMANOREPNE SCASB ; Busca el segundo caracter
CMP ESI ,EDI ; Compara las direcciones75
170 Comparacion de cadenas de datos
POP ESI
POP EDI ; Recupero al salir
RET ; Retorna80
[SEGMENT DATOS ALIGN =16]CAD1 DB ’Mu~noz ’,0CAD2 DB ’Mu~noz␣A’,0TABLA DB ’0123456789 ABCDEFGHIJKLMN~NOPQRSTUVWXYZ ’
85 DB ’abcdefghijklmn~nopqrstuvwxyz ’FINTAB DB 0
TAMANO EQU FINTAB -TABLA
90 [SEGMENT PILA STACK]RESW 512
Capıtulo C. Problemas 171
C.4. Evaluacion de un polinomio
Enunciado
Realizar una subrutina en ensamblador que evalue un polinomio de orden N, de la
manera mas rapida posible. Los coeficientes y la variable x son enteros SIN signo. Los
coeficientes estan almacenados consecutivamente a0, a1, .. en una direccion apuntada por
DS:ESI, y la variable dependiente x se envıa a la subrutina en el registro EAX. El resultado
se devuelve en EAX. Si hay desbordamiento se indica con el acarreo puesto a UNO.
P (x) = a0 + a1 ∗ x + a2 ∗ x2 + ... + aN ∗ xN
Propuesto : Modificar el programa para que sea capaz de trabajar con numeros enteros
CON signo.
Solucion
Listado C.3: Evaluacion de un polinomio[BITS 16][SEGMENT CODIGO]..start:
MOV AX,DATOS5 MOV DS,AX
MOV ESI ,COEFSMOV EAX ,300
CALL EVALUA10
MOV AX ,4C00HINT 21H
; Usaremos la regla de Horner15 ;
; P(x) = a0 + x*( a1 + x*( a2 + x*( ... + x*(aN + 0))));; 1 o .- Toma AN; 2 o .- Le suma el resultado anterior (la primera vez 0)
20 ; 3 o .- Lo multiplica por x; 4 o .- Guarda el resultado; 5 o .- Repite hasta acabar con A1; 6 o .- Sumale A0;
25 EVALUA:MOV DWORD [DS:RESUL],0 ; Acumulador a CERO
MOV EBX ,EAX ; EBX = x
30 MOV ECX ,[DS:NCOEF] ; Tomo el numero de coefsDEC ECX ;ADD ESI ,ECXADD ESI ,ECXADD ESI ,ECX
35 ADD ESI ,ECX ; Me situo en el ultimo coeficiente
172 Evaluacion de un polinomio
STD ; Incremento hacia direcciones decrec.
@LAZO: LODSD ; EAX = a[ECX] y ESI = ESI - 440 ADD EAX ,[DS:RESUL]
JC @OVFLW ; Si no cabe salgo
MUL EBX ; EDX EAX = Resultado parcial45 MOV [DS:RESUL],EAX ; Guardo la parte que interesa
AND EDX ,EDXJNZ @OVFLW ; Si no cabe salgo
50 LOOP @LAZO
LODSD ; Coeficiente a0ADD EAX ,[DS:RESUL] ; El resultado en EAX
55 JC @OVFLW ; Si no cabe salgo
RET ; CF = 0 Not Overflow
@OVFLW: STC ; CF = 1 Overflow60 RET
;[SEGMENT DATOS ALIGN =16]COEFS DD 4,2,1 ; P(x) = X^2 +2*X +4NCOEF DD 3 ; Numero de coeficientes
65 RESUL RESD 1 ; Resultado de 32 bits (p(300)=90604);[SEGMENT PILA STACK]
RESW 512
Capıtulo C. Problemas 173
C.5. Hallar los ceros de una funcion
Enunciado
Realizar un programa en ensamblador que permita evaluar los ceros de una funcion.
Toma como ejemplo de funcion:
f(x) = 2x2 − 1241
para ello se empleara el siguiente algoritmo:
xn+1 = xn − f(x)/f ′(x)
donde la derivada se calculara con la siguiente expresion:
f ′(x) = 1/2 ∗ (f(x + 1) − f(x − 1))
Entrada: Aproximacion inicial x0 en AX (16 bits con signo)
Salida : Resultado en AX y EFLAGS.CF = 0. Si resultado erroneo, AX = 0 y EFLAGS.CF = 1.
Solucion
Listado C.4: Hallar los ceros de una funcion[BITS 16][SEGMENT CODIGO]; Programa principal; Entrada : AX Valor inicial
5 ; Salida : DX AX resultado..start:
MOV AX ,1 ; Valor inicialMOV CX ,10 ; Numero maximo de iteraciones
@BUCLE: PUSH CX
10 PUSH AX
CALL ITERA ; Resultado en AX x(n+1)JC @HAYERRPOP BX ; Resultado anterior x(n)POP CX
15 CMP AX ,BXJZ @EXITOLOOP @BUCLE ; Alcanzo el no max. de iter. sin exitoJMP @ERR2
20 @EXITO: CLC ; Salida con exito CF=0 AX=resultadoJMP @FIN
@HAYERR: ; Tengo que recuperar la pilaPOP BX
25 POP CX
@ERR2: STC ; Salida con error CF=1 AX=0XOR AX ,AX
@FIN: MOV AX ,4C00H30 INT 21H
174 Hallar los ceros de una funcion
; Subrutina que halla una iteracion; Entrada : AX Valor inicial de X(n); Salida : AX Valor de X(n+1)
35 ; Modifica: Ax , DX , ..
ITERA: MOV BX,AX ; BX = xCALL FPRIMA ; DX AX = f ’(x)PUSH AX
40 PUSH DX
MOV AX,BXCALL FUNCION ; DX AX = f(x)POP CX
45 AND CX,CX ; Si la parte alta es distinta de ceroJNZ @ERR ; Como solo se dividir por 16 bits ERROR
POP CX
AND CX,CX50 JZ @DIVBY0
IDIV CX ; AX = f(x)/f ’(x)
SUB BX,AX ; BX = x-f(x)/f ’(x)55 MOV AX,BX
CLC ; CF = 0 EXITORET
@ERR: POP CX
60 @DIVBY0:STC ; CF = 1 ERRORRET
; Evalua la derivada de f(x)65 ; Entrada : AX Valor de x
; Salida : DX AX Valor de f ’(x); Modifica: AX , DX , BX .. y Flags
FPRIMA:70 MOV BX,AX ; BX = ’x’
DEC AX ; AX = ’x-1’CALL FUNCION ; DX AX = ’f(x-1)’PUSH DX ; No puede desbordarse , no lo comprueboPUSH AX
75 MOV AX,BXINC AX ; AX = ’x+1’CALL FUNCION ; DX AX = ’f(x+1)’POP BX
SUB AX,BX80 POP BX
SBB DX,BX ; DX AX = ’f(x+1)-f(x-1)’SHR DX ,1RCR AX ,1 ; DX AX = ’(f(x+1)-f(x-1) )/2’RET
85
; Evalua la funcion f(x); Entrada : AX Valor de x; Salida : DX AX Valor de f(x); Modifica: AX , DX y Flags
90
FUNCION:IMUL AX ; DX AX = ’x^2’
Capıtulo C. Problemas 175
SHL AX ,1RCL DX ,1 ; DX AX = ’2*x^2’
95 JC @ERROR ; !! Con esta funcion nunca se desbordaSUB AX ,1241SBB DX ,0 ; DX AX = ’2*x^2 -1241’CLC
100 @ERROR: RET
[SEGMENT DATOS ALIGN =16]
[SEGMENT PILA STACK]105 RESW 512
176 Reloj
C.6. Reloj
Enunciado
Tenemos un sistema basado en 8086, que tiene conectado un reloj que cada centesima
de segundo produce una interrupcion NMI. Debemos realizar un programa para el Sistema
Operativo, que cuente el tiempo basandose en esa interrupcion. Para ello debera actua-
lizar unas variables (word) situadas en memoria a partir de 0000:1000h que almacenan la
siguiente informacion : ano, mes, dıa, hora, minuto, segundo y centesima de segundo. Al
arrancar el sistema contienen los valores 1980, 1 (enero), 1 (dıa), 0 (horas), 0 (minutos),
0 (segundos), 0 (centesimas de segundo).
Escribir el codigo necesario para que se cuente el tiempo de forma adecuada incremen-
tando cada contador en su momento. Pintar el diagrama de flujo. Ojo: los meses del ano
tienen 31,28,... dıas, respectivamente (suponed una tabla que contenga esos valores). No
considereis los anos bisiestos.
Solucion
Inicio
ANNO=1980MES=1DIA=1
HORA=0MINUTO=0
SEGUNDO=0CENTESIMA=0
Inicia la tabla de vectores de interrupción
Deja el programa residente
Retorna
Interrupción
Guardo registros
Incremento CENTESIMAS
CENTESIMAS=100
CENTESIMAS=0Incremento SEGUNDOS
SEGUNDOS=60
SEGUNDOS=0Incremento MINUTOS
MINUTOS=60
MINUTOS=0Incremento HORA
HORA=24
HORA=0Incremento DIA
DIA=DíaMáximo[MES]
DIA=1Incrementa MES
MES=13
MES=1Incrementa ANNO
Recupero registros
IRET
Problema 7
Programa principal
Capıtulo C. Problemas 177
Inicio
ANNO=1980MES=1DIA=1
HORA=0MINUTO=0
SEGUNDO=0CENTESIMA=0
Inicia la tabla de vectores de interrupción
Deja el programa residente
Retorna
Interrupción
Guardo registros
Incremento CENTESIMAS
CENTESIMAS=100
CENTESIMAS=0Incremento SEGUNDOS
SEGUNDOS=60
SEGUNDOS=0Incremento MINUTOS
MINUTOS=60
MINUTOS=0Incremento HORA
HORA=24
HORA=0Incremento DIA
DIA=DíaMáximo[MES]
DIA=1Incrementa MES
MES=13
MES=1Incrementa ANNO
Recupero registros
IRET
Problema 7
Inicio
ANNO=1980MES=1DIA=1
HORA=0MINUTO=0
SEGUNDO=0CENTESIMA=0
Inicia la tabla de vectores de interrupción
Deja el programa residente
Retorna
Interrupción
Guardo registros
Incremento CENTESIMAS
CENTESIMAS=100
CENTESIMAS=0Incremento SEGUNDOS
SEGUNDOS=60
SEGUNDOS=0Incremento MINUTOS
MINUTOS=60
MINUTOS=0Incremento HORA
HORA=24
HORA=0Incremento DIA
DIA=DíaMáximo[MES]
DIA=1Incrementa MES
MES=13
MES=1Incrementa ANNO
Recupero registros
IRET
Problema 7
Subrutina de atencion a la interrupcion.
Listado C.5: Reloj[BITS 16][SEGMENT CODIGO];; Programa principal. Inicia las variables y inicia la tabla
5 ; de vectores de interrupcion .; Propuesto: Que considere los a~nos bisiestos; 1 bisiesto cada 4 a~nos; no bisiesto cada 100 a~nos; bisiesto cada 400 a~nos (ej.: a~no 2000)
10 ;..start:; INICIALIZACION VARIABLES
; xor ax ,ax ; Situo el segmento de datos15 mov ax ,DATOS ; Solo para DEPURACION
mov ds ,ax
mov WORD [ds:ANNO], 1980mov WORD [ds:MES], 1
20 mov WORD [ds:DIA], 1mov WORD [ds:HORAS], 0mov WORD [ds:MINUTOS], 0mov WORD [ds:SEGUNDOS],0mov WORD [ds:CENTESIM],0
178 Reloj
25
; INICIALIZACION DE LA TABLA DE VECTORES DE INTERRUPCION; La interrupcion NMI tiene asociado el vector de interrupcion no 2
; mov WORD [ds:2*4+0] , TIMER30 ; mov WORD [ds:2*4+2] , SEG CODIGO
mov cx ,64000@loop1: push cx
mov cx ,6500035 @loop: call TIMER ; Solo para DEPURACION
loop @looppop cx
loop @loop140
; En el programa FINAL no hay que llamar al sistema operativo de esta; manera , sino que hay que dejar el programa residente en memoria ...
MOV AX ,4C00H45 INT 21H
TIMER:; Al llamar hay que guardar los registros
50 push ds
push ax
push bx
; Cambio el puntero de datos55
; xor ax ,axmov ax,DATOS ; Solo DEPURACIONmov ds,ax
60 ; Incremento las centesimas de segundo
mov ax ,[ds:CENTESIM]inc ax
mov [ds:CENTESIM],ax65 cmp ax ,100
jnz NEAR @SALIR
; Incremento los segundos
70 mov WORD [ds:CENTESIM], 0 ; Centesimas a ceromov ax ,[ds:SEGUNDOS]inc ax
mov [ds:SEGUNDOS],axcmp ax, 60
75 jnz @SALIR
; Incremento los minutos
mov WORD [ds:SEGUNDOS],0 ; Pongo a cero los segundos80 mov ax ,[ds:MINUTOS]
inc ax
mov WORD [ds:MINUTOS],axcmp ax, 60jnz @SALIR
85
; Incremento las horas
Capıtulo C. Problemas 179
mov WORD [ds:MINUTOS], 0 ; Pongo a cero las minutosmov ax ,[ds:HORAS]
90 inc ax
mov WORD [ds:HORAS],axcmp ax , 24jnz @SALIR
95 ; Incremento los dıas
mov WORD [ds:HORAS], 0 ; Pongo a cero las horasmov ax ,[ds:DIA]inc ax
100 mov WORD [ds:DIA],axdec ax ; En vez de comparar con
; DiaMaximo[MES]+1 decremento; el dia en uno para; comparar con DiaMaximo[MES]
105 mov bx ,[ds:MES]dec bx
shl bx ,1add bx ,MESES ; Por que Enero es el 1 o
; habrıa que sumar cero110 cmp ax ,[ds:bx]
jnz @SALIR
; Incremento los meses
115 mov WORD [ds:DIA], 1 ; Pongo a uno los dıasmov ax ,[ds:MES]inc ax
mov WORD [ds:MES],axcmp ax ,13
120 jnz @SALIR
; Incremento los a~nos
mov WORD [ds:MES], 1 ; Pongo a uno los meses125 mov ax ,[ds:ANNO]
inc ax
mov WORD [ds:ANNO],ax
; Al salir hay que recuperar los registros usados130
@SALIR: pop bx
pop ax
pop ds
135 ; En el programa final debe ser IRET
; iretret ; Solo DEPURACION
140 [SEGMENT DATOS ALIGN =16]MESES DW 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
; Las coloco en este segmento para las pruebas de depuracion pero en; realidad estan en el segmento 0000h
145
ANNO DW 1980MES DW 1DIA DW 1
180 Reloj
HORAS DW 0150 MINUTOS DW 0
SEGUNDOS DW 0CENTESIM DW 0
[SEGMENT PILA STACK]155 RESW 512
Apendice D
Problemas FPU
D.1. Modulo de un vector
Enunciado
Se pide hallar el modulo de un vector bidimensional utilizando el coprocesador ma-
tematico.
Solucion
Listado D.1: Modulo de un vector[BITS 16][SEGMENT CODIGO]..start:
4 ; La operacion a realizar es:;; Resul = SQRT( X*X + Y*Y );; En notacion Polaca Inversa:
9 ;; X, X ,* ,Y, Y, *, +, SQRT.;
MOV BX,DATOS14 MOV DS,BX ; Inicializo el Selector de Datos
FINIT
FILD WORD [TempX] ; ST0 = TempX
19 FLD ST0 ; ST1 = TempX; ST0 = TempX
FMULP ST1 ; ST0 = TempX * TempX
24 FILD WORD [TempY] ; ST1 = TempX * TempX; ST0 = TempY
FLD ST0 ; ST2 = TempX * TempX; ST1 = TempY
29 ; ST0 = TempY
FMULP ST1 ; ST1 = TempX * TempX; ST0 = TempY * TempY
181
182 Modulo de un vector
34 FADDP ST1 ; ST0 = TempX * TempX + TempY * TempY
FSQRT ; ST0 = SQRT( TempX ^2 + TempY ^2 )
FISTP WORD [Resul] ; Resul = ST0 (POP)39
MOV AX ,4C00hINT 21h ; Termina llamando la MSDOS
[SEGMENT DATOS ALIGN =16]44
TempX DW 3 ; Valor de XTempY DW 4 ; Valor de YResul RESW 1 ; Resultado , que tiene que valer 5
49 [SEGMENT PILA STACK]RESW 512
Capıtulo D. Problemas FPU 183
D.2. Funcion exponencial
Enunciado
Se pide disenar un programa que sea capaz de hallar la funcion exponencial usando el
coprocesador matematico.
Solucion
Listado D.2: Funcion exponencial[BITS 16][SEGMENT CODIGO]..start:
; La operacion a realizar es:5 ;
; Resul = e^(X) = ( 2^( X*log2(e) )-1 ) +1;; En notacion Polaca Inversa:;
10 ; Log2(e), X, *, F2XM1 , 1, +. Ojo !! F2XM1 -> (-0.5, 0.5);MOV AX,DATOSMOV DS,AX ; Inicio el selector de Datos
15 FINIT
FLDL2E ; ST0 = Log2(e)
FLD QWORD [TempX] ; ST1 = Log2(e); ST0 = TempX
20
FMULP ST1 ; ST0 = TempX * Log2(e)
FLD ST0 ; ST1 = TempX * Log2(e); ST0 = TempX * Log2(e)
25
FRNDINT ; ST1 = X; ST0 = Trunc( X )
FXCH ST1 ; ST1 = Trunc( X )30 ; ST0 = X
FSUB ST0 ,ST1 ; ST1 = Trunc( X ); ST0 = Decimal( X )
35 F2XM1 ; ST1; ST0 = 2^( TempX * Log2(e)) - 1
FLD1 ; ST2; ST1 = 2^( TempX * Log2(e)) - 1
40 ; ST0 = 1
FADDP ST1 ; ST1; ST0 = 2^( TempX * Log2(e))
45 FSCALE ; ST1 = Trunc(x); ST0 = Resultado = ST0 *2^ ENT(X)
FSTP QWORD [Resul] ; Resul = ST0
184 Funcion exponencial
50 FINIT ; Borro el resto de la pila
MOV AX ,4C00HINT 21H ; Termino llamando al MSDOS
55 [SEGMENT DATOS ALIGN =16]TempX DQ 1.0 ; Valor de XResul RESQ 1 ; Resultado , tendra que salir 2’71..
[SEGMENT PILA STACK]60 RESW 512
Capıtulo D. Problemas FPU 185
D.3. Toma de decisiones
Enunciado
La operacion a realizar es:
if (X*Y>0)X=-Y;
elseX=X*Y;
Solucion
Listado D.3: Ejemplo de toma de decisiones1 [BITS 16]
[SEGMENT CODIGO]..start:
; La operacion a realizar es:;
6 ; If (X*Y)>0 Then X:=-Y Else X=X*Y;;
MOV AX,DATOSMOV DS,AX ; Inicio el Selector de Datos
11
FINIT
FLD QWORD [TempY] ; ST0 = TempY
FLD QWORD [TempX] ; ST1 = TempY16 ; ST0 = TempX
FMULP ST1 ; ST0 = TempY * TempX
FTST ; SW = TST( ST0 )21
FSTSW AX ; AX = SW
SAHF ; Flags = AHJBE Final
26
FINIT ; Inicia el Coprocesador (Borra ST)
FLD QWORD [TempY] ; ST0 = TempY
31 FCHS ; ST0 = - TempY
Final: FSTP QWORD [TempX] ; TempX = - TempY = -X*Y
MOV AX ,4C00H36 INT 21H ; Termino llamando al MSDOS.
[SEGMENT DATOS ALIGN =16]TempX DQ 10.0 ; Valor de XTempY DQ 20.0 ; Valor de Y
41
[SEGMENT PILA STACK]RESW 512
186 Factorial
D.4. Factorial
Enunciado
Hallar el factorial de un numero utilizando un algoritmo recursivo, y un algoritmo no
recursivo. Comprobad el tiempo empleado en el calculo de diferentes valores del factorial,
y comparad el tamano de los correspondientes programas, ası como el tiempo empleado
en realizar los programas.
Solucion
Listado D.4: Calculo del factorial; Test( 65536 veces hallar 99! )
2 ;; Recursivo : 489 centesimas; No recursivo : 0 centesimas;[BITS 16]
7
[SEGMENT CODIGO]..start:
MOV BX,DATOSMOV DS,BX ; Inicializo el Selector de Datos
12
MOV CX ,0@LOOP1:
CALL FACTORIAL ; Toma el valor N de la posicion de; memoria N, y devuelve el resultado
17 ; en RESUL.LOOP @LOOP1
MOV CX ,0@LOOP2:
22 CALL FACTNOREC ; Toma el valor de N y devuelve en; RESUL.
LOOP @LOOP2
MOV AX ,4C00h27 INT 21h ; Termina llamando al MSDOS
; ===============================; Factorial recursivo; ===============================
32
FACTORIAL:FINIT ; Inicio el copro
FLD qword [N] ; ST0 = N37 FTST ; Compruebo si es CERO
FSTSW AX ; Copio C0 , C1 , C2 , C3 , etc en AXSAHF ; Copia AH en FLAGSJNZ @NoEsCero
42
FFREE ST0 ; Elimino el valor ceroFLD1 ; El resultado sera 1.0
Capıtulo D. Problemas FPU 187
FSTP qword [RESUL] ; Lo guardo y salgo47 RET
@NoEsCero: ; Algoritmo RECURSIVOPUSH dword [DS:N ]PUSH dword [DS:N+4] ; Guardo el valor anterior de N
52
FLD1
FSUBP ST1
FSTP qword [N] ; Le resto uno y llamo a Factorial57
CALL FACTORIAL ; RESUL = FACT( N-1 )
POP dword [DS:N+4]POP dword [DS:N] ; Recupero el valor anterior de N
62
FLD qword [N]FLD qword [RESUL]
FMULP ST1 ; Obtengo FACT = N * FACT( N-1 )67
FSTP qword [RESUL] ; Lo guardo y salgoRET
; ===============================72 ; Factorial no recursivo
; ===============================
FACTNOREC:FLD qword [N]
77 FTST
FSTSW AX ; Comprueba si es ceroFINIT
SAHF
JNZ @NoEsCero282
FLD1
FSTP qword [RESUL] ; 0! = 1RET
87
@NoEsCero2:FLD1 ; Multiplicador = 1FLD qword [N] ; Valor de N
92 @BUCLE:FTST ; Compruebo la variableFSTSW AX
SAHF
JZ @SALIR ; Si la variable vale cero salgo97
FMUL ST1 ,ST0FLD1
FSUBP ST1
102 JMP @BUCLE
@SALIR:FSTP qword [RESUL]FSTP qword [RESUL]
107 RET
188 Factorial
[SEGMENT DATOS ALIGN =16]N DQ 4.0 ; Valor del que hallar el factorialRESUL DQ 1.0 ; Resultado
112
[SEGMENT PILA STACK]RESW 512
; Contenido de la pila (CRECE HACIA ABAJO)117 ; Ejemplo
;; , DIR 1 , <= RESUL = 3.0*2.0 = 6.0; => , ,; , <3.0> ,
122 ; , , <=; => , DIR 2 , <= X = 2.0 RESUL = 2.0*1.0 = 2.0; => , ,; , <2.0> ,; , , <=
127 ; => , DIR 2 , <= X = 1.0 RESUL = 1.0*1.0 = 1.0; => , ,; , <1.0> ,; , , <=; => , DIR 2 , X = 0.0 -----> RESUL = 1.0
Capıtulo D. Problemas FPU 189
D.5. Funciones trigonometricas hiperbolicas
Enunciado
Implementar en lenguaje ensamblador una subrutina en punto flotante que calcule
las siguientes funciones hiperbolicas y almacene los tres resultados en tres posiciones de
memoria SenH, CosH y TanH:
senh(x) =exp(x) − exp(−x)
2
cosh(x) =exp(x) + exp(−x)
2
tanh(x) =exp(x) − exp(−x)
exp(x) + exp(−x)
Solucion
Listado D.5: Funciones trigonometricas hiperbolicas[BITS 16][SEGMENT CODIGO]..start:
MOV AX,DATOS5 MOV DS,AX ; Inicio el selector de Datos
; Hallo Exp(x)
FLDL2E ; ST0 = Log2(e)10
FLD QWORD [TempX] ; ST1 = Log2(e); ST0 = TempX
FMULP ST1 ; ST0 = TempX * Log2(e) =: X15
FLD ST0 ; ST1 = X; ST0 = X
FRNDINT ; ST1 = X20 ; ST0 = Trunc(X)
FXCH ST1 ; ST1 = Trunc(X); ST0 = X
25 FSUB ST0 ,ST1 ; ST1 = Trunc(X); ST0 = Decimal(X)
F2XM1 ; ST1; ST0 = 2^( TempX * Log2(e)) - 1
30
FLD1 ; ST2; ST1 = 2^( TempX * Log2(e)) - 1; ST0 = 1
35 FADDP ST1 ; ST1; ST0 = 2^( TempX * Log2(e))
190 Funciones trigonometricas hiperbolicas
FSCALE ; ST1; ST0 = ST0* 2^ Trunc(ST1) = Exp(x)
40
FXCH ST1 ; ST1 = Exp(x); ST0 = Trunc(X)
FSTP QWORD [Temp] ; Elimino el valor45
; Hallo Exp(-x) = 1.0/ Exp(x)
FLD ST0 ; ST1 = Exp(x); ST0 = Exp(x)
50
FLD1 ; ST2 = Exp(x); ST1 = Exp(x); ST0 = 1.0
55 FDIVRP ST1 ; ST1 = Exp(x); ST0 = Exp(-x)
; Hallo Exp(x)+Exp(-x)
60 FLD ST1 ; ST2 = Exp(x); ST1 = Exp(-x); ST0 = Exp(x)
FLD ST1 ; ST3 = Exp(x)65 ; ST2 = Exp(-x)
; ST1 = Exp(x); ST0 = Exp(-x)
FADDP ST1 ; ST2 = Exp(x)70 ; ST1 = Exp(-x)
; ST0 = Exp(x) + Exp(-x)
FLD1 ; ST3 ..; ST0 = 1.0
75
FLD1 ; ST4 ..; ST1 = 1.0; ST0 = 1.0
80 FADDP ST1 ; ST3 ..; ST0 = 2.0
FDIVP ST1 ; ST2 ..; ST0 = (Exp(x) + Exp(-x))/2.0
85
FST QWORD [COSH]
FXCH ST2 ; ST2 = COSH(X); ST1 = Exp(-x)
90 ; ST0 = Exp(x)
FSUBRP ST1 ; ST1 = COSH(X); ST0 = Exp(x) - Exp(-x)
95 FLD1 ; ST2 ..; ST0 = 1.0
FLD1 ; ST3 ..; ST1 = 1.0
Capıtulo D. Problemas FPU 191
100 ; ST0 = 1.0
FADDP ST1 ; ST2 ..; ST0 = 2.0
105 FDIVP ST1 ; ST1 = COSH(X); ST0 = SINH(X)
FST QWORD [SINH]
110 FDIVRP ST1 ; ST = TANH(X)
FSTP QWORD [TANH]
MOV AX ,4C00H115 INT 21H ; Termino llamando al MSDOS
[SEGMENT DATOS ALIGN =16]TempX DQ 1.0 ; Valor de XSINH DQ 0.0 ; Valdr 1’1752
120 COSH DQ 0.0 ; Valdr 1.5430TANH DQ 0.0 ; Valdr 0’7615Temp DQ 0.0
[SEGMENT PILA STACK]125 RESW 512
192 Polinomios de Legendre
D.6. Polinomios de Legendre
Enunciado
La formula de recurrencia de los polinomios de Legendre es la siguiente:
Pn+1(x) =2n + 1
n + 1Pn(x) − n
n + 1Pn−1(x)
donde sabemos que:
P0(x) = 1
P1(x) = x
Se pide la programacion de una subrutina que calcule el valor del polinomio de Legen-
dre de orden n (natural) para un cierto valor real x.
Solucion
Listado D.6: Polinomios de Legendre[BITS 16][SEGMENT CODIGO]..start:
MOV BX,DATOS5 MOV DS,BX ; Inicializo el Selector de Datos
MOV CX ,3 ; Grado del polinomio de LEGENDRE
CALL LEGENDRE ; Toma el valor x de la posicion de10 ; memoria X, y devuelve el resultado
; en RESUL.MOV AX ,4C00hINT 21h ; Termina llamando la MSDOS
15 LEGENDRE:FINIT ; Inicio el copro
AND CX,CXJZ GRADO0 ; Si es de grado CERO salto
20
CMP CX ,1JNZ GRADO ; Si es de grado > 1 salto
FLD QWORD [X] ; El resultado es X25 FSTP QWORD [RESULT] ; Y lo almaceno
RET
GRADO0:FLD1 ; El resultado es 1.030 FSTP QWORD [RESULT] ; Y lo almaceno
RET
; Si el grado es mayor necesito un procedimiento recursivo.35
GRADO: DEC CX ; Hallo Pn(x)
Capıtulo D. Problemas FPU 193
PUSH CX
CALL LEGENDRE ; En RESULT esta Pn(X)40 POP CX
MOV WORD [N],CX ; Guardo N
FILD WORD [N]45 FLD ST0
FADDP ST1
FLD1
FADDP ST1 ; Hallo 2*N+1
50 FILD WORD [N]FLD1
FADDP ST1 ; Hallo N+1
FDIVP ST1 ; Hallo (2*N+1)/(N+1)55
FLD QWORD [RESULT]FMULP ST1
FSTP QWORD [RESULT] ; Hallo (2*N+1)/(N+1) * Pn(X)
60 PUSH WORD [DS:RESULT]PUSH WORD [DS:RESULT +2]PUSH WORD [DS:RESULT +4]PUSH WORD [DS:RESULT +6]
; Guardo el primer sumando en la pila65 PUSH CX
DEC CX
CALL LEGENDRE ; Halla Pn -1(x)POP CX
70 MOV WORD [N],CX ; Actualizo N
FILD WORD [N]FLD ST0FLD1
75 FADDP ST1
FDIVP ST1 ; Hallo N/(N+1)
FLD QWORD [RESULT]FMULP ST1 ; Hallo N/(N+1) * Pn -1(X)
80
POP WORD [DS:RESULT +6]POP WORD [DS:RESULT +4]POP WORD [DS:RESULT +2]POP WORD [DS:RESULT]
85 ; Recupero el primer sumandoFLD QWORD [RESULT]FSUBRP ST1 ; Hallo Pn(X)
FSTP QWORD [RESULT] ; Lo guardo y salgo90
RET
[SEGMENT DATOS ALIGN =16]X DQ 2.0 ; Valor de la X
95 RESULT DQ 0.0 ; Resultado P0 (2)=1.0; P1 (2)=2.0; P2 (2)=2.5; P3 (2)=2.83333..
194 Polinomios de Legendre
N DW 0100
[SEGMENT PILA STACK]RESW 512
Capıtulo D. Problemas FPU 195
D.7. Velocımetro
Enunciado
Un sistema basado en 8086 se utiliza para medir la velocidad con la que se desplaza
un vehıculo.
El sistema recibe una interrupcion INTR vectorizada (vector 100) cada segundo. En
ese momento puede leer del puerto de E/S (220h) una palabra que contiene el numero de
vueltas que ha dado la rueda del vehıculo durante ese tiempo.
Escribir el codigo y los organigramas necesarios para:
1o.- Inicializar el sistema para que la senal que llega a traves de la interrupcion vecto-
rizada 100, produzca un salto al servicio de interrupcion. Ademas deberemos actualizar la
variable RADIO (word) dada en centımetros, y la variable VELOCIDAD (0000:2000h word) dada
en km/h.
2o.- Realizar la subrutina de interrupcion para que calcule la velocidad a la que se
desplaza el vehıculo en km/h. Se pide hacer los calculos con la mayor precision posible y
despues almacenar el resultado redondeado como word en la variable VELOCIDAD.
Solucion
Listado D.7: Velocımetro[BITS 16]; Examen de Noviembre 1997 PROBLEMA 7[SEGMENT CODIGO]..start:
5 ; Inicio variables
mov ax ,VECTmov es ,axmov [es:2000h],ax ; Variable VELOCIDAD = 0
10
mov ax ,DATOSmov ds ,ax
mov ax ,40 ; El radio en centimetros15
mov [ds:RADIO],ax ; Lo actualizo
; Inicio vector de interrupciones
20 mov si ,100*4 ; Direccion del vector de interrupcion :; Segmento : 0; Desplazamiento : 100*4
cli ; Desactivo las int. vectorizadas25
mov ax ,CODIGOmov [es:si+2],ax ; Vector de interrupciones 100
; Primero el segmento
196 Velocımetro
mov ax,Inter30 mov [es:si],ax ; Segundo el desplazamieto
sti ; Activo las interrupciones vectorizadas
; Devuelvo el control al sistema operativo35 ; deberıa dejar el programa residente con la int 27h
mov ax ,4c00hint 21h
40 ; Servicio de interrupcion
Inter:; Guardo los registros
45 push ds
push ax
push bx
push cx
50 ; Leo el numero de vueltas
mov dx ,220hin ax,dx ; Leo el numero de vueltas (word)
55 mov bx,DATOSmov ds,bx
mov [ds:VUELT],ax ; Lo guardo en memoria para leerlo: con el coprocesador
60
; Guardo el estado del coprocesador
fsave [ds:COPRO]
65 ; Lo inicializo
finit
; Hago cuentas70
fild word [ds:VUELT] ; Obtengo las vueltas
fld1
fld1
75 faddp st1 ; Obtengo un 2
fmulp st1
fldpi ; Obtengo Pi80
fmulp st1
fild word [ds:RADIO] ; Obtengo el radio
85 fmulp st1
fld qword [ds:FACTOR] ; Obtengo el factor de conversion
fmulp st1
90
Capıtulo D. Problemas FPU 197
; Almaceno el resultado redondeado en la variable VELOCIDADpush ds
mov ax ,VECTmov ds ,ax
95 fistp word [ds :2000h]pop ds
; Recupero el estado del coprocesador
100 frstor [ds:COPRO]
; Recupero los registros
pop cx
105 pop bx
pop ax
pop ds
; Retorno de interrupcion110
iret
[SEGMENT DATOS ALIGN =16]RADIO DW 0 ; Radio en centimetros
115 VUELT DW 0 ; Numero de vueltasFACTOR DQ 0.36 ; Conversion de cm/seg a km/h
; Podrıa incluir el 2*Pi; y serıa mas rapido !!
120 COPRO RESW 54 ; Total 108 bytes
[SEGMENT VECT ABSOLUTE 0X0000]
[SEGMENT PILA STACK]125 RESW 512
198 Tecnica CORDIC
D.8. Tecnica CORDIC
Enunciado
La tecnica CORDIC (COordinate Rotation Digital Computer) ha sido muy utilizada
en las calculadoras cientıficas para implementar las funciones trigonometricas. La idea
que utiliza es que cualquier angulo puede descomponerse como:
θ = ±α0±α1±α2±...
para unos ciertos valores de angulos. En cada iteracion se escoge el signo mas o el
menos de forma que nos aproximemos cada vez mas al angulo. Llamando en cada iteracion
βi = ±α0±α1±.. ± αi puede ponerse βi = βi−1±αi , de donde:
sin(βi) = sin(βi−1) ∗ cos(αi)± cos(βi−1) ∗ sin(αi)
cos(βi) = cos(βi−1) ∗ cos(αi) ∓ sin(βi−1) ∗ sin(αi)
y los valores de cos(α) y sin(α) se toman de las tablas. Se parte de los valores iniciales
β = 0, cos(β) = 1,0, sin(β) = 0,0. En cada iteracion se suma o resta el angulo a para que
nos aproximemos al angulo dado, y calculamos el seno y coseno correspondientes mediante
las anteriores formulas.
Se piden los organigramas y programas en ensamblador para:
1o.- Generar las dos tablas de datos (angulos, coseno y seno del angulo) que seran
necesarias para obtener una precision de π/65536 (n=16). Los angulos a obtener estaran
en radianes y empezaran por π/2 y acabaran con π/2n. Para ello realizar una subrutina
que sea llamada desde el programa principal y que haga uso de las funciones trigonometri-
cas del coprocesador matematico. La segunda tabla tendra en cada entrada los valores
calculados para el coseno y para el seno.
2o.- Haciendo uso de las tablas y del coprocesador matematico se pide realizar una
subrutina que aplique la tecnica CORDIC para calcular los valores del SENO y del CO-
SENO de un angulo real (qword) dado en la variable de memoria X y los resultados se
almacenan en COS y SIN (qword´s) tambien en memoria.
Solucion
Listado D.8: Tecnica CORDIC: Programa principal.#include <stdio.h>#include <math.h>
extern void IniciaTablas(void);extern void HallaSenoYCoseno(double ,double*,double *);
Capıtulo D. Problemas FPU 199
int main(){double angulo , seno , coseno;IniciaTablas ();
angulo = M_PI /8;printf("--\n");for(angulo=-M_PI; angulo <=M_PI; angulo=angulo+M_PI /360){
HallaSenoYCoseno(angulo , &seno , &coseno );// if(fabs(seno -sin(angulo )) >0.0001)
printf("Angulo=␣ %9lf ,␣Seno␣=␣ %9lf␣( %9lf),␣Coseno␣=␣ %9lf␣( %9lf)\n",angulo , seno , seno -sin(angulo), coseno , coseno -cos(angulo ));
}return 0;
}
Listado D.9: Tecnica CORDIC: Rutinas ensamblador[BITS 32][SECTION .text]
3 ;==========================================================================[GLOBAL _IniciaTablas]_IniciaTablas: ; El selector DS apunta a .data y .bss
MOV ESI ,ANGLESMOV EDI ,COSINE ; Apunto a las tablas
8 MOV ECX ,16 ; Numero total de entradas
FINIT ; Inicializa el Coprocesador
FLDPI ; ST = Pi13 FLD1
FLD1
FADDP ST1 ; ST = 2.0, ST(1) = Pi
@Bucle:18 FDIV ST1 ,ST0 ; 2.0 Pi/2
FLD ST1
FST QWORD [ESI] ; Guarda el valor del angulo (radianes)ADD ESI ,8 ; Apunta al siguiente angulo
23
FSINCOS ; Calcula el seno y el coseno
FSTP QWORD [EDI]ADD EDI ,8 ; Guarda el coseno
28 FSTP QWORD [EDI]ADD EDI ,8 ; Guarda el seno
LOOP @Bucle ; Repite hasta rellenar las tablasRET ; Fin de la inicializacion
33 ;==========================================================================[GLOBAL _HallaSenoYCoseno]%define ANGULO EBP+8%define SENO EBP +16%define COSENO EBP +20
38 _HallaSenoYCoseno:PUSH EBP
MOV EBP ,ESP ; PrologoPUSHA
200 Tecnica CORDIC
43 FINIT ; Inicio el coprocesador
MOV ESI ,ANGLESMOV EDI ,COSINE ; Inicializo los punteros a las tablas
48 FLDZ ; Acumulador a ceroFLD1 ; El coseno de ceroFLDZ ; El seno de cero
; ST0 = 0 sin(beta) : sb53 ; ST1 = 1 cos(beta) : cb
; ST2 = 0 beta : b
MOV ECX ,16 ; ST0 ST1 ST2 ST3 ST4@Buc: FLD QWORD [EDI] ; ci sb cb b
58 FMUL ST0 ,ST1 ; ci*sb sb cb b
FLD QWORD [EDI] ; ci ci*sb sb cb bFMUL ST0 ,ST3 ; ci*cb ci*sb sb cb b
63 ADD EDI ,8 ; Incremento puntero cos ,sin
FLD QWORD [EDI] ; si ci*cb ci*sb sb cb bFMUL ST0 ,ST3 ; si*sb ci*cb ci*sb sb cb b
68 FLD QWORD [EDI] ; si si*sb ci*cb ci*sb sb cbb
FMUL ST0 ,ST5 ; si*cb si*sb ci*cb ci*sb sb cbb
ADD EDI ,8 ; Incremento puntero cos ,sin
73 FLD QWORD [ANGULO] ; b si*cb si*sb ci*cb ci*sb sbcb b
FCOMP ST7 ; Comparo ANGULO con beta y elimino ANGULO
FSTSW AX
SAHF ; Le paso el resultado al procesador78 JZ @Coincide
JBE @Below; ST0 ST1 ST2 ST3 ST4
FADDP ST3 ,ST0 ; si*sb ci*cb ci*sb sb cb b; +si*cb
83 FSUBP ST1 ,ST0 ; ci*cb ci*sb sb cb b;-si*sb ,+si*cb
FLD QWORD [ESI] ; ai ci*cb ci*sb sb cb b; -si*sb ,+si*cb
FADDP ST5 ,ST0 ; ci*cb ci*sb sb cb b+ai88 ;-si*sb ,+si*cb
JMP @Cont@Below:
; ST0 ST1 ST2 ST3 ST493 FSUBP ST3 ,ST0 ; si*sb ci*cb ci*sb sb cb b
; -si*cbFADDP ST1 ,ST0 ; ci*cb ci*sb sb cb b
;+si*sb ,+si*cbFLD QWORD [ESI] ; ai ci*cb ci*sb sb cb b
98 ; +si*sb ,+si*cbFSUBP ST5 ,ST0 ; ci*cb ci*sb sb cb b-ai
;+si*sb ,+si*cb
Capıtulo D. Problemas FPU 201
@Cont: FXCH ST3 ; Actualiza sin(beta)103 FSTP QWORD [TEMP] ; viejo sin(beta) fuera
FXCH ST1 ; Actualiza cos(beta)FSTP QWORD [TEMP] ; viejo cos(beta) fuera
ADD ESI ,8 ; Incremento el puntero de angulos108
LOOP @Buc
@YaEsta: ; ST0 ST1 ST2 ST3 ST4MOV ESI ,[SENO] ; sb cb b-ai
113 MOV EDI ,[ COSENO]FSTP QWORD [ESI] ; cb b-aiFSTP QWORD [EDI] ; b-aiFSTP qword [TEMP] ; -
118 POPA
POP EBP ; Ep¡logoRET ; FIN
@Coincide:123 FINIT
FLD1 ; 1FLD QWORD [EDI -16] ; cb 1FLD QWORD [EDI - 8] ; sb cb 1JMP @YaEsta
128
[SECTION .data]
[SECTION .bss]ANGLES RESQ 16 ; En radianes
133 COSINE RESQ 16*2 ; Guarda las parejas COS , SINTEMP RESQ 1
202 Calculo del arco tangente
D.9. Calculo del arco tangente
Enunciado
Se nos ha pedido realizar en ensamblador una subrutina que calcule el valor del
arctan(x) a partir de su desarrollo en serie de Taylor:
arctan(x) =∑∞
k=0 X(k) =∑∞
k=0(−1)kx2k+1
2k+1= x − x3
3+ x5
5− ...
siempre que |x| ≤ 1. Se nos pide que lo hagamos usando el algoritmo denominado
sumalt, que obtiene una alta precision sumando solamente los n primeros terminos de las
series con sumando alternados (sumados y restados) cuya descripcion en un lenguaje de
alto nivel es la siguiente, y que se debe a Cohen, Villegas y Zagier:
double sumalt_arctan_c(double x, int n){double d, c, s, b, X, X_k;int k, i;
d = 1.0;for( k=0; k<n; k++) d = d * 5.828427125;
d = (d+1/d)/2;b = 1.0;c = d;s = 0.0;for( k=0; k<n; k++){X = 1.0; for(i=0;i<2*k+1;i++) X = X * x;if(k&1==1) X=-X; // Si k impar termino negativoX_k = X/(2*k+1); // Halla X(k)c = c - b;s = s + c * X_k;b = b * (2*(n+k)*(n-k))/((2*k+1)*(k+1));
}return s/d;
};
La subrutina podra ser llamada desde C. Escrıbela en ensamblador de Pentium 4
utilizando la unidad de punto flotante. Recuerda que los datos de retorno en C vuelven
en el registro EAX si en entero o en ST0 si es un numero en punto flotante.
Solucion
El programa serıa el siguiente:
[BITS 32][GLOBAL _sumalt_arctan][SECTION .text]%define x [ebp +8]
5 %define N [ebp +16]
_sumalt_arctan:push ebp
mov ebp ,esp ; Prologo C10 pushad
Capıtulo D. Problemas FPU 203
finit ; ST0 ST1 ST2 ...fld1 ; 1.0mov ecx ,N
15 @BucN: fmul qword [Cte1]loop @BucN
; dfld st0 ; d dfld1 ; 1.0 d d
20 fdivrp st1 ; 1/d dfaddp st1 ; d+1/dfld qword [Dos] ; 2.0 d+1/dfdivp st1 ; d_nuevo
25 fld1 ; b=1 dfld st1 ; c=d b=1 dfldz ; s=0 c=d b=1 dfldz ; k=0 s=0 c=d b=1 dmov ecx ,N
30 @BucN_2:; Hallo 2k+1fld st0 ; kfadd st0 ; 2kfld1 ; 1 2k
35 faddp st1 ; 2k+1fist dword [DosKmas1]
; Hallo x^{2k+1}
40 mov ebx ,[ DosKmas1]fld1 ; 1.0 2k+1 .. total 7 regs
@BucN_3:fmul qword x ;dec ebx
jnz @BucN_345 ; x^{2k+1} 2k+1 ...
fdivrp st1 ; x^{2k+1}/(2k+1}, k , s, c, b, dfld st1 ; k, x^{2k+1}/(2k+1}, k , s, c, b, dfistp dword [Temp]; x^{2k+1}/(2k+1}, k , s, c, b, d
50 bt dword[Temp],0 ;jnc @NoCambiaSignofchs ; -x^{2k+1}/(2k+1}, k , s, c, b, d
@NoCambiaSigno:55 fxch st0 ,st3 ; c, k , s, -x^{2k+1}/(2k+1}, b, d
fsub st4 ; c-b, k , s, -x^{2k+1}/(2k+1}, b, dfxch st0 ,st3 ; -x^{2k+1}/(2k+1}, k , s, c_nuevo , b, d
fld st3 ; c, ***, k, s, c, b, d60 fmulp st1 ; c*X, k, s, c, b, d
faddp st2 ; k, s_nuevo , c, b, d
; Hallo 2k+1fld st0 ; k ...
65 fadd st0 ; 2k ...fld1 ; 1 2k ...faddp st1 ; 2k+1 ...
70 fld1 ; 1, 2k+1, k, s, c, b, dfadd st2 ; k+1, 2k+1, k, s, c, b, dfmulp st1 ; den , k, s, c, b, d
204 Calculo del arco tangente
fld qword [Dos] ; 2.0, den , k, s, c, b, dfdivrp st1 ; 2/den , k, s, c, b, d
75 fmulp st4 ,st0 ; k, s, c, b_nuevo , dfild dword N ; N, k, s, c, b, dfild dword N ; N, N, k, s, c, b, dfadd st2 ; N+k, N, k, s, c, b, dfxch st0 ,st1
80 fsub st2 ; N+k, N-k, k, s, c, b, dfxch st0 ,st1fmulp st1 ; num , k, s, c, b, dfmulp st4 ; k, s, c, b, d,fld1
85 faddp st1 ; k_nuevo s c, b, d
loop @BucN_2
fxch st0 ,st1 ; s k c b d90 fdiv st4 ; s/d ...
fstp qword [Temp]finit
fld qword [Temp]95
popad
pop ebp ; Epilogoret
100 [SECTION .data]; El segmento .data en C es apuntado por DS , luego no es necesario; hacer que DS apunte aquiCte1 dq 5.828427125 ; 3*sqrt (8)Dos dq 2.000000000
105 DosKmas1dd 0
Temp dq 0.0
El programa en C para probarlo:
#include <stdio.h>
3 extern double sumalt_arctan(double x, int n);
double sumalt_arctan_c(double x, int n){double d, c, s, b, X, X_k;
8 int k, i;
/* d = (3+ sqrt (8))^n = 5.828427125^n, que se puede hacer asi */d = 1.0;for( k=0; k<n; k++) d = d * 5.828427125;
13
d = (d+1/d)/2;b = 1.0;c = d;s = 0.0;
18 for( k=0; k<n; k++){X = 1.0; for(i=0;i<2*k+1;i++) X = X * x;if(k&1==1) X=-X; // Si k impar termino negativoX_k = X/(2*k+1); // Halla X(k)
23 c = c - b;s = s + c * X_k;
Capıtulo D. Problemas FPU 205
b = b * (2*(n+k)*(n-k))/((2*k+1)*(k+1));}
return s/d;28 };
int main(){
double x;33 int n;
x=0.5; // Por ejemplo
// Comparo la funcion atan() de C con la version sumalt_arctan_C ()38 // del algoritmo escrito en C, con la version sumalt_arctan ()
// del algoritmo escrito en ensamblador.
for(n=2;n <=16;n++)printf(" %2d␣ %10f␣ %10f␣ %10f␣ %15e\n",
43 n, (double) atan(x), sumalt_arctan(x,n), sumalt_arctan_c(x,n),atan(x)-sumalt_arctan(x,n) );
}
Y el fichero makefile:
# Compilado desde CygWin (Windows XP)
atan.exe.exe: atan.c atan.asmnasm -fwin32 -g atan.asm -o atan_asm.o
5 gcc -c -g atan.cgcc atan.o atan_asm.o
206 Calculo del arco tangente
Apendice E
3D Now!
La tecnologıa AMD 3D Now! provee 21 instrucciones adicionales para mejorar el ren-
dimiento de las aplicaciones que manejan graficos 3D y procesamiento de audio, ademas
de las instrucciones MMX, que tambien soporta. Estas instrucciones operan sobre los re-
gistros MMX de 64 bits, divididos en dos numeros de 32 bits de precision simple (punto
flotante) que son compatibles con la norma IEEE-754.
FEMMS. Idem EMMS de MMX.
PAVGUSB mmreg1, mmreg2/mem64. Calcula el promedio entre paquetes sin signo de 8 bits.
PF2ID mmreg1, mmreg2/mem64. Convierte operandos de punto flotante a un entero de
32 bits.
PFACC mmreg1, mmreg2/mem64. Acumula los dos words de cada operando en el operando
destino.
PFADD mmreg1, mmreg2/mem64. Suma de punto flotante con 24 bits significativos.
PFCMPEQ mmreg1, mmreg2/mem64. Si mmreg1 = mmreg2/mem64 devuelve todos unos
sino todos ceros.
PFCMPGE mmreg1, mmreg2/mem64. Si mmreg1 >= mmreg2/mem64 devuelve todos unos
sino todos ceros.
PFCMPGT mmreg1, mmreg2/mem64. Si mmreg1 > mmreg2/mem64 devuelve todos unos
sino todos ceros.
PFMAX mmreg1, mmreg2/mem64. Retorna el maximo entre los dos operandos.
PFMIN mmreg1, mmreg2/mem64. Retorna el mınimo entre los dos operandos.
207
208
PFMUL mmreg1, mmreg2/mem64. Realiza la multiplicacion entre los dos operandos.
PFRCP mmreg1, mmreg2/mem64. Devuelve una aproximacion del recıproco al numero en
el operando fuente.
PFRCPIT1 mmreg1, mmreg2/mem64. Realiza un paso intermedio de la operacion anterior.
PFRCPIT2 mmreg1, mmreg2/mem64. Completa la operacion anterior, para generar el mis-
mo resultado que PFRCP.
PFRSQIT1 mmreg1, mmreg2/mem64. Realiza un paso intermedio de la operacion PFSQRT.
PFSQRT mmreg1, mmreg2/mem64. Devuelve una aproximacion del recıproco de la raız
cuadrada del numero.
PFSUB mmreg1, mmreg2/mem64. Realiza la resta de punto flotante entre los operandos
(op1=op1-op2).
PFSUBR mmreg1, mmreg2/mem64. Realiza la resta inversa al anterior (op1=op2-op1).
PI2FD mmreg1, mmreg2/mem64. Transforma un entero de 32 bits en un dato de punto
flotante.
PMULHRW mmreg1, mmreg2/mem64. Aproxima la multiplicacion de los datos en los ope-
randos y devuelve los 16 bits mas altos.
PREFETCH(W) mem8. Carga la lınea de la memoria cache de procesamiento apuntada
por mem8 en la cache de datos.
Apendice F
Extensiones SSE: Streaming SIMDExtensions
F.1. Introduccion
Estas extensiones fueron introducidas en la arquitectura Intel de 32 bits a partir del
Pentium III (Febrero de 1999, fabricado con tecnologıa de 250 nm). Extienden el modelo
SIMD presente en la tecnologıa MMX anadiendo recursos para manejar vectores o esca-
lares de numeros en punto flotante de precision sencilla contenidos en registros de 128
bits.
Las extensiones consisten en:
Se incorporan 8 registros (XMM0..XMM7) de 128 bits que solamente pueden trabajar
con vectores de 4 elementos de punto flotante de precision sencilla1.
XMM7
XMM6
XMM5
XMM4
XMM3
XMM2
XMM1
XMM0
127 0
El registro MXCSR de 32 bits que proporciona bits de estado y control para las opera-
ciones realizadas con los registros XMM.
1Las extensiones SSE2 permitiran su uso como vectores de datos en punto flotante de precision doble
209
210 Conjunto de instrucciones
31 16
Overflow MaskDivide-by-Zero Mask
Denormal Operation Mask
Invalid Operation MaskDenormals Are Zeros*
Precision FlagUnderflow Flag
Underflow Mask
Flush to Zero
Rounding Control
15 1314 12 11 10 9 8 7 6 5 4 3 2 1 0
Precision Mask
Overflow FlagDivide-by-Zero Flag
Denormal FlagInvalid Operation Flag
FZ
RC
PM
ZE
OE
UE
PE
IM
DM
ZM
OM
UMReserved
D
E EID
AZ
* The denormals-are-zeros flag was introducedin the Pentium 4 and Intel Xeon processor.
Un tipo de datos vectorial de 4 elementos de punto flotante de precision sencilla.
0127
Contains 4 Single-Precision Floating-Point Values
64 63 31329596
Conjunto de instrucciones (70) que operan sobre los datos de los registros XMM y
una extension a las que trabajan con los registros MMX. Ademas otras que trabajan
con el nuevo registro MXCSR y otras referidas a la gestion de la memoria cache del
sistema.
Para activar las extensiones:
Se comprueba su presencia mediante la instruccion CPUID
Se activa la bandera CR4.OSFXSR.
Se activa la bandera CR4.OSXMMEXCPT.
Se establecen los bits mascara y banderas en el registro MXCSR de acuerdo con el
modo de operacion que se quiera para las instrucciones SSE/SSE2/SSE3 SIMD en
punto flotante.
F.2. Conjunto de instrucciones
F.2.1. Transferencia de datos
MOVAPS / MOVUPS Copia de 128 bits, alineados (A) o no alineados (U) en memoria.
MOVHPS / MOVLPS Copia de 64 bits de la parte alta o de la parte baja, respectivamente.
Capıtulo F. Extensiones SSE: Streaming SIMD Extensions 211
MOVHLPS / MOVLHPS Copia de 64 bits entre las partes alta y baja, y viceversa.
MOVMSKPS Extrae el signo de 4 paquetes en memoria (32 bits).
MOVSS Copia de 32 bits.
F.2.2. Aritmeticas
ADDPS / SUBPS Suma/Resta de cuatro paquetes de datos.
ADDSS / SUBSS Suma/Resta de un paquete de datos.
MULPS / DIVPS Multiplicacion/Division de cuatro paquetes de datos.
MULSS / DIVSS Multiplicacion/Division de un paquete de datos.
RCPPS Realiza la operacion 1/Fuente para cuatro paquetes de datos. El error relativo
cometido va a ser menor o igual que 1,52−12.
RCPSS Igual que el anterior pero para un unico paquete de datos.
SQRTPS / SQRTSS Raız cuadrada de cuatro o de un paquete de datos respectivamente.
RSQRTPS / RSQRTSS Inversa de raız cuadrada de cuatro o de un paquete de datos,
respectivamente.
MAXPS / MAXSS Calculo del maximo entre registros para cuatro o para un paquete de
datos, respectivamente.
MINPS / MINSS Calculo del mınimo entre registros para cuatro o para un paquete de
datos, respectivamente.
F.2.3. De comparacion
CMPPS / CMPSS Comparacion para cuatro o para un paquete de datos a traves de un
entero de 8 bits.
COMISS / UCOMISS Comparacion ordenada/desordenada modificando los flags.
212 Conjunto de instrucciones
F.2.4. De entremezclado y empaquetamiento
SHUFPS Entremezclado de paquetes de datos a traves de un entero de 8 bits.
X3 X2 X1 X0
Y3 Y2 Y1 Y0
Y3 ... Y0 Y3 ... Y0 X3 ... X0 X3 ... X0
DEST
SRC
DEST
UNPCKHPS / UNPCKLPS Desempaqueta y entremezcla partes altas y partes bajas, res-
pectivamente.
X3 X2 X1 X0
Y3 Y2 Y1 Y0
Y3 X3 Y2 X2
DEST
SRC
DEST
F.2.5. Logicas
ANDPS AND logico.
ANDNPS NOT destino AND fuente.
ORPS OR logico.
XORPS XOR logico.
F.2.6. De conversion
CVTPI2PS / CVTPS2PI Convierte un paquete de dos dword a punto flotante de simple
precision y viceversa.
CVTSI2SS / CVTSS2SI Convierte un dword a punto flotante de simple precision y vi-
ceversa.
CVTTPS2PI Convierte un paquete de dos datos expresados en punto flotante de simple
precision en enteros de tamano dword usando truncamiento.
Capıtulo F. Extensiones SSE: Streaming SIMD Extensions 213
CVTTSS2SI Convierte un dato expresado en punto flotante de simple precision en
entero de tamano dword usando truncamiento.
F.2.7. De administracion del registro de estado (MXCSR)
LDMXCSR Carga el registro MXCSR desde memoria.
STMXCSR Salva el registro MXCSR en memoria.
F.2.8. Instrucciones con enteros
PAVGB / PAVGW Calculo de la media de datos enteros de tamano byte (B) y word (W),
respectivamente.
PEXTRW Extraccion de una palabra de un registro a traves de un numero inmediato
de 8 bits.
PINSRW Insercion de una palabra a traves de un numero inmediato de 8 bits.
PMAXUB Devuelve el maximo, comparando enteros sin signo de tamano byte.
PMAXSW Devuelve el maximo, comparando enteros con signo de tamano palabra.
PMINUB Devuelve el mınimo, comparando enteros sin signo de tamano byte.
PMINSW Devuelve el maximo, comparando enteros con signo de tamano palabra.
PMOVMSKB Copia de una mascara de byte.
PMULHUW Multiplica paquetes de datos enteros de tamano palabra sin signo y almacena
la parte alta de la multiplicacion.
X3 X2 X1 X0
Z3 = X3 ∗ Y3 Z2 = X2 ∗ Y2 Z1 = X1 ∗ Y1 Z0 = X0 ∗ Y0
SRC
DEST
DEST
Y3 Y2 Y1 Y0
TEMP
Z3[31-16] Z2[31-16] Z1[31-16] Z0[31-16]
PSADBW Suma de las diferencias absolutas.
214 Conjunto de instrucciones
X3 X2 X1 X0SRC
DEST
TEMP
X4X5X6X7
Y3 Y2 Y1 Y0Y4Y5Y6Y7
ABS(X0-Y0)ABS(X7-Y7) ABS(X6-Y6) ABS(X5-Y5) ABS(X4-Y4) ABS(X3-Y3) ABS(X2-Y2) ABS(X1-Y1)
DEST 00H 00H00H00H00H00H SUM(TEMP7...TEMP0)
PSHUFW Desempaquetado y entremezclado a traves de un numero inmediato de 8 bits.
X3 X2 X1 X0SRC
DEST Y3 Y2 Y1 Y0
ORDER00B - X001B - X110B - X211B - X3
Encodingof Fields in
ORDER01234567
Operand
F.2.9. Otras instrucciones
MASKMOVQ Escribe los bytes seleccionados en memoria a traves de una mascara.
MOVNTQ Mueve una qword desde un registro a memoria directamente.
MOVNTPS Mueve cuatro paquetes de datos en punto flotante de simple precision desde
un registro a memoria directamente.
PREFETCHh Movimiento de datos entre caches usando T0(datos temporales), T1 (datos
temporales respecto al primer nivel de cache), T2 (datos temporales respecto al
segundo nivel de cache) o NTA (datos no temporales respecto a todos niveles de
cache).
SFENCE Serializa operaciones de memoria.
Apendice G
Extensiones SSE2: Streaming SIMDExtensions 2
G.1. Introduccion
Este conjunto de instrucciones aparecieron en diciembre de 2000 (Pentium 4 Netburst,
fabricado con la tecnologıa de 180 nm) operan con paquetes de datos en punto flotante de
doble precision localizados en registros XMM o en memoria. En total son 144 instrucciones
nuevas.
128-Bit Packed Word Integers
128-Bit Packed Byte Integers
128-Bit Packed DoublewordIntegers
0127
0127
0127
0127
0127
128-Bit Packed Quadword Integers
128-Bit Packed Double- Precision Floating-Point
64 63
G.2. Conjunto de instrucciones
G.2.1. Transferencia de datos
MOVAPD / MOVUPD Copia de 128 bits, alineados (A) o no alineados (U) en memoria.
MOVHPD / MOVLPD Copia de 64 bits de la parte alta o de la parte baja, respectivamente.
MOVHLPD / MOVLHPD Copia de 64 bits entre las partes alta y baja, y viceversa.
MOVMSKPD Extrae el signo de 4 paquetes en memoria (32 bits).
215
216 Conjunto de instrucciones
MOVSD Copia de 64 bits.
G.2.2. Aritmeticas
ADDPD / SUBPD Suma/Resta de dos paquetes de datos.
ADDSD / SUBSD Suma/Resta de un paquete de datos.
MULPD / DIVPD Multiplicacion/Division de dos paquetes de datos.
MULSD / DIVSD Multiplicacion/Division de un paquete de datos.
SQRTPD / SQRTSD Raız cuadrada de dos o de un paquete de datos respectivamente.
MAXPD / MAXSD Calculo del maximo entre registros para dos o para un paquete de
datos, respectivamente.
MINPD / MINSD Calculo del mınimo entre registros para dos o para un paquete de
datos, respectivamente.
G.2.3. De comparacion
CMPPD / CMPSD Comparacion para cuatro o para un paquete de datos a traves de un
entero de 8 bits.
COMISD / UCOMISD Comparacion ordenada/desordenada modificando los flags.
G.2.4. De entremezclado y empaquetamiento
SHUFPD Entremezclado de paquetes de datos a traves de un entero de 8 bits.
X3 X2 X1 X0
Y3 Y2 Y1 Y0
Y3 ... Y0 Y3 ... Y0 X3 ... X0 X3 ... X0
DEST
SRC
DEST
UNPCKHPD / UNPCKLPD Desempaqueta y entremezcla partes altas y partes bajas, res-
pectivamente.
Capıtulo G. Extensiones SSE2: Streaming SIMD Extensions 2 217
X3 X2 X1 X0
Y3 Y2 Y1 Y0
Y3 X3 Y2 X2
DEST
SRC
DEST
G.2.5. Logicas
ANDPD AND logico.
ANDNPD NOT destino AND fuente.
ORPD OR logico.
XORPD XOR logico.
G.2.6. De conversion
CVTPS2P
ICVTTPS2DQ
CVTD
Q2P
S
CVTP
I2PS
CV
TP
D2P
S
CV
TP
S2P
D
CVTP
D2D
QCVTD
Q2P
D
CVTTPD2PI
CVTP
I2PD
CVTSS2S
I
CVTSI2SS
CVTS
I2SD
CVTTS
D2S
I
CV
TS
D2S
S
CV
TS
S2S
D
CVTPS2DQ
4 Doubleword
Integer (XMM)
Double-PrecisionFloating-Point
DoublewordInteger (r32)
2 DoublewordInteger (MM)
Single-PrecisionFloating Point
CVTS
D2S
I
CVTPD2PI CVTTP
D2D
Q
CVTTPS2P
ICVTTSS2S
I
2 Doubleword
Integer (XMM)
CVTPD2PI / CVTPI2PD Convierte un paquete de dos datos en expresados en punto
flotante de doble precision en enteros de tamano dword y viceversa.
CVTTPD2PI Convierte un paquete de dos datos en expresados en punto flotante de
doble precision en enteros de tamano dword con truncamiento.
218 Conjunto de instrucciones
CVTPD2DQ / CVTDQ2PD Convierte un paquete de dos datos en expresados en punto
flotante de doble precision en enteros de tamano qword y viceversa.
CVTTPD2DQ Convierte un paquete de dos datos en expresados en punto flotante de
doble precision en enteros de tamano qword con truncamiento.
CVTPD2PS / CVTPS2PD Convierte un paquete de dos datos expresados en punto flotante
de doble precision en dos datos expresados en punto flotante de simple precision y
viceversa.
CVTSD2SS / CVTSS2SD Convierte un dato en expresado en punto flotante de doble
precision en un dato expresado en punto flotante de simple precision y viceversa.
CVTSD2SI / CVTSI2SD Convierte un dato expresado en punto flotante de doble preci-
sion en un entero de tamano dword y viceversa.
CVTTSD2SI Convierte un dato expresado en punto flotante de doble precision en un
entero de tamano dword con truncamiento.
G.2.7. Instrucciones con paquetes de datos en punto flotante desimple precision
CVTPS2DQ / CVTDQ2PS Convierte un paquete de cuatro datos expresados en punto flo-
tante de simple precision en enteros de tamano dword y viceversa.
CVTTPS2DQ Convierte un paquete de cuatro datos expresados en punto flotante de
simple precision en enteros de tamano dword con truncamiento.
G.2.8. Instrucciones con enteros
MOVDQA / MOVDQU Copia de 128 bits, alineados (A) o no alineados (U) en memoria.
MOVQ2DQ / MOVDQ2Q Copia de 64 bits entre registros MMX y XMM y viceversa.
PMULUDQ Multiplica datos enteros sin signo de tamano dword.
PADDQ Suma de paquete de datos de enteros de tamano qword con y sin signo.
PSUBQ Resta de paquete de datos de enteros de tamanp qword con y sin signo.
PSHUFLW / PSHUFHW Desempaquetado y entremezclado de partes bajas y de las par-
tes altas respectivamente, de enteros de tamano palabra, a traves de un numero
inmediato de 8 bits.
Capıtulo G. Extensiones SSE2: Streaming SIMD Extensions 2 219
PSHUFD Desempaquetado y entremezclado de enteros de tamano dword a traves de
un numero inmediato de 8 bits.
PSLLDQ Desplazamiento logico en bytes hacia la derecha.
PSRLDQ Desplazamiento logico en bytes hacia la izquierda.
PUNPCKHQDQ / PUNPCKLQDQ Desempaquetado y entremezclado de las partes altas y bajas
respectivamente, de enteros de tamano qword.
220 Conjunto de instrucciones
Apendice H
Extensiones SSE3: Streaming SIMDExtensions 3
H.1. Introduccion
Este conjunto de instrucciones operan con paquetes de datos enteros, con paquetes de
datos en punto flotante de simple precision o con paquetes de datos en doble precision
localizados en registros XMM, que incluyen ademas el procesamiento en paralelo de ins-
trucciones. Aparecieron en febrero de 2004 incorporandose a los Pentium 4 fabricados con
tecnologıa de 90 nm. En total se anaden 13 instrucciones nuevas.
H.2. Conjunto de instrucciones
H.2.1. De carga o de movimiento o de duplicado
MOVSHDUP Copia o mueve 128 bits, duplicando la segunda y la cuarta doble palabra
del registro fuente. Trabaja con datos de 32 bits, tanto enteros de tamano dword
como datos en punto flotante de simple precision.
MOVSLDUP Copia o mueve 128 bits, duplicando la primera y la tercera doble palabra
del registro fuente. Trabaja con datos de 32 bits, tanto enteros de tamano dword
como datos en punto flotante de simple precision.
MOVDDUP Copia o mueve 128 bits, duplicando los 64 bits de la fuente. Trabaja con
datos de 64 bits, tanto enteros de tamano qword como datos en punto flotante de
doble precision.
H.2.2. De suma o resta
ADDSUBPD Suma/resta de 64 bits para paquetes de datos expresados en punto flotante
de doble precision.
221
222 Conjunto de instrucciones
ADDSUBPS Suma de la segunda y de la cuarta doble palabra y resta de la primera y
de la tercera doble palabra para paquetes de datos expresados en punto flotante de
simple precision.
H.2.3. De suma o resta en procesamiento paralelo
HADDPD Suma de datos, expresados en punto flotante de doble precision, en paralelo.
HADDPS Suma de datos, expresados en punto flotante de simple precision, en paralelo.
HSUBPD Resta de datos, expresados en punto flotante de doble precision, en paralelo.
HSUBPS Resta de datos, expresados en punto flotante de simple precision, en paralelo.
Apendice I
Extensiones SSE3 suplementarias:Supplemental Streaming SIMDExtensions 3
I.1. Introduccion
Disponibles a partir de julio de 2006 en circuitos fabricados con tecnologıa de 65 nm
como el Intel Xeon 5100 o el Intel Core 2 Duo. Incorpora 32 nuevas instrucciones, que
incluyen alineamientos y multiplicacion y suma, para conseguir aumentar aun mas el ren-
dimiento.
SSSE3 instructions include:
• Twelve instructions that perform horizontal addition or subtraction operations.
• Six instructions that evaluate the absolute values.
• Two instructions that perform multiply and add operations and speed up the
evaluation of dot products.
• Two instructions that accelerate packed-integer multiply operations and produce
integer values with scaling.
• Two instructions that perform a byte-wise, in-place shuffle according to the
second shuffle control operand.
• Six instructions that negate packed integers in the destination operand if the
signs of the corresponding element in the source operand is less than zero.
• Two instructions that align data from the composite of two operands.
The operands of these instructions are packed integers of byte, word, or double word
sizes. The operands are stored as 64 or 128 bit data in MMX registers, XMM registers,
or memory.
The instructions are discussed in more detail in the following paragraphs.
223
224 Introduccion
Apendice J
Extensiones SSE4: Streaming SIMDExtensions 4
J.1. Introduccion
Previstas a partir de 2008 para micros fabricados con tecnologıa de 45 nm (codenamed
Penryn). Incorporara sobre 50 instrucciones nuevas.
225
226 Introduccion
Sub Group Instructions Description Expected Application BenefitsPacked DWORD Multiplies PMULLD, PMULDQ New support for four signed or unsigned 32x32
bit multiplications per instruction, as well assigned forms of 32x32->64 multiplication.
Broadly useful for improved automated compiler vectorization of data processing written in highlevel languages (like C and Fortran).
Floating Point Dot Product
DPPS, DPPD Improved performance for AOS (Array of Structs)data processing through support for single anddouble-precision dot products.
3-D content creation, gaming, and support forlanguages like CG and HLSL.
Packed Blending BLENDPS, BLENDPD, BLENDVPS, BLENDVPD, PBLENDVB, PBLENDDW
Blending conditionally copies one field in thesource onto the same field in the destination.These new instructions improve the perform-ance of blending operations for most field sizes through packing multiple operations in a single instruction.
Broadly useful for automated compiler vectorizationof data processing written in high level languages(like C and Fortran), and applications such as imageprocessing, video processing, multimedia, and gaming.
Packed Integer Min and Max
PMINSB, PMAXSB, PMINUW,PMAXUW, PMINUD, PMAXUD,PMINDS, PMAXSD
Compares packed signed/unsigned byte/word/dword integers in the destination operand andthe source operand, and returns the minimum ormaximum as per the instruction type for eachpacked operand in the destination operand.
Broadly useful for automated compiler vectorizationof data processing written in high level languages(like C and Fortran), and applications such as imageprocessing, video processing, multimedia, and gaming.
Floating Point Round ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD
Efficiently rounds the scalar and packed single-and double- precision operands to integers, withenhanced support for Fortran, JAVA and C99 language requirements.
Image processing, graphics, video processing, 2-D/3-D applications, multimedia, and gaming.
RegisterInsertion/Extraction
INSERTPS, PINSRB, PINSRD, PINSRQ, EXTRACTPS, PEXTRB,PEXTRD, PEXTRW, PEXTRQ
These new instruction simplify data insertionand extraction between GPR (or memory) andXMM registers.
Broadly useful for automated compiler vectorizationof data processing written in high level languages(like C and Fortran), and applications such as imageprocessing, video processing, multimedia, and gaming.
Packed Format Conversion PMOVSXBW, PMOVZXBW,PMOVSXBD, PMOVZXBD,PMOVSXBQ, PMOVZXBQ,PMOVSXWD, PMOVZXWD,PMOVSXWQ, PMOVZXWQ,PMOVSXDQ, PMOVZXDQ
Converts from a packed integer (from XMM register or memory) to a zero- or sign-extendedinteger with wider type.
Broadly useful for automated compiler vectorizationof data processing written in high level languages(like C and Fortran), and applications such as imageprocessing, video processing, multimedia, and gaming.
Packed Test and Set PTEST Faster branching from SIMD decisions to support conditionally vectorized code.
Useful for improved automated compiler vectorizationof data processing, image and video processing, 3-Dcontent creation, multimedia, and gaming.
Packed Compare for Equal PCMPEQQ, PCMPGTQ Performs SIMD compare for equality of thepacked QWORDs in the destination and thesource operand.
Broadly useful for automated compiler vectorizationof data processing written in high level languages(like C and Fortran), and applications such as imageprocessing, video processing, multimedia, and gaming.
Pack DWORD to Unsigned WORD
PACKUSDW Converts packed signed DWORDs into packedunsigned WORDs using unsigned saturation tohandle overflow condition. This new instructioncompletes the set of other instructions in this type.
Broadly useful for automated compiler vectorizationof data processing written in high level languages(like C and Fortran), and applications such as imageprocessing, video processing, multimedia, and gaming.
Sub Group Instructions Description Expected Application BenefitsAdvanced String Operations PCMPESTRI, PCMPESTRM,
PCMPISTRI, PCMPISTRMThese new instructions provide a rich set ofstring and text processing capabilities that traditionally required many more opcodes.
Improved performance for virus scan, text search,string processing libraries like ZLIB, databases, compilers and state machine-oriented applications.
Sub Group Instructions Description Expected Application BenefitsFast CRC (CyclicRedundancy Check)
CRC32 Finds the CRC value using a specific polynomialof a given source operand.
Fast and efficient data integrity checks in datatransfer protocols for networked storage (e.g., iSCSI, RDMA).
Accelerated searching andpattern recognition of largedata sets
POPCNT Calculates the number of bits set to 1 in thegiven operand.
Helps to deliver higher performance in applicationssuch as genome mining, handwriting recognition,digital health workloads, fast hamming algorithms,and others.
Apendice K
Modo de Gestion del Sistema(SMM)
K.1. Introduccion
Es un modo de operacion de proposito especial: control del consumo de potencia,
control del sistema hardware, codigo OEM (Original Equipment Manufacturer), etc. No
esta pensado para las aplicaciones de usuario. Proporciona un entorno de procesador
transparente a cualquier Sistema Operativo.
K.2. Interrupcion de Gestion del Sistema
La unica manera de entrar en el modo SMM es a traves de la activacion de la patilla
SMI# que es una interrupcion no enmascarable independiente del sistema de interrupcio-
nes/excepciones convencionales. No es reentrante.
K.3. Conmutacion de modos de operacion
Cuando se produce una peticion SMI#, se completan las interrupciones pendientes
y se salva el contexto de ejecucion actual en la memoria especial SMRAM que es una
memoria independiente e inaccesible desde otros modos de funcionamiento (aunque pue-
de hacerse ası si se quiere). La interrupcion SMI# tiene mas prioridad que las demas
interrupciones/excepciones.
Para salir del modo SMM hay que ejecutar la instruccion RSM, que por otra parte solo
es reconocida en modo SMM. Esta instruccion recupera el contexto de ejecucion y retorna
al programa y modo de operacion interrumpido.
Si al recuperar el contexto se encuentra informacion no coherente, el microprocesador
se para y es necesario reiniciarlo.
227
228 SMRAM
K.4. SMRAM
Es una memoria mapeada en el espacio de direcciones fısico que contiene el codigo
que se ejecuta en modo SMM y que guarda el contexto del microprocesador y otras
informaciones del disenador (OEM).
Su tamano por defecto es de 64KB, aunque puede ser de hasta 4GB y comienza en
SMBASE=3000h. Cuando se entra en el modo SMM se ejecutan instrucciones a partir de la
posicion SMBASE+8000h y se guarda el contexto de ejecucion en SMBASE+FE00h.
K.5. Entorno de ejecucion de la rutina SMI
Despues de salvar el contexto de ejecucion del microprocesador, se funciona en un
modo real con algunas caracterısticas:
Se pueden direccionar 4GB. No se puede usar el direccionamiento extendido de 36
bits.
El tamano de los segmentos es de 4GB.
Se entienden los codigos de operacion como de 16 bits.
Para acceder a las instrucciones de 32 bits se codifican los prefijos de 32 bits.
Se inicializan todos los registros generales con unos valores especıficos.
Se inhiben todas las interrupciones y excepciones.
• EFLAGS.IF=0.
• EFLAGS.TF=0.
• DR7=0. Deshabilita los breakpoints.
• Las interrupciones NMI, SMI y A20M son bloqueadas por hardware.
Se podrıan habilitar las enmascarables pero requiere tener preparadas las tables,
etc.
El uso de la FPU
• Hay que identificar la FPU con CPUID.
• Habrıa que salvar el contexto de la FPU con la instruccion FSAVE.
• Hay que enmascarar todas las posibles excepciones de coprocesador si las ru-
tinas de atencion no estan.
Capıtulo K. Modo de Gestion del Sistema (SMM) 229
• Al retornar habra que recuperar el contexto de la FPU.
Indice alfabetico
Acarreo, 36Arquitectura
CISC, 20Harvard, 16RISC, 20Von Neumann, 16
ASIC, 14
Big endian, 19Bit pegajoso, 65, 102, 151
Codigo de error, 130
Desbordamiento, 36DSP, 14
InstruccionesAAA, 47AAD, 47AAM, 47AAS, 47ADC, 45ADD, 45AND, 48BOUND, 55BSF, 52BSR, 52BSWAP, 41BT, 51BTC, 51BTR, 51BTS, 51CALL, 54CBW, 44CDQ, 44CLC, 58CLD, 58CLI, 58CMC, 58CMOVcc, 40CMP, 47CMPSx, 56CMPXCHG, 42CMPXCHG8B, 42CPUID, 60CWD, 44
CWDE, 44DAA, 47DAS, 47DEC, 46DXOS, 71EMMS, 81ENTER, 56F2XM1, 72FABS, 70FADD, 69FBLD, 68FBSTP, 68FCHS, 70FCLEX, 72FCMOVcc, 68FCOM, 71FCOMI, 71FDECSTP, 73FDIV, 70FDIVR, 70FFREE, 73FIADD, 69FICOM, 71FIDIV, 70FIDIVR, 70FILD, 68FIMUL, 70FINCSTP, 73FINIT, 72FIST/FISTP, 68FISUB, 69FISUBR, 69FLD, 68FLD1, 72FLDCW, 72FLDENV, 72FLDL2E, 72FLDL2T, 72FLDLG2, 72FLDLN2, 72FLDPI, 72FLDZ, 72FMUL, 70FNOP, 73FPATAN, 71
230
INDICE ALFABETICO 231
FPREM, 70FPREM1, 70FPTAN, 71FRNDINT, 70FRSTOR, 73FSAVE, 73FSCALE, 70FSIN, 71FSINCOS, 71FSQRT, 70FST/FSTP, 68FSTCW, 72FSTENV, 72FSTSW, 72FSUB, 69FSUBR, 69FTST, 71FUCOM, 71FUCOMI, 71FWAIT/WAIT, 73FXAM, 71FXCH, 68FXTRACT, 70FYL2X, 72FYL2XP1, 72HLT, 93IDIV, 46IMUL, 45IN, 43INC, 46INSx, 57INT, 55INT3, 55INTO, 55IRET, 55IRETD, 55Jcc, 53JMP, 52LAHF, 59LEA, 59LEAVE, 56LOCK, 93LODSx, 56LOOP, 53LOOPE, 53LOOPNE, 53LOOPNZ, 53LOOPZ, 53Lxx, 59MOV, 40MOVD, 78MOVQ, 78MOVSX, 44MOVSx, 56MOVZX, 44
MUL, 46NEG, 46NOP, 59NOT, 48OR, 48OUT, 43OUTSx, 57PACKSSxx, 79PACKUSWB, 80PADDSx, 78PADDx, 78PAND, 80PANDN, 80PCMPEQx, 79PCMPGTx, 79PMADDWD, 79PMULLW/PMULHW, 78POP, 43POPA, 43POPAD, 43POPF, 43POPFD, 43POR, 80PSLLx, 81PSRAx, 81PSRLx, 81PSUBSx, 78PSUBUSx, 78PSUBx, 78PUNPCKHxx, 80PUNPCKLxx, 80PUSH, 42PUSHA, 43PUSHAD, 43PUSHF, 42PUSHFD, 42PXOR, 80RCL, 51RCR, 50RDMSR, 93RDPMC, 93RDTSC, 94REP, 57REPE, 58REPNE, 58REPNZ, 58REPZ, 58RET, 54ROL, 50ROR, 50RSM, 93SAHF, 59SAL, 49SAR, 48SBB, 45
232 INDICE ALFABETICO
SCASx, 56SETcc, 52SHL, 49SHLD, 49SHR, 49SHRD, 49STC, 58STD, 58STI, 58STOSx, 57SUB, 45TEST, 52UD2, 60WRMSR, 93XADD, 42XCHG, 41XLATB, 60XOR, 48
Little endian, 19
Mapa de permisos de E/S, 136Memoria
modelo direccionamiento real, 33modelo plano, 32modelo segmentado, 32
Microcontroladores, 14Microprocesador
definicion, 15Modo de funcionamiento
gestion del sistema, 32protegido, 31real, 31virtual 86, 31
MTRR, 144
Paridad, 36Pila
Maquina, 17Pipelining, 21Procesadores paralelos, 14Punto flotante, 61
Segmento de estado de tarea, TSS, 135Semiacarreo, 36
Time Stamp Counter, 94, 155
Bibliografıa
[1] 80386 Manual de Referencia Hardware. Anaya Multimedia, 1989. ISBN: 84-7614-210-2.
[2] Introduccion al 80386. Anaya Multimedia, 1989. ISBN: 84-7614-182-3.
[3] Intel Architecture Software Developer’ s Manual Volume 1: Basic Architecture. Intel,1999.
[4] Intel Architecture Software Developer’ s Manual Volume 2: Instruction Set Reference.Intel, 1999.
[5] Intel Architecture Software Developer’ s Manual Volume 3: System Programming.Intel, 1999.
[6] The Netwide Assembler (NASM Project), 1999. http://www.cryogen.com/Nasm.
[7] J.M. Angulo. Microprocesadores 8086, 80286 y 80386. Paraninfo, 1990. ISBN: 84-283-1753-4.
[8] Jose M. Angulo and Enrique M. Funke. 386 y 486. Microprocesadores avanzados.Introduccion al Pentium. Paraninfo, 1994. ISBN: 84-283-2066-7.
[9] Kenneth J. Ayala. The 8086 Microprocessor: Programming and Interfaceing The PC.Delmar Publishers, 1994. ISBN: 0-314-01242-7.
[10] Birmelin. Manual de los Procesadores 80xxx y Pentium. Marcombo, 1995.
[11] B. Brey. Los microprocesadores Intel avanzados. Megabyte Noriega, 1994.
[12] Barry B. Brey. Los microprocesadores Intel. Arquitectura, programacion, e interfaces.Prentice-Hall, 1994. ISBN: 968-880-481-9.
[13] Paul A. Carter. PC Assembly Language. 2001.
[14] Francisco Charte Ojeda. Ensamblador para DOS, Linux y Windows. Anaya Multi-media, 2003. ISBN: 84-415-1482-8.
[15] Intel Corporation. The Complete Guide to MMXTM Technology. Computing McGrawHill, 1997. ISBN: 0-07-006192-01.
[16] John H. Crawford and Patrick P. Gelsinger. Programacion del 80386. Anaya Multi-media, 1991. ISBN: 84-7614-294-3.
[17] Richard C. Detmer. 80x86 Assembly Language and Computer Architecture. Jonesand Bartlett Computer Science, 2001. ISBN: 0-7637-1773-8.
233
234 BIBLIOGRAFIA
[18] Glenn Hinton, Dave Sager, Mike Upton, Darrell Boggs, Doug Carmean, Alan Kyker,and Patrice Roussel. The microarchitecture of the pentium[tm] 4 processor. IntelTechnology Journal, Q1, 2001.
[19] Peter L.B. Johnson. ECE 291: Computer Engineering II, January 2003 LaboratoryNotes. 2003.
[20] Mohamed Rafiquzzaman. Microprocessors and Microcomputer-Based System Design.CRC-Press, 1995. ISBN: 0-8493-4475-1.
[21] William Stallings. Organizacion y Arquitectura de Computadores. Prentice Hall,2000. ISBN: 84-205-2993-1.