Tema 2 Programación básica - SLVany/Lenguajes-de-Interfaz GitHub Wiki
Un ensamblador es un programa que traduce el código fuente escrito en lenguaje ensamblador a código objeto (también conocido como código binario o de máquina) que la computadora puede ejecutar. El ensamblador es un lenguaje de bajo nivel que se utiliza para programar a nivel de hardware y es muy útil para trabajar directamente con la memoria, los registros y las instrucciones de la CPU.
El ligador es un programa que se utiliza para combinar varios módulos del código objeto y producir un archivo ejecutable que se puede cargar y ejecutar en un sistema informático.
El ensamblador y ligador que se usan dependen del sistema operativo y arquitectura de la CPU en que se desarrolla el programa. Es importante elegir herramientas de desarrollo adecuadas para el trabajo que se este realizando.
Los ciclos numéricos son un tipo de bucle que sirven para repetir una serie de instrucciones un numero determinado de veces. Llegan a ser útiles para procesar matrices y otros conjuntos de datos numéricos.
Existen varias instrucciones en ensamblador como por ejemplo:
- jmp: Salta a una dirección de memoria especifica lo cual permite controlar el flujo del programa.
- cmp: Compara 2 valores y establece la bandera correspondiente según el resultado de la comparación.
- loop: Repite un bloque de instrucciones un numero determinado de veces.
La captura de cadenas es un proceso importante en la programación, ya que permite al programa interactuar con el usuario y procesar datos de entrada.
En ensamblador, la captura básica de cadenas se puede realizar utilizando la función de interrupción 21h del BIOS. Esta función proporciona una amplia variedad de servicios de entrada y salida, incluyendo la lectura de cadenas de caracteres desde el teclado.
Para capturar una cadena de caracteres en ensamblador, el programa primero debe reservar un búfer de memoria donde se almacenará la cadena capturada. El tamaño de este búfer debe ser lo suficientemente grande como para contener la cadena más larga que se espera capturar.
Una vez que se ha reservado el búfer de memoria, el programa puede utilizar la función de interrupción 21h del BIOS para leer una cadena de caracteres desde el teclado y almacenarla en el búfer. La función de interrupción 21h proporciona una variedad de opciones de entrada y salida, incluyendo la opción de leer una cadena de caracteres del teclado y almacenarla en un búfer de memoria.
El lenguaje ensamblador cuenta con instrucciones que por su naturaleza sirven para el manejo de cadenas, estas son:
- movb: 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.
La comparación y prueba son operaciones importantes en la programación que se utilizan para comparar valores y tomar decisiones en función de los resultados.
En ensamblador, la comparación y prueba se realizan utilizando las instrucciones de comparación y prueba, respectivamente. Las instrucciones de comparación se utilizan para comparar dos valores y establecer las banderas del procesador en función del resultado, mientras que las instrucciones de prueba se utilizan para realizar una prueba lógica entre un valor y un conjunto de bits especificado.
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.
- 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.
Los saltos son instrucciones que permiten al programador cambiar el orden de ejecución del programa según sea necesario, dentro de ensamblador existen dos tipos de salto principales: condicionales e incondicionales.
Existen 2 tipos de saltos.
Los saltos condicionales se utilizan para realizar una comprobación y, si se cumple, saltar a una etiqueta específica en el programa. Por ejemplo, la instrucción "je" se utiliza para saltar a una etiqueta si la bandera de cero (ZF) está establecida, mientras que la instrucción "jne" se utiliza para saltar a una etiqueta si la bandera de cero (ZF) no está establecida. Otras instrucciones de salto condicional comunes incluyen "jg" (saltar si mayor), "jl" (saltar si menor), "jge" (saltar si mayor o igual), "jle" (saltar si menor o igual), "jo" (saltar si se produce desbordamiento), y "jno" (saltar si no se produce desbordamiento).
Algunos saltos condicionales son:
- JA: Salta cuando el valor es superior, su condición es equivalente al salto JNBE (Jump if Not Below or Equal).
- JAE: Salta cuando el valor es superior o igual, su condición es equivalente al salto JNB (Jump if Not Below).
- JB: Salta cuando el valor es menor, su condición es equivalente al salto JNAE (Jump if Not Above or Equal).
- JBE: Salta cuando el valor es menor o igual, su condición es equivalente al salto JNA (Jump if Not Above).
Las instrucciones de salto incondicional, por otro lado, simplemente saltan a una etiqueta específica en el programa sin realizar ninguna comprobación. La instrucción "jmp" se utiliza para saltar a una etiqueta específica en el programa, sin importar el estado de las banderas del procesador. La instrucción "call" se utiliza para saltar a una subrutina, guardando la dirección de retorno en la pila, mientras que la instrucción "ret" se utiliza para volver de una subrutina, obteniendo la dirección de retorno de la pila.
Es importante tener en cuenta que los saltos en ensamblador pueden tener un impacto significativo en el rendimiento del programa. Los saltos incondicionales, en particular, pueden causar problemas de rendimiento y dificultar la lectura y mantenimiento del código. Es por eso que se recomienda evitar los saltos incondicionales siempre que sea posible y utilizar una estructura de control más natural y fácil de seguir.
Es posible anidar tantos ciclos como sean necesarios. Esto es muy semejante a lo que ocurra cuando definamos una instrucción que usaba otra instrucción definida antes.
Un ciclo, conocido también como iteración, es la repetición de un proceso un cierto número de veces hasta que alguna condición se cumpla. En estos ciclos se utilizan los brincos "condicionales" basados en el estado de las banderas.
LOOP: Tiene un tamaño de 8 bits y abarca de 00 hasta FF y tiene signo.
Ejecutar un BUCLE consiste en repetir “n” veces una serie de instrucciones de una sección del programa.
Esta instrucción, en el momento que se ejecuta, realiza lo siguientes:
- 1.- Decrementa a cx en un uno. (CX=CX-1)
- 2.- Revisa el valor de cx y si es diferente a 0 realiza el salto correspondiente de acuerdo al valor del desplazamiento, si cx es igual a 0 continua con la siguiente instrucción debajo de ella.
El incremento y decremento son dos técnicas utilizadas en el diseño de interfaces de usuario para aumentar o disminuir la cantidad de información que se presenta al usuario en un momento determinado. Estas técnicas se utilizan comúnmente en interfaces que contienen listas, tablas o gráficos que contienen grandes cantidades de datos.
El incremento se puede lograr de varias maneras, incluyendo la adición de nuevos elementos a una lista, la expansión de una tabla para mostrar más columnas o la adición de más detalles a una vista de gráfico. El objetivo es proporcionar al usuario más información para que puedan tomar decisiones más informadas.
El decremento se puede lograr eliminando elementos de una lista, ocultando columnas en una tabla o reduciendo la cantidad de detalles en una vista de gráfico. El objetivo es simplificar la información que se presenta al usuario para que puedan centrarse en los detalles más relevantes.
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.
La captura de cadenas con formato es una técnica útil en el diseño de interfaces de usuario para asegurarse de que la información ingresada sea coherente y precisa. Esto se logra mediante el uso de expresiones regulares, máscaras de entrada y otras herramientas que permiten al usuario ingresar información en un formato específico. Sin embargo, es importante equilibrar la necesidad de coherencia y precisión con la facilidad de uso y la accesibilidad para el usuario.
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: Transfiere un carácter de una cadena.
MOVW: Transfiere una palabra de una cadena.
CMPC: Compara un carácter de una cadena.
CMPW Compara una palabra de una cadena.
SCAC: Busca un carácter de una cadena.
SCAW: Busca una palabra de una cadena.
LODC: Carga un carácter de una cadena.
LODW: Carga una palabra de una cadena.
STOC: Guarda un carácter de una cadena.
STOW: Guarda una palabra de una cadena.
Las instrucciones aritméticas con formato son una técnica importante en el diseño de interfaces de usuario para presentar información numérica de una manera clara y fácil de entender. Esto se logra mediante el uso de separadores de miles y decimales, gráficos y colores, mensajes de ayuda y guías para el usuario. Al asegurarse de que la información numérica se presente de una manera clara y precisa, se puede mejorar la usabilidad y la eficacia de la aplicación.
Suma ADD: Suma los operandos que se le dan y guarda el resultado en el primer operando
Resta SUB: Resta el primer operando al segundo y almacena el resultado en el primero.
Multiplicacion MUL: Multiplica el valor de un registro acumulador(AX por ejemplo) por otro (DX por ejemplo).
Division DIV: Divide un numero contenido en el acumulador entre el operando fuente, el cociente se guarda en AL o AX y el resto en AH o DX según el operando sea byte o palabra respectivamente.
La manipulación de pila es una técnica importante en el diseño de interfaces de usuario para organizar y acceder fácilmente a la información más reciente o relevante. Esto se logra mediante el uso de una pila, que permite a los usuarios deshacer y rehacer acciones en orden inverso o navegar por el historial de navegación en un navegador web. Al asegurarse de que la manipulación de pila sea fácil de entender y no sea demasiado restrictiva, se puede mejorar la usabilidad y la eficacia de la aplicación.
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). Para usar las pilas hay 2 instrucciones:
Push: Esta instrucción permite almacenar el contenido del operando dentro de la última posición de la pila.
Pop: Esta instrucción toma el último dato almacenado en la pila y lo carga al operando.
La obtención de una cadena con representación decimal en ensamblador es un proceso importante en la programación de sistemas y aplicaciones de bajo nivel que requieren el procesamiento y la manipulación de números. En ensamblador, la representación decimal de un número se obtiene mediante una combinación de operaciones aritméticas y de manipulación de caracteres.
En las computadoras el formato natural para la aritmética es el binario. La representación del número decimal 1; 527 en los tres formatos decimales:
- ASCII 31 35 32 37 (cuatro bytes)
- BCD desempaquetado 01 05 02 07 (cuatro bytes)
- BCD empaquetado 15 27 (dos bytes)
El procesador realiza aritmética en valores ASCII y BCD un dígito a la vez. Ya que los datos son ingresados desde un teclado significan que están en formato ASCII, la representación en memoria de un número decimal ingresado tal como 1234 es 31323334H. Pero realizar aritmética sobre tal número implica un tratamiento especial. Las instrucciones AAA y AAS realizan aritmética de manera directa sobre números ASCCI
Se cuenta con un grupo de instrucciones lógicas que operan a nivel de bit, estas instrucciones son: AND, OR, XOR y NOT.
Las instrucciones que se enlistan antes requieren dos operandos, a excepción de la operación NOT que sólo requiere uno. La operación OR establece el resultado a 1 si cualquiera de los dos operandos es 1, de lo contrario el resultado será 0. La instrucción XOR coloca en 0 el resultado si los operandos son iguales, de lo contrario establece 1. Finalmente, la instrucción NOT cambia de estado todos los bits del operando, los unos por ceros y los ceros por unos.
La principal aplicación de estas instrucciones es el enmascaramiento de información. La operación AND nos permite poner a cero cualquier bit de un dato; la operación OR nos permite poner a uno cualquier bit de un dato y la operación XOR permite borrar el contenido de algún registro o localidad de memoria, así como para negar algún bit.
Es importante tener en cuenta que tanto el desplazamiento como la rotación son operaciones muy utilizadas en la programación de sistemas y aplicaciones de bajo nivel, y permiten la manipulación eficiente de bits. Sin embargo, es importante tener cuidado al realizar estas operaciones ya que pueden producir resultados inesperados si se utilizan incorrectamente.
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.
La rotación se realiza mediante las instrucciones de rotación. En la rotación, los bits se desplazan circularmente, es decir, el bit más significativo se mueve al bit menos significativo y viceversa. Una de las instrucciones de rotación más comunes es la instrucción ROL que rota el registro hacia la izquierda y la instrucción ROR que rota el registro hacia la derecha.
La obtención de una cadena con la representación hexadecimal es una operación común en ensamblador que se utiliza para mostrar los valores de registros o variables en formato hexadecimal. Esta operación es útil para la depuración de programas y para la visualización de datos en hexadecimal, que es un formato comúnmente utilizado en sistemas embebidos y de bajo nivel.
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.
Las variables numéricas son de gran utilidad ya que permiten al programador hacer operaciones aritméticas con datos que se desconocen al momento de la compilación. Esta representación esta basada en la notación científica, esto es, representar un número en dos partes: su mantisa y su exponente.
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.
Las operaciones básicas sobre archivos de disco en programación de bajo nivel y ensamblador incluyen la apertura, lectura, escritura y cierre de archivos en el sistema de archivos del sistema operativo.
Estas operaciones se realizan mediante interrupciones del sistema operativo que permiten acceder a las funciones de la biblioteca de archivos. Estas funciones se encargan de manejar la comunicación con el sistema de archivos y realizar las operaciones requeridas en el archivo especificado. Algunas funciones son:
- Función 00h: Lee un carácter. Esta función maneja las teclas del teclado de 83 teclas, pero no acepta entrada de las teclas adicionales en el teclado ampliado de 101 teclas. Retorna en al el carácter, ah el código de rastreo si al=0 es una tecla de función extendida.
- Función 01h: Determina si un carácter esta presente.
- Función 02h: Regresa el estado actual de las teclas shift.
- Función 10h: Lectura de un carácter del teclado.
- Función 11h: Determina si esta presente un carácter.
- MOVS: Mueve un byte, palabra o palabra doble desde una localidad en memoria direccionada por SI a otra localidad direccionada por DI.
- LODS: Carga desde una localidad de memoria direccionada por SI un byte en AL, una palabra en AX o una palabra doble en EAX.
- STOS: Almacena el contenido de los registros AL, AX, o EAX en la memoria direccionada por SI.
- CMPS: Compara localidades de memoria de un byte, palabra o palabra doble direccionadas por SI, DI.
- SCAS: Compara el contenido de AL, AX o EAX con el contenido de una localidad de memoria direccionada por SI.