Entradas

Mostrando entradas de abril, 2020

3.2 Macros.

Una macro es un conjunto de instrucciones que pueden ser llamadas utilizando su nombre para ejecutarse dentro de un programa, estas solo se escriben una vez dentro del código y pueden utilizarse las veces que sea necesario. En ensamblador la diferencia entre los procedimientos y las macros es que las macros tienen la posibilidad de utilizar parámetros por lo que pueden llevar a cabo tareas que los procedimientos no podrían. Las macros constan de tres partes que las definen: Declaración: El inicio de una macro se declara escribiendo el nombre que tendrá, seguido de la palabra reservada MACRO y opcionalmente, puede contener parámetros después. Cuerpo: Contiene todas las instrucciones que ejecutara la macro cuando sea llamada dentro del programa en ejecución. Fin: Toda macro debe terminar con la palabra reservada ENDM para indicar el fin de la misma. Al igual que con los procedimientos, existen dos tipos de macros que son externas e internas, pero son muy fáciles de uti...

3.1 Procedimientos.

Un procedimiento es una secuencia de instrucciones que en conjunto llevan a cabo una tarea específica. En programación un procedimiento es un segmento de código que cuenta con instrucciones a las cuales se puede acceder desde cualquier parte del programa y una vez se termina la ejecución de estas, el programa continua con su ejecución normal, tomando el control la siguiente línea después de la llamada al procedimiento. Los procedimientos tienden a ser grupos de instrucciones que se necesitara ejecutar más de una vez dentro de un programa, ya que un procedimiento puede ser llamado en cualquier momento durante la ejecución del programa principal, la cantidad de veces que sea necesario sin necesidad de reescribir el código. En ensamblador los procedimientos están conformados por las siguientes partes: Declaración del procedimiento: Los procedimientos en ensamblador se declaran mediante la sintaxis nombreprocedimiento Proc [far/near] dependiendo de si es un procedimiento cercano o...

2.15 Captura y almacenamiento de datos.

Imagen
Las variables numéricas son muy útiles en ensamblador de la misma forma que en otros lenguajes de programación, ya que permiten al programador hacer operaciones aritméticas con datos que se desconocen al momento de la compilación. La utilización de datos numéricos es similar a la de cadenas, con la diferencia de que en vez de declarar las variables como db, se declaran como dw, lo cual significa que son variables numéricas.

2.14 Obtención de una cadena con la representación hexadecimal.

Imagen
Obtención de una cadena con la representación hexadecimal La conversión entre numeración binaria y hexadecimal es sencilla. Lo primero que se hace para una conversión de un número binario a hexadecimal es dividirlo en grupos de 4 bits, empezando de derecha a izquierda. En caso de que el último grupo (el que quede más a la izquierda) sea menor de 4 bits se rellenan los faltantes con ceros. Tomando como ejemplo el número binario 101011 lo dividimos en grupos de 4 bits y nos queda: 10; 1011 Rellenando con ceros el último grupo (el de la izquierda): 0010; 1011 después tomamos cada grupo como un número independiente y consideramos su valor en decimal: 0010 = 2; 1011 = 11 Pero como no podemos representar este número hexadecimal como 211 porqué sería un error, tenemos que sustituir todos los valores mayores a 9 por su respectiva representación en hexadecimal, con lo que obtenemos: 2BH (Donde la H representa la base hexadecimal) Para convertir un número de hexadecimal a binario solo es necesa...

2.13 Desplazamiento y rotación.

Imagen
Las instrucciones de desplazamiento son cuatro: shl, shr, sar y sal; y su objetivo es desplazar los bits de un operando un determinado número de posiciones a la izquierda o a la derecha. La estructura de los operandos manejados por estas instrucciones y su significado es idéntico para las cuatro instrucciones. SHL (Shift Left = desplazamiento a la izquierda)  Se desplazan a la izquierda los bits del operando destino tantas posiciones como indique el operando fuente. El desplazamiento de una posición se realiza de la siguiente forma: el bit de mayor peso del operando se desplaza al bit CF del registro de estado, el resto de los bits se desplazan una posición hacia la izquierda, y la posición de menor peso se rellena con un 0     SAL (Shift Arithmetic Left = desplazamiento aritmético a la izquierda)  El objetivo de un desplazamiento aritmético a la izquierda es multiplicar un operando, interpretado con signo, por una potencia de 2. Para llevar a ...

2.12 Instrucciones lógicas.

Imagen
Ensamblador cuenta con un grupo de cuatro instrucciones lógicas a nivel de bit, las cuales con excepción de la primera requieren de dos operandos, estas son las siguientes: NOT: La instrucción NOT o negación requiere un solo operando y su función es cambiar el estado de los bits del mismo, es decir, cambiar los ceros por unos y los unos por ceros. Ejemplo: NOT ax  Se aplica la negación al valor del registro ax. AND: Esta instrucción también conocida como producto lógico requiere de dos operandos y su valor será igual a uno cuando los bits que se comparen ambos sean uno. Ejemplo: AND ax,bx  Se aplica el producto lógico a los valores de ax y bx. OR: La instrucción OR también conocida como suma lógica requiere de dos operandos y su valor será uno si alguno de los bits que compara es uno. Ejemplo: OR ax,bx Se aplica la suma lógica a los valores de ax y bx. XOR: La instrucción XOR o suma lógica exclusiva requiere dos operandos, los cuales se comparan y...

2.11 Obtención de cadena con representación decimal.

En este modo, los datos son proporcionados directamente como parte de la instrucción. Ejemplo: Mov AX,34h ; Copia en AX el número 34h hexadecimal Mov CX,10 ; Copia en CX el número 10 en decimal .COMMENT Programa: PushPop.ASM Descripción: Este programa demuestra el uso de las instrucciones para el manejo de la pila, implementando la instrucción XCHG con Push y Pop MODEL tiny .CODE Inicio: ;Punto de entrada al programa Mov AX,5 ;AX=5 Mov BX,10 ;BX=10 Push AX ;Pila=5 Mov AX,BX ;AX=10 Pop BX ;BX=5 Mov AX,4C00h ;Terminar programa y salir al DOS Int 21h ; END Inicio END

2.10 Manipulación de la pila.

Imagen
La pila es un grupo de localidades de memoria que se reservan para contar con un espacio de almacenamiento temporal cuando el programa se está ejecutando. La pila es una estructura de datos del tipo LIFO (Last In First Out), esto  quiere decir que el último dato que es introducido en ella, es el primero que saldrá al sacar datos de la pila. Para la manipulación de la pila ensamblador cuenta con dos instrucciones especificas, las cuales son las siguientes: Push: Esta instrucción permite almacenar el contenido del operando dentro de la última posición de la pila. Ejemplo: Push ax    El valor contenido en ax es almacenado en el último espacio de la pila. Pop: Esta instrucción toma el último dato almacenado en la pila y lo carga al operando. Ejemplo: Pop bx       El valor contenido en el último espacio de la pila se almacena en el registro El siguiente ejemplo muestra como implementar la instrucción XCHG por medio de las instrucc...

2.9 Instrucciones aritméticas.

Dentro de ensamblador se pueden llevar a cabo las 4 instrucciones aritméticas básicas, cada una de ellas cuenta con su propia función: Instrucción de Suma ADD: Suma los operandos que se le dan y guarda el resultado en el primer operando. Ejemplo ADD al, bl:  Suma los valores guardados en los registros al y bl, almacenando el resultado en al. Instrucción de Resta SUB: Resta el primer operando al segundo y almacena el resultado en el primero. Ejemplo: SUB al, bl:  Resta el valor de AL al de BL y almacena el resultado en AL. Instrucción de multiplicación MUL: Multiplica el contenido del acumulador por el operando, a diferencia de los métodos anteriores, solo es necesario indicar el valor por el que se multiplicará, ya que el resultado siempre es almacenado en el registro AX. Ejemplo: MUL DX:  Multiplica el valor del registro acumulador (AX) por el de DX. Instrucción de división DIV: Divide un numero contenido en el acumulador entre el operando...

2.8 Captura de cadenas con formato.

El capturar cadenas con formato permite el movimiento, comparación o búsqueda rápida entre bloques de datos, las instrucciones son las siguientes: MOVC: Esta instrucción permite transferir un carácter de una cadena. MOVW: Esta instrucción permite transferir una palabra de una cadena. CMPC: Este comando es utilizado para comparar un carácter de una cadena. CMPW: Esta instrucción es utilizada para comparar una palabra de una cadena. SCAC: Esta instrucción permite buscar un carácter de una cadena. SCAW: Esta instrucción se utiliza para buscar una palabra de una cadena. LODC: Esta instrucción permite cargar un carácter de una cadena. LODW: Esta instrucción es utilizada para cargar una palabra de una cadena. STOC: Esta instrucción permite guardar un carácter de una cadena. STOW: Esta instrucción es utilizada para guardar  una palabra de una cadena.

2.7 Incremento y decremento.

En ensamblador existen dos instrucciones que cumplen con el propósito de aumentar o reducir el valor contenido dentro de un registro. INC: Incrementa en uno el valor contenido dentro del registro que se le dé como parámetro. INC al:  Aumenta en 1 el valor del registro al. DEC: Reduce en uno el valor contenido dentro del registro que se le dé como parámetro. DEC al:  Reduce en 1 el valor del registro al.

2.6 Ciclos condicionales.

Imagen
Dentro de la programación existen ocasiones en la que es necesario ejecutar una misma instrucción un cierto número de veces, el cual no siempre es conocido por el programador o puede cambiar durante la ejecución del programa, para lo que existen los ciclos condicionales, los cuales una vez se cumpla la condición que tienen establecida, dejaran de ejecutarse como ciclo y permitirán que el programa continúe con su flujo normal. En ensamblador no existen de forma predefinida estos ciclos, pero pueden crearse haciendo uso de los saltos incondicionales, generando ciclos que se repetirán hasta que se cumpla la condición definida por el programador. Ejemplo: mov al, 0:  Asigna el valor cero al registro al. ciclo:  Etiqueta a la que se hará referencia para el ciclo condicional. INC al:  Aumenta en 1 el valor del registro al. CMP al, bl :  Comparación entre el valor almacenado en al y el almacenado en bl. JL ciclo:  Instrucción que indica que el flujo del...

2.5 Saltos.

La mayoría de los programas constan de varios ciclos en los que una serie de pasos se repite hasta alcanzar un requisito específico y varias pruebas para determinar qué acción se realiza de entre varias posibles. Una instrucción usada comúnmente para la transferencia de control es la instrucción JMP (jump, salto, bifurcación). Un salto es incondicional, ya que la operación transfiere el control bajo cualquier circunstancia. También JMP vacía el resultado de la instrucción previamente procesada; por lo que, un programa con muchas operaciones de salto puede perder velocidad de procesamiento. La instrucción LOOP, requiere un valor inicial en el registro CX. En cada iteración, LOOP de forma automática disminuye 1 de CX. Si el valor en el CX es cero, el control pasa a la instrucción que sigue; si el valor en el CX no es cero, el control pasa a la dirección del operando. La distancia debe ser un salto corto, desde -128 hasta +127 bytes. Para una operación que exceda este límite, el ensam...

2.4 Comparación y prueba.

Imagen
La comparación y prueba son instrucciones especiales con las que cuenta el microprocesador, estas son CMP y TEST respectivamente. Comparación (CMP): Esta instrucción compara los dos valores que se le den como parámetros y modifica las banderas de signo (SF), de cero (ZF) y de acarreo (CF) según sea necesario. Ejemplo: CMP ah,10h:  Compara el valor almacenado en el registro ah con el valor 10 hexadecimal. Prueba (TEST): Verifica que los valores que se le introduzcan como parámetros sean iguales relizando la operación lógica AND, no almacena ningún resultado pero modifica banderas según sea necesario. Ejemplo: TEST al, 1:  Verifica que el valor almacenado en al sea 1.

2.3 Captura básica de cadenas.

Imagen
Dentro del lenguaje ensamblador no existe el tipo de dato cadena (string en otros lenguajes), por lo que para utilizarla es necesario tratar a las cadenas como un conjunto de caracteres reservados bajo el nombre de una sola variable. El lenguaje ensamblador cuenta con instrucciones que por su naturaleza sirven para el manejo de cadenas, estas son: MOVSB: Mueve un byte desde una localidad de memoria hasta otra. MOVSW: Mueve una palabra desde una localidad de memoria hasta otra. LODSB: Carga en la parte baja del registro acumulador (AL) el valor de la localidad de memoria determinada por DS:SI. LODSW: Carga en el registro acumulador (AX) el valor de la localidad de memoria determinada por DS:SI. Ejemplo:

2.2 Ciclos numéricos.

Como en cualquier otro lenguaje de programación, hay ocasiones en las que es necesario hacer que el programa no siga una secuencia lineal, sino que repita varias veces una misma instrucción o bloque de instrucciones antes de continuar con el resto del programa, es para esto que se utilizan los ciclos. Existen 5 tipos de ciclos predefinidos en ensamblador, aunque también se pueden crear ciclos personalizados por medio de instrucciones de salto. Los ciclos predefinidos de ensamblador son los siguientes: LOOP: Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo. Ejemplo: mov cx,25 :     Número de veces que se repetirá el ciclo, en este caso 25. ciclo:  Etiqueta que se utilizará como referencia para el ciclo loop. int 21h:  Instrucción contenida dentr...