SlideShare una empresa de Scribd logo
1 de 28
Descargar para leer sin conexión
Programación de IA-32
      Modo Real

      Introducción


    Erwin Meza Vega
IA-32 Modo real (1/2)
       Acceso sólo a características limitadas del procesador
           Se comporta como un 8086 muy rápido
       Uso de segmentación de una forma especial
       Segmentos de 64 KB
       Los registros de segmento (CS, DS, ES, FS, GS, SS) apuntan
        a la base de un segmento en memoria, dividida en 16
       Es necesario establecer explícitamente los valores en los
        registros de segmento
       Sólo se puede tener acceso al primer Megabyte de memoria
IA-32 Modo Real (2/2)
       La BIOS lee el sector de arranque del dispositivo (disco),
        y lo copia en la posición de memoria 0x7C00 (31744)
       El sector de arranque recibe el control de la ejecución.
       Se deben configurar los registros de segmento CS, DS
       Se debe crear una pila en una región de la memoria que no
        esté siendo utilizada (configurar SS = base/16 y SP = tope)
            Para recordar: la pila crece hacia atrás en la memoria, es decir de la
             dirección más alta a la más baja.
            En modo real las operaciones sobre la pila siempre operan sobre 16 bits
             (2 bytes)
            Push: decrementa SP en 2 y almacena el valor
            Pop: saca el valor apuntado por SP e incrementa SP en 2 (bytes)
Disposición de la memoria
                         1 MB
                                 ROM
Antes de pasar el
                         9FBFF   EBDA
control al sector de
arranque, la BIOS
                                 (memoria usable)
configura el primer
MegaByte de memoria
de la siguiente forma:



                                 Sector de Arranque    IP = 0x7C00
                         7BFF    cargado por la BIOS

                                 (memoria usable)
                         4FF
                                 BDA
                         3FF
                                                       CS = 0x0000
                                 IDT
Flujo de ejecución
El procesador realiza el siguiente ciclo general:
1.       FETCH: Lee la instrucción de memoria apuntada por CS:IP
     •      Incrementa IP en el número de bytes que ocupa la instrucción leída
2.       DECODE: Interpreta la instrucción leída, para determinar la operación y los
         operandos que intervienen
     •      Busca los operandos que intervienen en la instrucción, calcula las direcciones
            de memoria correspondientes y obtiene los datos requeridos
3.       EXECUTE: Ejecuta la instrucción leída e interpretada
     •      Puede continuar la ejecución en otra posición de memoria, generar errores
            (excepciones), modificar FLAGS…
4.       Vuelve al paso 1
La ejecución continúa en la instrucción que se encuentra en memoria
    inmediatamente después de la que se acabó de ejecutar, a menos que en
    el paso 3 se modifique el flujo de la ejecución
Modificar del flujo de la ejecución
El procesador ofrece varias alternativas para modificar el flujo de
   ejecución (continuar la ejecución en otra posición de memoria).
Algunas alternativas son:
   1.   Saltos (instrucciones jmp, ljmp, jz, je, jne, …)
   2.   Llamada a rutinas (instrucciones call, lcall)
   3.   Llamada a una interrupción (instrucción int)
   4.   Retorno de interrupciones (instrucción iret) realizados por el procesador
        o ‘simulados’.
   5.   Errores al ejecutar una instrucción (división por cero, etc). El procesador
        lanza una “Excepción” (interrupción)
En la práctica todas las alternativas modifican el valor del registro IP
  (Instruction Pointer)
Algunas de éstas también modifican el valor del registro de segmento de
   código (CS)
Saltos incondicionales
Transfieren el control de la ejecución a otra
  posición de memoria
  • Jmp: Salto a otra posición dentro del mismo
    segmento de código: Se realiza especificando el
    desplazamiento dentro del segmento actual. Solo
    modifica el registro IP.
  • Ljmp, Jmp Far: Salto a otro segmento de código. Se
    realiza especificando una dirección lógica (seg :
    offset). Este tipo de salto modifica al registro CS y
    al registro IP.
Instrucción jmp
                                           Memoria                                         Memoria
Segmento de código (max: 64 KB)




                                       Instrucción                                     Instrucción
                                                                                  IP




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

                                                                Se modifica solo IP

                                  CS                                             CS


                                                        El salto se realiza
                                                        dentro del mismo
                                        Antes de jmp    segmento de código             Después de jmp
Instrucción ljmp
         Memoria                                            Memoria



     instrucción                                        instrucción
                                                  IP



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

     ljmp seg:offset     Se modifican CS e IP
IP
CS
                           El salto se realiza a otro
                           segmento de código
      Antes de ljmp                                     Después de ljmp
Saltos condicionales
Dependen del estado del registro FLAGS. Los bits de
 este registro se pueden modificar implícitamente
 cuando se ejecuta una instrucción
  • Ej: Cuando la operación aritmética o lógica que se
    acabó de ejecutar da como resultado cero, se activa el
    bit ZF (Zero Flag) en el registro FLAGS (ZF = 1)
  • En este caso se puede ejecutar la instrucción jz (jump if
    zero), para transferir el control a otra posición de
    memoria si la operación dio como resultado cero.
Al igual que en los saltos incondicionales, se debe
  especificar el nuevo desplazamiento dentro del
  segmento de código.
Saltos condicionales
Algunas instrucciones de salto condicional:
• jz: jump if zero, jnz: jump if not zero
• je, jne, jl, jle, jg, jge: Se pueden utilizar para pasar el control a otra
  posición de memoria si un operando es:
    • igual (e),
    • no igual (ne)
    • menor (l)
    • menor o igual (le)
    • mayor (g)
    • mayor o igual (ge)
    que el otro operando.
• jc: jump if carry. Saltar a otra posición si el bit Carry Flag (Acarreo) se
  encuentra en 1.
Ejemplo: instrucción je
                                                Memoria                                      Memoria
                                                            La ejecución
                                                            continúa en la nueva
Segmento de código (max: 64 KB)




                                                            posición de memoria
                                  ax = bx   Instrucción     Sólo si la condición         Instrucción
                                                            se cumple               IP


                                            Instrucción                     Si ax = bx
                                                              ax != bx                   Instrucción
                                            je offset                                    je offset
                                    IP                      En caso contrario, la
                                            cmp ax, bx
                                                            ejecución continua
                                                            en la instrucción
                                                            siguiente a ‘je’
                                    CS                                              CS

                                                            Salto condicional

                                              Antes de je                                  Después de je
Llamada a rutinas
Similares a las instrucciones jmp y ljmp:
   • call: Invocar a una rutina dentro del mismo segmento de
     código. Solo modifica el registro IP.
   • lcall, call far: Invocar una rutina en otra posición de memoria,
     especificada por una dirección lógica (seg : offset). Este tipo
     de salto modifica al registro CS y al registro IP.
Luego de ejecutar la rutina, se debe ‘retornar’ a la posición
  desde la cual se invocó. Para lograr este propósito, el
  procesador almacena automáticamente en la pila:
• En el caso de call, el valor de IP al cual se debe ‘retornar’
• En el caso de lcall, el valor de CS e IP al cual se debe
  retornar (ya que con lcall se modifica tanto CS como IP).
Llamada a rutinas locales (1/2)
                                    Memoria                                                      Memoria

                              ret                                                          ret
Segmento de código




                                                       rutina
                              …                                                            …
                              instrucción                                                 instrucción
                                                                                  IP




                                                       offset
                      IP’     instrucción                                              IP’ instrucción
                              call offset                                                  call offset
                     IP
                     CS                                                           CS
                                                       Al invocar la rutina, se
Segmento de pila




                     SP                                almacena la dirección
                                                       de retorno en el tope               IP’
                                                                                  SP
                                                       de la pila y el control
                                                       se transfiere al código
                                                       de la rutina
                     SS                                                           SS
                          Antes de invocar la rutina                                        Al invocar la rutina
Llamada a rutinas locales (2/2)
                                                                         Memoria
               Memoria

                               La instrucción ‘ret’                ret
         ret
IP                             permite ‘retornar’ la               …
         …
                               ejecución a otra                    instrucción
         instrucción           posición de memoria.

                               El procesador extrae
                               del tope de la pila el        IP’   instrucción
 IP’     instrucción           valor que debe asignar   IP
                               a IP para continuar la              call offset
         call offset
                               ejecución en otra        CS
CS                             posición de memoria.
                                                        SP
                                                   IP   IP’        IP’
         IP’
SP


                                                        SS
SS
                                                                   Al retornar de la rutina
     Antes de retornar de la rutina
Paso de parámetros a rutinas
Antes de invocar la rutina (instrucción call) se deben ingresar
  los parámetros en la pila usando la instrucción push.

Los parámetros se deben almacenar en la pila en el orden
  inverso al cual se espera dentro de la rutina
En C: rutina (param0, param1, … , paramN)
Se deben ingresar de la siguiente forma:
          push paramN
          ….
          push param1
          push param0
          call rutina
Paso de parámetros a rutinas (1/2)
                                      Memoria                                                Memoria

                                ret                                                    ret
Segmento de código




                                                   rutina
                                …                                                      …
                                instrucción                                           instrucción
                                                                              IP
                         IP’    instrucción


                                                   offset
                       IP       call offset                                        IP’ instrucción
                                push param0                                            call offset
                                push param1
                       CS                                                     CS
                                                   Al invocar la rutina, se
Segmento de pila




                                                   almacena la dirección               param1
                                param1             de retorno en el tope               param0
                                param0             de la pila y el control
                       SP                          se transfiere al código             IP’
                                                                              SP
                                                   de la rutina
                        SS                         Los parámetros se          SS
                                                   deben encontrar en la
                      Antes de invocar la rutina   pila en orden inverso                Al invocar la rutina
Paso de parámetros a rutinas (2/2)
                                    Memoria                                             Memoria

                       IP     ret                                                 ret
Segmento de código




                                              rutina
                              …                                                   …
                              instrucción                                         instrucción

                              instrucción
                              call offset                            IP        IP’ instrucción
                              push param0     Al retornar de la
                                              rutina, se toma la                  call offset
                              push param1     dirección de retorno
                       CS                                                 CS
                                              (IP) del tope de la pila
Segmento de pila




                                              y se continúa la                    param1
                              param1          ejecución en ese                    param0
                              param0          punto.                      SP
                                              Los parámetros
                              IP’             almacenados en la
                       SP
                       SS                     pila se deben sacar         SS
                                              manualmente.
                        Antes de retornar                                          Al invocar la rutina
Paso de parámetros a rutinas
Luego de retornar de la rutina, se deben extraer
  los parámetros almacenados en la pila. Esto se
  puede lograr usando la instrucción pop tantas
  veces como parámetros se haya incluido en la
  pila, o desplazando el apuntador de la pila hacia
  arriba en la memoria:
         add SP, M
Donde M se obtiene de multiplicar el número de
  parámetros almacenados en la pila por 2
  (debido a que cada parámetro en la pila ocupa 1
  word : 2 bytes).
Llamada a rutinas en otro segmento
               (1/2)
                 Memoria                                                      Memoria

          lret                                                         lret
          …                                                            …
          instrucción                                                  instrucción



                             offset
                                                            IP
seg                                                         CS


      IP’ instrucción                                              IP’ instrucción
                                      Se invoca la rutina              lcall seg:offset
          lcall seg:offset            ubicada en la
IP
                                      dirección lineal
CS                                    seg:offset
          IP’                                                          IP’
                                 Se modifican CS e IP
          CS                                                           CS
 SP                                                           SP
                                 El salto se realiza a otro
                                 segmento de código
 SS                                                           SS
           Antes de lcall                                               Después de lcall
Llamada a rutinas en otro segmento
               (2/2)
             Memoria                                                    Memoria

      lret                                                       lret
 IP                                                              …
      …
      instrucción                                                instrucción

CS
                          Al retornar con ‘lret’
                          (ret far), se recupera
                          CS e IP de la pila. La              IP’ instrucción
      instrucción                                      IP
                          ejecución continúa en                  lcall seg:offset
      lcall seg:offset    la nueva direción
                          apuntada por CS:IP           CS
                                                         SP
      IP’                                                        IP’
                          Se modifican CS e IP
      CS                                                         CS
SP
                          El salto se realiza a otro
                          segmento de código
SS                                                      SS
          Antes de lret                                          Después de lret
Llamada a interrupción
Es posible invocar una interrupción por software, mediante la instrucción
  int.
   • Al recibir una interrupción, el procesador automáticamente almacena en
     la pila el valor de FLAGS, CS e IP (la posición actual de ejecución)
   • Luego el procesador transfiere el control a una rutina de manejo de
     interrupción.
   • Cuanto la rutina de manejo de interrupción termina, ejecuta la instrucción
     ‘iret’. Esta instrucción extrae del tope de la pila los valores de FLAGS, CS
     e IP en los cuales se debe continuar con la ejecución.
En modo real, las rutinas de manejo de interrupción son configuradas
  por la BIOS al inicio del sistema
   • La BIOS configura en la posición 0 de la memoria una tabla (arreglo)
     llamada ‘Tabla de Descriptores de Interrupción’ (IDT). Cada entrada de
     esta tabla contiene las direcciones lógicas (seg:offset) en las cuales se
     encuentran las rutinas de manejo de interrupción.
Interrupción por software (1/3)
              Memoria
          …
                               Rutinas de manejo de interrupción definidas por la BIOS
          rutina
          rutina
                                               seg..offset         255
      IP’ instrucción
                                                                         En modo real,
          int #                                                          la IVT
IP                                                                       contiene 256
CS                                             …                         entradas : 256
 SP                                            seg:offset                apuntadores a
                                                                   #
                                        #                                las rutinas de
                                               seg:offset          1     manejo de
                                               seg:offset          0     interrupción

 SS                                         IVT = Tabla de Vectores de
                                            Interrupción

 Antes de invocar la interrupción
Interrupción por software (2/3)
                 Memoria          Rutina de manejo de                Memoria
                                  interrupción
          iret                                               iret
          …                                                  …
          instrucción                                        instrucción


                                offset
                                                    IP
seg                                                 CS
      IP’ instrucción                                    IP’ instrucción
          int #                                              int #
IP
CS
 SP
                            #                                IP’
                                                             CS
                                                             FLAGS
                                                    SP
 SS                                                 SS
          seg:offset

 Antes de invocar la interrupción                Inicio del manejo de la interrupción
Interrupción por software (3/3)
                   Memoria                                          Memoria
                                 Rutina de manejo de
           iret                  interrupción               iret
IP
           …                                                …
           instrucción                                      instrucción
CS                             Para retornar de
       IP’ instrucción         la interrupción           IP’ instrucción
                               (iret), se extrae
           int #                                            int #
                               de la pila los      IP
                               valores de
                                                   CS
                               FLAGS, CS e IP.
                               La ejecución         SP
           IP’                 continúa en la               IP’
           CS                  nueva posición               CS
                               CS:IP
           FLAGS                                            FLAGS
  SP
  SS                                                SS


 Antes de retornar de la interrupción              Luego de retornar de la interrupción
Simular un retorno de interrupción
Conociendo el mecanismo usado por el procesador para
  retornar de una interrupción (que almacena automáticamente
  FLAGS, CS e IP), es posible pasar el control a otra posición
  de memoria ‘simulando’ que ha ocurrido una interrupción y
  ejecutando la instrucción ‘iret’
• Se debe almacenar en la pila el valor de FLAGS, el nuevo
  valor de CS y el nuevo valor de IP al cual se desea pasar el
  control.
• Luego se invoca la instrucción ‘iret’
Luego de pasar al nuevo punto de ejecución no es posible
  retornar al punto anterior.
Un mecanismo similar a éste se usa en modo protegido para
  implementar la multitarea. Además de FLAGS, CS e IP se
  almacenan y recuperan los valores de los registros de
  propósito general (eax, ebx, .. etc.).
Simular un retorno de interrupción
                Memoria          Nuevo sitio e                 Memoria
                                 ejecución

         …                                               …
         instrucción                                     instrucción


                               offset
                                                 IP
seg                                              CS
         iret                                            iret
IP
         push offset                                     push offset
         push seg                                        push seg
CS       push valor_flags                                push valor_flags
                              Al ‘simular’ el
                              retorno de
                              interrupción, el   SP
        offset                                           offset
                              procesador
        seg                   continúa la                seg
        FLAGS                 ejecución en
 SP                           otra posición              FLAGS
 SS                           de memoria         SS
   Antes de simular el retorno                   Luego del ‘retorno’ simulado
Referencias

          Manuales de Intel
http://www.intel.com/products/processor/manuals/

Más contenido relacionado

Destacado

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Destacado (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Ia32 Modo Real

  • 1. Programación de IA-32 Modo Real Introducción Erwin Meza Vega
  • 2. IA-32 Modo real (1/2)  Acceso sólo a características limitadas del procesador  Se comporta como un 8086 muy rápido  Uso de segmentación de una forma especial  Segmentos de 64 KB  Los registros de segmento (CS, DS, ES, FS, GS, SS) apuntan a la base de un segmento en memoria, dividida en 16  Es necesario establecer explícitamente los valores en los registros de segmento  Sólo se puede tener acceso al primer Megabyte de memoria
  • 3. IA-32 Modo Real (2/2)  La BIOS lee el sector de arranque del dispositivo (disco), y lo copia en la posición de memoria 0x7C00 (31744)  El sector de arranque recibe el control de la ejecución.  Se deben configurar los registros de segmento CS, DS  Se debe crear una pila en una región de la memoria que no esté siendo utilizada (configurar SS = base/16 y SP = tope)  Para recordar: la pila crece hacia atrás en la memoria, es decir de la dirección más alta a la más baja.  En modo real las operaciones sobre la pila siempre operan sobre 16 bits (2 bytes)  Push: decrementa SP en 2 y almacena el valor  Pop: saca el valor apuntado por SP e incrementa SP en 2 (bytes)
  • 4. Disposición de la memoria 1 MB ROM Antes de pasar el 9FBFF EBDA control al sector de arranque, la BIOS (memoria usable) configura el primer MegaByte de memoria de la siguiente forma: Sector de Arranque IP = 0x7C00 7BFF cargado por la BIOS (memoria usable) 4FF BDA 3FF CS = 0x0000 IDT
  • 5. Flujo de ejecución El procesador realiza el siguiente ciclo general: 1. FETCH: Lee la instrucción de memoria apuntada por CS:IP • Incrementa IP en el número de bytes que ocupa la instrucción leída 2. DECODE: Interpreta la instrucción leída, para determinar la operación y los operandos que intervienen • Busca los operandos que intervienen en la instrucción, calcula las direcciones de memoria correspondientes y obtiene los datos requeridos 3. EXECUTE: Ejecuta la instrucción leída e interpretada • Puede continuar la ejecución en otra posición de memoria, generar errores (excepciones), modificar FLAGS… 4. Vuelve al paso 1 La ejecución continúa en la instrucción que se encuentra en memoria inmediatamente después de la que se acabó de ejecutar, a menos que en el paso 3 se modifique el flujo de la ejecución
  • 6. Modificar del flujo de la ejecución El procesador ofrece varias alternativas para modificar el flujo de ejecución (continuar la ejecución en otra posición de memoria). Algunas alternativas son: 1. Saltos (instrucciones jmp, ljmp, jz, je, jne, …) 2. Llamada a rutinas (instrucciones call, lcall) 3. Llamada a una interrupción (instrucción int) 4. Retorno de interrupciones (instrucción iret) realizados por el procesador o ‘simulados’. 5. Errores al ejecutar una instrucción (división por cero, etc). El procesador lanza una “Excepción” (interrupción) En la práctica todas las alternativas modifican el valor del registro IP (Instruction Pointer) Algunas de éstas también modifican el valor del registro de segmento de código (CS)
  • 7. Saltos incondicionales Transfieren el control de la ejecución a otra posición de memoria • Jmp: Salto a otra posición dentro del mismo segmento de código: Se realiza especificando el desplazamiento dentro del segmento actual. Solo modifica el registro IP. • Ljmp, Jmp Far: Salto a otro segmento de código. Se realiza especificando una dirección lógica (seg : offset). Este tipo de salto modifica al registro CS y al registro IP.
  • 8. Instrucción jmp Memoria Memoria Segmento de código (max: 64 KB) Instrucción Instrucción IP offset jmp offset La ejecución jmp offset IP continúa en la nueva posición de memoria Se modifica solo IP CS CS El salto se realiza dentro del mismo Antes de jmp segmento de código Después de jmp
  • 9. Instrucción ljmp Memoria Memoria instrucción instrucción IP offset La ejecución continúa CS en la nueva posición de memoria apuntada por seg:offset ljmp seg:offset Se modifican CS e IP IP CS El salto se realiza a otro segmento de código Antes de ljmp Después de ljmp
  • 10. Saltos condicionales Dependen del estado del registro FLAGS. Los bits de este registro se pueden modificar implícitamente cuando se ejecuta una instrucción • Ej: Cuando la operación aritmética o lógica que se acabó de ejecutar da como resultado cero, se activa el bit ZF (Zero Flag) en el registro FLAGS (ZF = 1) • En este caso se puede ejecutar la instrucción jz (jump if zero), para transferir el control a otra posición de memoria si la operación dio como resultado cero. Al igual que en los saltos incondicionales, se debe especificar el nuevo desplazamiento dentro del segmento de código.
  • 11. Saltos condicionales Algunas instrucciones de salto condicional: • jz: jump if zero, jnz: jump if not zero • je, jne, jl, jle, jg, jge: Se pueden utilizar para pasar el control a otra posición de memoria si un operando es: • igual (e), • no igual (ne) • menor (l) • menor o igual (le) • mayor (g) • mayor o igual (ge) que el otro operando. • jc: jump if carry. Saltar a otra posición si el bit Carry Flag (Acarreo) se encuentra en 1.
  • 12. Ejemplo: instrucción je Memoria Memoria La ejecución continúa en la nueva Segmento de código (max: 64 KB) posición de memoria ax = bx Instrucción Sólo si la condición Instrucción se cumple IP Instrucción Si ax = bx ax != bx Instrucción je offset je offset IP En caso contrario, la cmp ax, bx ejecución continua en la instrucción siguiente a ‘je’ CS CS Salto condicional Antes de je Después de je
  • 13. Llamada a rutinas Similares a las instrucciones jmp y ljmp: • call: Invocar a una rutina dentro del mismo segmento de código. Solo modifica el registro IP. • lcall, call far: Invocar una rutina en otra posición de memoria, especificada por una dirección lógica (seg : offset). Este tipo de salto modifica al registro CS y al registro IP. Luego de ejecutar la rutina, se debe ‘retornar’ a la posición desde la cual se invocó. Para lograr este propósito, el procesador almacena automáticamente en la pila: • En el caso de call, el valor de IP al cual se debe ‘retornar’ • En el caso de lcall, el valor de CS e IP al cual se debe retornar (ya que con lcall se modifica tanto CS como IP).
  • 14. Llamada a rutinas locales (1/2) Memoria Memoria ret ret Segmento de código rutina … … instrucción instrucción IP offset IP’ instrucción IP’ instrucción call offset call offset IP CS CS Al invocar la rutina, se Segmento de pila SP almacena la dirección de retorno en el tope IP’ SP de la pila y el control se transfiere al código de la rutina SS SS Antes de invocar la rutina Al invocar la rutina
  • 15. Llamada a rutinas locales (2/2) Memoria Memoria La instrucción ‘ret’ ret ret IP permite ‘retornar’ la … … ejecución a otra instrucción instrucción posición de memoria. El procesador extrae del tope de la pila el IP’ instrucción IP’ instrucción valor que debe asignar IP a IP para continuar la call offset call offset ejecución en otra CS CS posición de memoria. SP IP IP’ IP’ IP’ SP SS SS Al retornar de la rutina Antes de retornar de la rutina
  • 16. Paso de parámetros a rutinas Antes de invocar la rutina (instrucción call) se deben ingresar los parámetros en la pila usando la instrucción push. Los parámetros se deben almacenar en la pila en el orden inverso al cual se espera dentro de la rutina En C: rutina (param0, param1, … , paramN) Se deben ingresar de la siguiente forma: push paramN …. push param1 push param0 call rutina
  • 17. Paso de parámetros a rutinas (1/2) Memoria Memoria ret ret Segmento de código rutina … … instrucción instrucción IP IP’ instrucción offset IP call offset IP’ instrucción push param0 call offset push param1 CS CS Al invocar la rutina, se Segmento de pila almacena la dirección param1 param1 de retorno en el tope param0 param0 de la pila y el control SP se transfiere al código IP’ SP de la rutina SS Los parámetros se SS deben encontrar en la Antes de invocar la rutina pila en orden inverso Al invocar la rutina
  • 18. Paso de parámetros a rutinas (2/2) Memoria Memoria IP ret ret Segmento de código rutina … … instrucción instrucción instrucción call offset IP IP’ instrucción push param0 Al retornar de la rutina, se toma la call offset push param1 dirección de retorno CS CS (IP) del tope de la pila Segmento de pila y se continúa la param1 param1 ejecución en ese param0 param0 punto. SP Los parámetros IP’ almacenados en la SP SS pila se deben sacar SS manualmente. Antes de retornar Al invocar la rutina
  • 19. Paso de parámetros a rutinas Luego de retornar de la rutina, se deben extraer los parámetros almacenados en la pila. Esto se puede lograr usando la instrucción pop tantas veces como parámetros se haya incluido en la pila, o desplazando el apuntador de la pila hacia arriba en la memoria: add SP, M Donde M se obtiene de multiplicar el número de parámetros almacenados en la pila por 2 (debido a que cada parámetro en la pila ocupa 1 word : 2 bytes).
  • 20. Llamada a rutinas en otro segmento (1/2) Memoria Memoria lret lret … … instrucción instrucción offset IP seg CS IP’ instrucción IP’ instrucción Se invoca la rutina lcall seg:offset lcall seg:offset ubicada en la IP dirección lineal CS seg:offset IP’ IP’ Se modifican CS e IP CS CS SP SP El salto se realiza a otro segmento de código SS SS Antes de lcall Después de lcall
  • 21. Llamada a rutinas en otro segmento (2/2) Memoria Memoria lret lret IP … … instrucción instrucción CS Al retornar con ‘lret’ (ret far), se recupera CS e IP de la pila. La IP’ instrucción instrucción IP ejecución continúa en lcall seg:offset lcall seg:offset la nueva direción apuntada por CS:IP CS SP IP’ IP’ Se modifican CS e IP CS CS SP El salto se realiza a otro segmento de código SS SS Antes de lret Después de lret
  • 22. Llamada a interrupción Es posible invocar una interrupción por software, mediante la instrucción int. • Al recibir una interrupción, el procesador automáticamente almacena en la pila el valor de FLAGS, CS e IP (la posición actual de ejecución) • Luego el procesador transfiere el control a una rutina de manejo de interrupción. • Cuanto la rutina de manejo de interrupción termina, ejecuta la instrucción ‘iret’. Esta instrucción extrae del tope de la pila los valores de FLAGS, CS e IP en los cuales se debe continuar con la ejecución. En modo real, las rutinas de manejo de interrupción son configuradas por la BIOS al inicio del sistema • La BIOS configura en la posición 0 de la memoria una tabla (arreglo) llamada ‘Tabla de Descriptores de Interrupción’ (IDT). Cada entrada de esta tabla contiene las direcciones lógicas (seg:offset) en las cuales se encuentran las rutinas de manejo de interrupción.
  • 23. Interrupción por software (1/3) Memoria … Rutinas de manejo de interrupción definidas por la BIOS rutina rutina seg..offset 255 IP’ instrucción En modo real, int # la IVT IP contiene 256 CS … entradas : 256 SP seg:offset apuntadores a # # las rutinas de seg:offset 1 manejo de seg:offset 0 interrupción SS IVT = Tabla de Vectores de Interrupción Antes de invocar la interrupción
  • 24. Interrupción por software (2/3) Memoria Rutina de manejo de Memoria interrupción iret iret … … instrucción instrucción offset IP seg CS IP’ instrucción IP’ instrucción int # int # IP CS SP # IP’ CS FLAGS SP SS SS seg:offset Antes de invocar la interrupción Inicio del manejo de la interrupción
  • 25. Interrupción por software (3/3) Memoria Memoria Rutina de manejo de iret interrupción iret IP … … instrucción instrucción CS Para retornar de IP’ instrucción la interrupción IP’ instrucción (iret), se extrae int # int # de la pila los IP valores de CS FLAGS, CS e IP. La ejecución SP IP’ continúa en la IP’ CS nueva posición CS CS:IP FLAGS FLAGS SP SS SS Antes de retornar de la interrupción Luego de retornar de la interrupción
  • 26. Simular un retorno de interrupción Conociendo el mecanismo usado por el procesador para retornar de una interrupción (que almacena automáticamente FLAGS, CS e IP), es posible pasar el control a otra posición de memoria ‘simulando’ que ha ocurrido una interrupción y ejecutando la instrucción ‘iret’ • Se debe almacenar en la pila el valor de FLAGS, el nuevo valor de CS y el nuevo valor de IP al cual se desea pasar el control. • Luego se invoca la instrucción ‘iret’ Luego de pasar al nuevo punto de ejecución no es posible retornar al punto anterior. Un mecanismo similar a éste se usa en modo protegido para implementar la multitarea. Además de FLAGS, CS e IP se almacenan y recuperan los valores de los registros de propósito general (eax, ebx, .. etc.).
  • 27. Simular un retorno de interrupción Memoria Nuevo sitio e Memoria ejecución … … instrucción instrucción offset IP seg CS iret iret IP push offset push offset push seg push seg CS push valor_flags push valor_flags Al ‘simular’ el retorno de interrupción, el SP offset offset procesador seg continúa la seg FLAGS ejecución en SP otra posición FLAGS SS de memoria SS Antes de simular el retorno Luego del ‘retorno’ simulado
  • 28. Referencias Manuales de Intel http://www.intel.com/products/processor/manuals/