Temas III Prácticas - Crypto-ch4r/Lenguajes-de-Interfaz- GitHub Wiki
Práctica #1: Operación lógica AND
Resumen
En esta práctica se realiza una operación lógica AND entre dos valores predefinidos.
Objetivo
El objetivo de la siguiente práctica es conocer y aplicar el funcionamiento de la operación lógica AND realizando operaciones lógicas básicas.
Introducción
Como se mencionó anteriormente, haremos uso de la operación lógica AND para realizar una operación lógica y posteriormente imprimir el resultado en la terminal. A continuación se presenta la metodología utilizada para la elaboración de la práctica.
Metodología
Código
Empezamos definiendo la sección .data donde vamos a declarar una cadena de caracteres que se imprimirá en la consola antes del resultado. Esta cadena está acompañada de dos caracteres especiales, 0x0A y 0x0D, que indican un salto de línea y un retorno de carro. Después definimos la constante lonmsg con la directiva equ para representar la longitud de la cadena de caracteres que vamos a utilizar.
Después de declarar nuestros datos a utilizar, abrimos la sección .bss donde reservamos un byte de memoria para almacenar el resultado de la operación a realizar. Acto seguido, en la sección .text comenzamos nuestro código con la etiqueta _start y se marca como global para indicar que es el punto de entrada principal del programa.
Después de definir el punto de entrada, movemos a los registros al y bl los números 2 y 1 respectivamente. Después de ello con la instrucción AND vamos a realizar la operación lógica entre ambos registros. Después al registro al que es donde se ha guardado el resultado de la operación lógica sumaremos un 48 que corresponde al número 0 según la tabla ASCII. Después de esta suma guardamos el resultado en la variable resultado que se definió previamente.
Después hacemos uso de la interrupción 0x80 para imprimir la cadena msg en la consola. Nuevamente hacemos uso de la misma instrucción para imprimir el valor almacenado en la variable resultado.
Finalmente, cargamos antes de salir los valores 1 y 0 en los registros eax y ebx y llamamos a la interrupción 0x80 para finalizar correctamente el programa.
Resultados
Análisis
Obtuvimos el resultado deseado sin muchas dificultades, gracias a prácticas anteriores las nuevas que se van presentando son más fáciles de comprender.
Conclusiones
Podemos concluir en que esta fue una práctica bastante sencilla que nos ayuda a comprender como funcionan las operaciones lógicas de manera sencilla y clara sin mucha complicación.
Referencias
Práctica #2: Operación lógica OR
Resumen
En esta práctica se realiza una operación lógica OR entre dos valores predefinidos.
Objetivo
El objetivo de la siguiente práctica es conocer y aplicar el funcionamiento de la operación lógica OR realizando operaciones lógicas básicas.
Introducción
Como se mencionó anteriormente, haremos uso de la operación lógica OR para realizar una operación lógica y posteriormente imprimir el resultado en la terminal. A continuación se presenta la metodología utilizada para la elaboración de la práctica.
Metodología
Código
Empezamos definiendo la sección .data donde vamos a declarar una cadena de caracteres que se imprimirá en la consola antes del resultado. Esta cadena está acompañada de dos caracteres especiales, 0x0A y 0x0D, que indican un salto de línea y un retorno de carro. Después definimos la constante lonmsg con la directiva equ para representar la longitud de la cadena de caracteres que vamos a utilizar.
Después de declarar nuestros datos a utilizar, abrimos la sección .bss donde reservamos un byte de memoria para almacenar el resultado de la operación a realizar. Acto seguido, en la sección .text comenzamos nuestro código con la etiqueta _start y se marca como global para indicar que es el punto de entrada principal del programa.
Después de definir el punto de entrada, movemos a los registros al y bl los números 2 y 1 respectivamente. Después de ello con la instrucción OR vamos a realizar la operación lógica entre ambos registros. Después al registro al que es donde se ha guardado el resultado de la operación lógica sumaremos un 48 que corresponde al número 0 según la tabla ASCII. Después de esta suma guardamos el resultado en la variable resultado que se definió previamente.
Después hacemos uso de la interrupción 0x80 para imprimir la cadena msg en la consola. Nuevamente hacemos uso de la misma instrucción para imprimir el valor almacenado en la variable resultado.
Finalmente, cargamos antes de salir los valores 1 y 0 en los registros eax y ebx y llamamos a la interrupción 0x80 para finalizar correctamente el programa.
Resultados
Análisis
Esta práctica al igual que la anterior fue bastante sencilla de resolver. Pudimos obtener el resultado deseado sin muchas dificultades y gracias a la anterior es realmente fácil de comprender.
Conclusiones
A pesar de ser una práctica relativamente sencilla, es de mucha utilidad ya que nos ayuda a comprender como usar las operaciones lógicas en ensamblador y como es que funcionan las mismas.
Referencias
Práctica #3: Par o impar
Resumen
En esta práctica realizamos un programa básico en Ensamblador para determinar si un número es PAR o IMPAR. Para ello, aplicamos conocimiento adquirido en prácticas previas donde utilizamos saltos y operaciones lógicas.
Objetivo
Aplicar conocimientos de saltos condicionales y de operaciones lógicas para poder resolver determinado problema.
Introducción
Las operaciones lógicas ensamblador operan sobre valores booleanos (0 y 1) o bits individuales de números. En esta práctica, vamos a apoyarnos de dichos bits para determinar si un número es par o impar. Esto imprimirá una cadena que define el resultado. A continuación, se presenta la metodología utilizada para la solución de este problema.
Metodología
Código
Primeramente en la sección .data definimos dos cadenas, "Es par" y "Es impar" respectivamente. Ambas seguidas por los caracteres de salto de línea y retorno de carro. Acto seguido, definimos dos constantes que representan la longitud de las dos cadenas que definimos previamente.
Después, en la sección .text comenzamos nuestro código con la etiqueta _start y se marca como global para indicar que es el punto de entrada principal del programa. Ya que entramos al programa, cargamos los valores 7 y 1 en los registros al y bl. Acto seguido, hacemos uso de la operación lógica AND para comprobar si el número que se ha cargado en el registro al es par o impar.
- Si el número es par, el resultado será cero. Por ende, se establece la bandera de cero (zf) en 1.
- Si el número es impar, el resultado será 1. Por ende, se establece la bandera de cero (zf) en 0.
Después, el programa utiliza la instrucción jz para saltar a la etiqueta "espar" si la bandera de cero está establecida, es decir, si el número es par. Si la bandera de cero no está establecida, el programa salta a la siguiente instrucción, que muestra la cadena de caracteres "Es impar". En la etiqueta "espar", el programa muestra la cadena de caracteres "Es par" utilizando las interrupciones del sistema operativo. Luego, el programa salta a la etiqueta "salir". En la etiqueta "salir", el programa utiliza las interrupciones del sistema operativo para salir del programa.
Resultados
Análisis
En esta práctica hemos hecho uso de conocimientos adquiridos en prácticas pasadas para resolver la problemática en esta práctica actual la cual fue bastante sencillo de comprender obteniendo de esta manera los resultados esperados.
Conclusiones
Podemos concluir en que el programa funciona correctamente al momento de verificar si un número es par o impar mostrando el resultado de dicho análisis en la consola del sistema después de realizar operaciones lógicas para determinar el resultado. Este tipo de conocimientos nos pueden ser de utilidad en futuras prácticas con una complejidad mayor.
Referencias
- NA.
Práctica #4: If/If-else
Resumen
En esta práctica realizamos un programa que realiza una comparación entre dos números e imprime un resultado en la consola del sistema.
Objetivo
Conocer y aplicar las estructuras de control en lenguaje ensamblador.
Introducción
Las estructuras de control son herramientas fundamentales en la programación que permiten controlar el flujo de ejecución de un programa y en Ensamblador esto no es una excepción. Estas estructuras permiten al ordenador tomar decisiones, repetir bloques de código y saltar a diferentes partes del programa en función de ciertas condiciones que sean cumplidas. Para esta práctica haremos uso del IF y del ELSE
Metodología
Código
Empezamos definiendo una sección de datos que no han sido inicializados (.bss) y una variable llamada "resultado" de un byte de tamaño para almacenar el resultado de la comparación. Luego definimos la sección de texto y declaramos la etiqueta _start como el punto de entrada del programa. Con los comandos mov eax, 5 y mov ebx, 9 muevemos los valores 5 y 9 a los registros eax y ebx. Después, con el comando cmp eax, 6 compara el valor de eax con el valor 6. Si eax es igual a 6, se salta a la etiqueta "funcionif" mediante la instrucción "jz funcionif". Si no es igual, salta a la etiqueta "funcionelse" mediante la instrucción "jnz funcionelse".
- La etiqueta "funcionif" mueve el valor 1 a la variable ebx.
- La etiqueta "funcionelse" mueve el valor 0 a la variable ebx.
- La etiqueta salir agrega 48 al valor de ebx (para convertirlo en el código ASCII correspondiente al número) y mueve el valor de ebx a la variable resultado.
- Las siguientes líneas utilizan la llamada al sistema int 0x80 para imprimir el valor de la variable resultado en la consola.
Finalmente, se utiliza la llamada al sistema int 0x80 nuevamente para salir del programa. Establecemos en el registro eax un 1 para indicar que el programa se está cerrando y el registro ebx se establece en 0 para indicar que no se produjo un error.
Resultados
Análisis
Pudimos aplicar de manera eficiente los conocimientos de prácticas anteriores resolviendo de manera sencilla la problemática presentada logrando llegar al resultado deseado.
Conclusiones
En conclusión, el programa realizado durante esta práctica es capaz de realizar comparaciones de manera exitosa así como se haría con cualquier lenguaje de programación de alto nivel. Esta práctica fue un buen comienzo para sumergirnos a utilizar estructuras de control cada vez más complejas mientras cursamos la materia.
Referencias
- NA.
Práctica #5: For
Resumen
Para esta práctica vamos a utilizar un cicle for para realizar operaciones aritméticas e imprimir el resultado en la consola del sistema.
Objetivo
Conocer y aplicar las estructuras de control en lenguaje ensamblador.
Introducción
Las estructuras de control son herramientas fundamentales en la programación que permiten controlar el flujo de ejecución de un programa y en Ensamblador esto no es una excepción. Estas estructuras permiten al ordenador tomar decisiones, repetir bloques de código y saltar a diferentes partes del programa en función de ciertas condiciones que sean cumplidas. Para esta práctica haremos uso del ciclo FOR.
Metodología
Código
Posteriormente, el programa asigna el valor 3 al registro "ecx", y asigna los valores 0 y 3 a los registros "eax" y "ebx", respectivamente. Luego, se ejecuta un ciclo for que realiza varias operaciones aritméticas con los valores de "ecx" y "ebx", con el objetivo de sumar solo los números impares (1 y 3).
En cada iteración del bucle, se verifica si "ecx" y "ebx" tienen algún bit en común utilizando la operación "and". Si tienen un bit en común, el programa resta 2 de "ebx". Luego, agrega el valor de "ecx" a "eax" y utiliza la instrucción "loop" para repetir el bucle hasta que "ecx" sea cero.
Después de salir del bucle, el programa convierte el valor de "eax" a su correspondiente valor ASCII, lo guarda en la variable "resultado", y lo imprime en la consola del sistema utilizando la llamada al sistema "int 0x80". Finalmente, el programa termina su ejecución mediante otra llamada al sistema "int 0x80".
Resultados
Análisis
La utilización de la estructura "for" en lenguaje ensamblador es bastante beneficioso ya que permite una programación más eficiente y precisa haciendo solamente las iteraciones necesarias según lo que necesite el programa.
Conclusiones
En conclusión, la implementación de un ciclo for en un programa es bastante sencillo una vez que se ha adquirido el conocimiento necesario para lo mismo. Aplicar este tipo de estructuras de control es de gran beneficio ya que nos permite tener un mejor control de nuestros programas tal y como su nombre lo indica.
Referencias
-NA
Práctica #6: Procedimiento
Resumen
En está práctica vemos el funcionamiendo de los procedimientos en el lenguaje Ensammblador.
Objetivo
Conocer el funcionamiento de los procedimientos en ensamblador.
Introducción
Un procedimiento es un conjunto de instrucciones que realizan una tarea específica dentro de un programa más grande. Se utilizan para estructurar programas más grandes en secciones más manejables y reutilizables. Los procedimientos permiten a los programadores escribir código modular, reutilizable y fácil de mantener, ya que pueden ser llamados desde diferentes partes del programa.
Metodología
Código
Empezamos declarando nuestros mensajes en la sección .data. También se crean variables para guardar la longitud de las cadenas. Cada mensaje está seguido por los caracteres 0xA y 0xD, que representan los caracteres de nueva línea y de retorno de carro respectivamente. En la sección .text, se define la etiqueta "imprime" la cual contiene instrucciones que se repiten cada que sea necesario imprimir en la consola haciendo uso de la llamada al sistema write y la interrupción 0x80. Por otro lado, la instrucción "ret" devuelve el control al llamador, es decir, cuando es llamado se ejecuta el bloque de código y regresa justo a donde fue llamado.
Acto seguido abrimos la sección de _start en la cual vamos a cargar la dirección de nuestro primer mensaje en el registro ecx y la longitud del mismo en el registro edx. Acto seguido, con CALL llamamos a nuestra etiqueta imprime para realizar la impresión en consola del primer mensaje. Después, se carga el valor 1 en el registro eax, que indica la llamada al sistema exit. Se carga el valor 0 en el registro ebx y se realiza una interrupción 0x80 para salir del programa.
Resultados
Analisis
Hemos podido llegar al resultado esperado con bastante facilidad, logrando imprimir nuestro mensaje por medio de procedimientos en Ensamblador.
Conclusiones
A pesar de que fue una práctica bastante sencilla, podemos concluir en que el uso de procedimientos ofrece varias ventajas en cuanto a modularidad y reutilización de código se refiere, optimizando de está forma códigos de mayor tamaño y facilitando su legibilidad.
Referencias
- NA.
Práctica #7: Macro
Resumen
En está práctica vemos como imprimir mensajes en la consola del sistema haciendo uso de llamadas al sistema proporcionadas por el mismo mientras usamos una macro definida por nosotros mismos para simplificar el proceso de impresión de dichos mensajes.
Objetivo
COnocer y aplicar los macros en Ensamblador.
Introducción
Los macros son una herramienta de gran utilidad que nos permite simplificar y acelerar el proceso de programación pues permiten la definición de código reutilizable. Un macro es un conjunto de instrucciones que se pueden definir en una sola línea y que se pueden llamar múltiples veces en diferentes partes del programa. Pueden ser de mucha utilidad cuando tenemos código repetitivo.
Metodología
Código
Empezamos nuestro código definiendo una macro llamada "imprime" que en este caso nos ayudará a simplificar la impresión de mensajes en la consola del sistema. Para su funcionamiento, imprime toma dos argumentos: el mensaje que se imprimirá y la longitud de dicho mensaje. La macro hace uso de la misma llamada al sistema que hemoss utilizado en prácticas anteriores, pero en este caso simplificando la instrucción de impresión como podemos observar en el código.
Acto seguido despues de declarar la macro, el la sección .data definimos dos mensajes siendo msg1 y msg2 respectivamente junto con sus respectivas longitudes, seguido de ello podemos ver que se les añadio el salto de línea y retorno de carro de acuerdo a sus carácteres en ASCII (10 y 13).
Acto seguido, en la sección .text hacemos uso de nuestra macro dos veces para hacer la impresión de nuestros mensajes definidos en la sección previa. Después de la impresión, el programa finaliza como se ha visto en anteriores prácticas.
Resultados
Analisis
Sin muchas complicaciónes fue posible llegar al resultado esperado cumpliendo el objetivo de la práctica.
Conclusiones
Podemos concluir en que los macros, pueden resultar de mucha utilidad para simplificar nuestro código en cuánto a estructura y legibilidad se trata pues estos ayudan a evitar escribir código que suele ser repetitivo optimizando de está manera el mismo pues reduce las líneas de código.
Referencias
- NA