Modos de direccionamiento

Modos de direccionamiento : el término modos de direccionamiento se refiere a la forma en que se especifica el operando de una instrucción. El modo de direccionamiento especifica una regla para interpretar o modificar el campo de dirección de la instrucción antes de que se ejecute el operando.

Los modos de direccionamiento para las instrucciones 8086 se dividen en dos categorías:

1) Modos de direccionamiento para datos

2) Modos de direccionamiento para sucursal

Los modos de direccionamiento de memoria del 8086 brindan acceso flexible a la memoria, lo que le permite acceder fácilmente a variables, arrays, registros, punteros y otros tipos de datos complejos. La clave para una buena programación en lenguaje ensamblador es el uso adecuado de los modos de direccionamiento de memoria.

Una instrucción de programa en lenguaje ensamblador consta de dos partes

am1
La dirección de memoria de un operando consta de dos componentes: 

TÉRMINOS IMPORTANTES

  • Dirección inicial del segmento de memoria.
  • Dirección efectiva o Desplazamiento : Un desplazamiento se determina sumando cualquier combinación de tres elementos de dirección: desplazamiento, base e índice.
    • Desplazamiento: Es un valor inmediato de 8 o 16 bits dado en la instrucción.
    • Base : Contenido del registro base, BX o BP.
    • Índice : Contenido del registro de índice SI o DI.

De acuerdo con las diferentes formas de especificar un operando por parte del microprocesador 8086, el 8086 utiliza diferentes modos de direccionamiento.

Los modos de direccionamiento utilizados por el microprocesador 8086 se analizan a continuación:

  • Modo implícito: : En el direccionamiento implícito, el operando se especifica en la instrucción misma. En este modo, los datos tienen una longitud de 8 bits o 16 bits y los datos son parte de la instrucción. Las instrucciones de dirección cero están diseñadas con un modo de direccionamiento implícito.
    am2
    Example:  CLC (used to reset Carry flag to 0)
  • Modo de direccionamiento inmediato (símbolo #): En este modo, los datos están presentes en el campo de dirección de la instrucción. Diseñado como un formato de instrucción de dirección.
    Nota: La limitación en el modo inmediato es que el rango de constantes está restringido por el tamaño del campo de dirección.
    Example:  MOV AL, 35H (move the data 35H into AL register)
  • Modo de registro: en el direccionamiento de registros, el operando se coloca en uno de los registros de propósito general de 8 o 16 bits. Los datos están en el registro especificado por la instrucción.
    Aquí se requiere una referencia de registro para acceder a los datos.
    am3
    Example: MOV AX,CX (move the contents of CX register to AX register)
  • Modo Indirecto de Registro : En este direccionamiento el desplazamiento del operando se coloca en cualquiera de los registros BX,BP,SI,DI como se especifica en la instrucción. La dirección efectiva de los datos está en el registro base o en un registro de índice especificado por la instrucción.
    Aquí se requiere la referencia de dos registros para acceder a los datos. Las CPU 8086 le permiten acceder a la memoria indirectamente a través de un registro utilizando los modos de direccionamiento indirecto de registro.
    am5
    MOV AX, [BX](move the contents of memory location s 
    addressed by the register BX to the register AX)
  • Auto indexado (modo de incremento) : la dirección efectiva del operando es el contenido de un registro especificado en la instrucción. Después de acceder al operando, el contenido de este registro se incrementa automáticamente para apuntar a la siguiente ubicación de memoria consecutiva. (R1)+ .
    Aquí se requiere una referencia de registro, una referencia de memoria y una operación ALU para acceder a los datos.
    Ejemplo:
    Add R1, (R2)+  // OR
    R1 = R1 +M[R2]
    R2 = R2 + d 

    Útil para recorrer arrays en un bucle. R2 – inicio de la array  d – tamaño de un elemento

  • Auto indexado (modo decremento) : la dirección efectiva del operando es el contenido de un registro especificado en la instrucción. Antes de acceder al operando, el contenido de este registro se decrementa automáticamente para apuntar a la ubicación de memoria consecutiva anterior. (R1)
    Aquí se requiere una referencia de registro, una referencia de memoria y una operación ALU para acceder a los datos.
  • Ejemplo:

Add R1,-(R2)   //OR
R2 = R2-d
R1 = R1 + M[R2] 

El modo de disminución automática es el mismo que el modo de incremento automático. Ambos también se pueden usar para implementar una pila como push y pop. Los modos de incremento automático y decremento automático son útiles para implementar estructuras de datos «Último en entrar, primero en salir».

  • Modo de direccionamiento directo/ direccionamiento absoluto (símbolo [ ]): el desplazamiento del operando se proporciona en la instrucción como un elemento de desplazamiento de 8 o 16 bits. En este modo de direccionamiento, la dirección efectiva de 16 bits de los datos es parte de la instrucción.
    Aquí solo se requiere una operación de referencia de memoria para acceder a los datos.

    am6

    Ejemplo:ADD AL,[0301] //añade el contenido de la dirección de compensación 0301 a AL
  • Modo de direccionamiento indirecto (símbolo @ o()) : En este modo, el campo de instrucción de dirección contiene la dirección de la dirección efectiva. Aquí se requieren dos referencias.
    1ª referencia para obtener domicilio efectivo.
    2ª referencia para acceder a los datos.

    Según la disponibilidad de la dirección efectiva, el modo indirecto es de dos tipos:

    1. Registro indirecto: en este modo, la dirección efectiva está en el registro y el nombre del registro correspondiente se mantendrá en el campo de dirección de una instrucción.
      Aquí se requiere una referencia de registro, una referencia de memoria para acceder a los datos.
    2. Memoria indirecta: en este modo, la dirección efectiva está en la memoria y la dirección de memoria correspondiente se mantendrá en el campo de dirección de una instrucción.
      Aquí se requieren dos referencias de memoria para acceder a los datos.
  • Modo de direccionamiento indexado : el desplazamiento del operando es la suma del contenido de un registro de índice SI o DI y un desplazamiento de 8 o 16 bits.
    Example:MOV AX, [SI +05] 
  •  Direccionamiento indexado basado: el desplazamiento del operando es la suma del contenido de un registro base BX o BP y un registro de índice SI o DI.
    Example: ADD AX, [BX+SI] 
  • Según la transferencia de control, los modos de direccionamiento son:

    • Modo de direccionamiento relativo de PC: el modo de direccionamiento relativo de PC se utiliza para implementar la transferencia de control dentro del segmento. En este modo, la dirección efectiva se obtiene agregando desplazamiento a la PC.
      EA= PC+ Address field value
      PC= PC+ Relative value.
    • Modo de direccionamiento de registro base: El modo de direccionamiento de registro base se usa para implementar la transferencia de control entre segmentos. En este modo, la dirección efectiva se obtiene agregando el valor del registro base al valor del campo de dirección.
      EA= Base register + Address field value.
      PC= Base register + Relative value.
      

      Nota:

      1. Ambos modos de direccionamiento son adecuados para la reubicación del programa en tiempo de ejecución.
      2. El modo de direccionamiento de registro basado es el más adecuado para escribir códigos independientes de posición.

    Ventajas de los modos de direccionamiento

    1. Dotar a los programadores de facilidades como Pointers, contadores para controles de bucle, indexación de datos y reubicación de programas.
    2. Reducir el número de bits en el campo de direccionamiento de la Instrucción.

    Ejemplo de pregunta GATE

    Haga coincidir cada una de las declaraciones de lenguaje de alto nivel dadas en el lado izquierdo con el modo de direccionamiento más natural de los enumerados en el lado derecho.

    1. A[1] = B[J];         a. Indirect addressing
    2. while [*A++];        b. Indexed  addressing
    3. int temp = *x;       c. Autoincrement

    (A ) (1, c), (2, b), (3, a)
    (B) (1, a), (2, c), (3, b)
    (C) (1, b), ( 2, c), (3, a)
    (D) (1, a), (2, b), (3, c)

    Respuesta: (C)

    Explicación:

    List 1                           List 2
    1) A[1] = B[J];      b) Index addressing 
    Here indexing is used
    
    2) while [*A++];     c) auto increment
    The memory locations are automatically incremented
    
    3) int temp = *x;    a) Indirect addressing
    Here temp is assigned the value of int type stored
    at the address contained in X

    Por lo tanto (C) es la solución correcta.

    Este artículo es una contribución de Pooja Taneja. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

    Publicación traducida automáticamente

    Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *