Requerimientos de lenguaje ensamblador

Ensambladores y Compiladores

      Primero identificamos dos clases de lenguajes de programación: de alto nivel y de bajo nivel. Los programadores que escriben en un lenguaje de alto nivel, como C y Pascal, codifican comandos poderosos, cada uno de los cuales puede generar muchas instrucciones en lenguaje de máquina. Por otro lado, los programadores que escriben en un lenguaje ensamblador de bajo nivel codifican instrucciones simbólicas, cada una de las cuales genera una instrucción en lenguaje de máquina. A pesar del hecho de que codificar en un lenguaje de alto nivel es más productivo, algunas ventajas de codificar en lenguaje ensamblador son:

• Proporciona más control sobre el manejo particular de los requerimientos de hardware.
• Genera módulos ejecutables más pequeños y más compactos.
• Con mayor probabilidad tiene una ejecución más rápida.

      Una práctica común es combinar los beneficios de ambos niveles de programación: codificar el grueso de un proyecto en un lenguaje de alto nivel y los módulos críticos (aquellos que provocan notables retardos) en lenguaje ensamblador. 

       Sin importar el lenguaje de programación que utilice, de todos modos es un lenguaje simbólico que tiene que traducirse a una forma que la computadora pueda ejecutar. Un lenguaje de alto nivel utiliza un compilador para traducir el código fuente a lenguaje de máquina (técnicamente, código objeto). Un lenguaje de bajo nivel utiliza un ensamblador para realizar la traducción. Un programa enlazador para ambos niveles, alto y bajo, completa el proceso al convertir el código objeto en lenguaje ejecutable de máquina.

Palabras Reservadas

     Ciertas palabras en lenguaje ensamblador están reservadas para sus propósitos propios, y son usadas sólo bajo condiciones especiales. Por categorías, las palabras reservadas incluyen

•  Instrucciones, como MOV y ADD, que son operaciones que la computadora puede ejecutar
•  Directivas, como END o SEGMENT, que se emplean para proporcionar comandos al ensamblador
•  Operadores, como FAR y SIZE, que se utilizan en expresiones
•  Símbolos predefinidos, como ©Data y @Model, que regresan información a su programa.

El uso de una palabra reservada para un propósito equivocado provoca que el ensamblador genere un mensaje de error. El apéndice C muestra una lista de las palabras reservadas del lenguaje ensamblador.

Modos de Direccionamiento.

     El 8086 ofrece una multitud de vías para direccionar la información: registro a registro, direccionamiento inmediato, direccionamiento directo y varios tipos diferentes de direccionamiento indirecto. Cada modo tiene
siempre un operando fuente y uno destino. El operando destino está ubicado a la izquierda de la coma; y el fuente a la derecha. Adicionalmente, los modos directo e indirecto involucran el uso de un registro de segmento.

Direccionamiento Registro.

      Es aquel en el cual la operación se lleva a cabo entre los contenidos de dos registros. Por ejemplo, la
instrucción
                        mov AX,BX

      Indica que el contenido del registro BX sea copiado en el registro AX.

Direccionamiento Inmediato.

     En este modo de direccionamiento, uno de los operandos está presente en el o los bytes siguientes al código de operación. Por ejemplo, la instrucción

                       add AX,3064h

     Indica que el número 3064h sea sumado al contenido del registro AX y el resultado almacenado en dicho registro.

Direccionamiento Directo.

     EL 8086 implementa el direccionamiento directo a memoria, sumando un desplazamiento de 16 bits, indicado por los dos bytes que siguen al código de operación, al contenido del registro de segmento de datos. La suma es pues, la posición de memoria direccionada. Por ejemplo, la instrucción

                      mov AH,TABLA

   Señala que el contenido de la posición de memoria cuya dirección está indicada por el identificador TABLA, sea copiado en el registro AH.

Direccionamiento Indirecto.

     El modo de direccionamiento indirecto es el más difícil de comprender, pero también el más poderoso. Existen cuatro métodos de direccionamiento indirecto: indirecto a registro, relativo a base, indexado e indexado a base.

Indirecto a Registro.

      En el modo de direccionamiento indirecto a registro, la dirección de memoria donde se encuentra uno de los operando es indicado a través del contenido de los registros BX, BP, SI o DI. La instrucción

                   mov AX,[DI]

      Establece que el contenido de la palabra de memoria cuya dirección está indicada por el contenido del
registro DI, sea copiado en el registro AX.

Relativo a Base.

      El direccionamiento a la memoria de datos, relativo a base simplemente usa el contenido del registro BX o BP como base para la posición efectiva de memoria. La instrucción

          mov CL,[BP]+DESP

     Copia el contenido de la posición de memoria cuya dirección está determinada por la suma del contenido de BP y DESP, en el registro CL.

Indexado.

       El direccionamiento indexado directo está permitido especificando los registros SI o DI como índices. Empleando este modo de direccionamiento es posible acceder a los elementos de un vector. La instrucción 

          sub AH,MATRIZ[SI]

    Resta del contenido del registro AH, el valor contenido en la posición de memoria especificada por la suma del desplazamiento indicado por el identificador MATRIZ y el contenido del registro SI.

Indexado a Base.

    Resulta de la combinación de los modos de direccionamiento Relativo a Base e Indexado Directo. La
instrucción

         mov DH,VECTOR[BX][DI]

     Señala que el contenido de la posición de memoria cuya dirección viene indicada por la suma de los contenidos de los registros BX y DX y del desplazamiento establecido por el identificador VECTOR, sea copiado en DH.



Directivas (mas usadas)

EQU: Define nombres simbólicos que representan valores u otros valores simbólicos. Las dos formas son:
  •           Nombre EQU expresión.
  •           Nuevo_nombre EQU viejo_nombre

Una vez definido un nombre mediante EQU, no se puede volver a definir.

ASSUME: Sirve para indicar al ensamblador qué registro de segmento corresponde con un segmento determinado. Cuando el ensamblador necesita referenciar una dirección debe saber en qué registro de segmento lo apunta.
  • Sintaxis: ASSUME reg_segm: nombre [, reg_segm:nombre...]

donde el nombre puede ser de segmento o de grupo, una expresión utilizando el operador SEG o la palabra NOTHING, que cancela la selección de registro de segmento hecha con un ASSUME anterior.

.MODEL modelo: Debe estar ubicada antes de otra directiva de segmento. El modelo puede ser uno de los siguientes:
  • TINY: Los datos y el código juntos ocupan menos de 64 KB por lo que entran en el mismo segmento. Se utiliza para programas .COM. Algunos ensambladores no soportan este modelo.
  • SMALL: Los datos caben en un segmento de 64 KB y el código cabe en otro segmento de 64 KB. Por lo tanto todo el código y los datos se pueden acceder como NEAR.
  • MEDIUM: Los datos entran en un sólo segmento de 64 KB, pero el código puede ser mayor de 64 KB. Por lo tanto, código es FAR, mientras que los datos se acceden como NEAR.
  • COMPACT: Todo el código entra en un segmento de 64 KB, pero los datos no (pero no pueden haber matrices de más de 64 KB). Por lo tanto, código es NEAR, mientras que los datos se acceden como FAR.
  • LARGE: Tanto el código como los datos pueden ocupar más de 64 KB (pero no pueden haber matrices de más de 64 KB), por lo que ambos se acceden como FAR.
.STACK [size]: Define el segmento de pila de la longitud especificada. Si no se indica el tamaño, se reservan 1024 bytes.

.CODE [name]: Define el segmento de código cuando es empleada la directiva .MODEL

.DATA: Define un segmento de datos inicializados. Previamente debe ser usada la directiva .MODEL para especificar el modelo de memoria. L segmento es puesto en un grupo llamado Dgroup junto con los segmentos definidos por las directivas .Stack, .Const y .Data?

Ciclos de Maquina

     Cuando un microprocesador ejecuta una instrucción, éste realiza una serie de operaciones o tareas básicas llamadas ciclos de máquina. Estas tareas que involucran a las componentes internas del CPU, algunas veces a la memoria o a los puertos de entrada y salida, son coordinadas con las señales de interfaz generadas en la unidad de control en una secuencia ordenada.

No hay comentarios.:

Publicar un comentario

Ejemplo sencillo

Ejemplo de separar numero pares de impares                         .model small .stack 100h      ;tamaño de l...