Importancia de la programación en lenguaje ensamblador
La importancia del lenguaje ensamblador radica
principalmente que se trabaja directamente con el microprocesador; por lo cual
se debe de conocer el funcionamiento interno de este, tiene la ventaja de que
en él se puede realizar cualquier tipo de programas que en los lenguajes de
alto nivel no lo pueden realizar. Otro punto sería que los programas en
ensamblador ocupan menos espacio en memoria.
El lenguaje ensamblador, es un lenguaje de programación de
bajo nivel. Consiste en un conjunto de mnemónicos que representan instrucciones
básicas para los computadores, microprocesadores, micro controladores y otros
circuitos integrados programables. Implementa una representación simbólica de
los códigos de máquina binarios y otras constantes necesarias para programar
una arquitectura de procesador y constituye la representación más directa del
código máquina específico para cada
arquitectura legible por un programador.
Ventajas
- Como trabaja directamente con el microprocesador al ejecutar un programa, pues como este lenguaje es el más cercano a la máquina la computadora lo procesa más rápido.
- Eficiencia de tamaño .- Un programa en ensamblador no ocupa mucho espacio en memoria porque no tiene que cargan librerías y demás como son los lenguajes de alto nivel
- Flexibilidad. - Es flexible porque todo lo que puede hacerse con una máquina, puede hacerse en el lenguaje ensamblador de esta máquina; los lenguajes de alto nivel tienen en una u otra forma limitantes para explotar al máximo los recursos de la máquina.
Características
- El código escrito en lenguaje ensamblador posee una cierta dificultad de ser entendido ya que su estructura se acerca al lenguaje máquina, es decir, es un lenguaje de bajo nivel.
- El lenguaje ensamblador es difícilmente portable, es decir, un código escrito para un microprocesador, puede necesitar ser modificado, para poder ser usado en otra máquina distinta. Al cambiar a una máquina con arquitectura diferente, generalmente es necesario reescribirlo completamente.
- Los programas hechos por un programador experto en lenguaje ensamblador son generalmente mucho más rápidos y consumen menos recursos del sistema (memoria RAM y ROM) que el programa equivalente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje ensamblador se pueden crear programas que se ejecutan más rápidamente y ocupan menos espacio que con lenguajes de alto nivel.
- Con el lenguaje ensamblador se tiene un control muy preciso de las tareas realizadas por un microprocesador por lo que se pueden crear segmentos de código difíciles y/o muy ineficientes de programar en un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje ensamblador se dispone de instrucciones del CPU que generalmente no están disponibles en los lenguajes de alto nivel.
- También se puede controlar el tiempo en que tarda una rutina en ejecutarse, e impedir que se interrumpa durante su ejecución.
El procesador y sus registros internos
Procesador
Es un circuito electrónico que funciona a la velocidad
de un reloj interno, gracias a un cristal de cuarzo que, sometido a una
corriente eléctrica, envía pulsos, denominados pines.
Partes del procesador
Partes Lógicas
- Unidad de Control: Unidad encargada de Activar o Desactivar los diferentes componentes del procesador, igualmente se encarga de Interpretar y ejecutar las diferentes instrucciones almacenadas en la memoria principal.
- Unidad Aritmética y Lógica: Se encarga de realizar la operación de transformación de datos, especialmente las operaciones matemáticas, el cual es denominado FPU
- Registros: Se denominan a las áreas de almacenamiento temporal usadas durante la ejecución de las instrucciones.
Partes Físicas
- Encapsulado: Es lo que rodea a la oblea de silicio, dándole consistencia y protección para impedir su deterioro.
- Zócalo: Lugar donde se inserta el procesador, permitiendo la conexión con el resto del equipo.
- Chipset: Conjunto de Chips encargados del control de las determinadas funciones del equipo.
- Memoria Cache: Parte donde se almacenan los datos con más frecuente.
Registros
Un registro es una memoria de alta velocidad y poca
capacidad, integrada en el microprocesador, que permite guardar
transitoriamente y acceder a valores muy usados, generalmente en operaciones
matemáticas. Se utilizan para aumentar la velocidad de ejecución de los
programas.
Su función es la de almacenar datos, siendo la manera más rápida de
hacerlo por el sistema. Los registros se miden en número de bits que almacenan.
La CPU, en cambio, comparte un conjunto de localidades de almacenamiento
temporal de datos de alta velocidad, denominada con el mismo nombre: registro.
Tipos de registros
Registros de propósito especifico almacenan información específica sobre el estado del sistema
como el puntero de pila o el registro de estado.
Permiten llevar un récord de estado del procesador en todo
momento. Los más importantes son el contador de programa (PC), el registro de
banderas, y el apuntador de pila (SP).
Función de los registros
Los registros están en la cumbre de la jerarquía de memoria,
y son la manera más rápida que tiene el sistema de almacenar datos. Los
registros se miden generalmente por el número de bits que almacenan; por
ejemplo, un "registro de 8 bits" o un "registro de 32 bits “.
La CPU contiene un conjunto de localidades de
almacenamiento temporal de datos de alta velocidad llamada registro. Algunos de
los registros están dedicados al control, y solo la unidad de control tiene
acceso a ellos. Los registros restantes son los registros de uso general y el
programador es el usuario que tiene acceso a ellos.
Registros básicos
Dentro del conjunto básico de registros de control se deben incluir a los siguientes:- Contador de programa (PC).
- Registro de direcciones de la memoria (MAR).
- Registro de datos (RD).
- Registro de instrucciones (IR).
- Palabra de estado de programa (PSW).
Memoria principal(RAM)
La memoria de acceso aleatorio (Random Access Memory, RAM)
se utiliza como memoria de trabajo de computadoras y otros dispositivos para el
sistema operativo, los programas y la mayor parte del software. En la RAM se
cargan todas las instrucciones que ejecuta la unidad central de procesamiento
(procesador) y otras unidades del computador, además de contener los datos que
manipulan los distintos programas.
Se denominan de acceso aleatorio porque se puede leer o
escribir en una posición de memoria con un tiempo de espera igual para
cualquier posición, no siendo necesario seguir un orden para acceder (acceso
secuencial) a la información de la manera más rápida posible.
La RAM es uno de los tipos más rápidas de memoria, y tiene
la capacidad de permitir que los datos sean leídos y escritos. Cuando la
computadora está apagada, todo el contenido almacenado en RAM se purga. La
memoria principal está disponible en dos tipos: la memoria dinámica de acceso
aleatorio (DRAM) y la memoria estática de acceso aleatorio (SRAM).
Proceso
La unidad central de proceso es uno de los componentes más
importantes en el equipo. Es el lugar donde se realizan diversas tareas y se
genera una salida. Cuando el microprocesador completa la ejecución de un
conjunto de instrucciones, y está listo para realizar la siguiente tarea,
recupera la información que necesita de RAM. Típicamente, las direcciones
incluyen la dirección donde se encuentra la información que debe ser leída. La
CPU envía la dirección al controlador de la RAM, que pasa por el proceso de
localización de la dirección y la lectura de los datos.
Módulos de RAM
Interrupciones
Una interrupción es una situación especial que suspende la
ejecución de un programa de modo que el sistema pueda realizar una acción para
tratarla. Tal situación se da, por ejemplo, cuando un periférico requiere la
atención del procesador para realizar una operación de E/S.
Una interrupción es el rompimiento en la secuencia de un
programa para ejecutar un programa especial llamando una rutina de servicio
cuya característica principal es que al finalizar regresa al punto donde se
interrumpió el programa.
Tipos de interrupciones
Interrupciones de hardware.
Estas son asíncronas a la ejecución del procesador, es
decir, se pueden producir en cualquier momento independientemente de lo que
esté haciendo el CPU en ese momento
Excepciones
Son aquellas que se producen de forma síncrona a la
ejecución del procesador. Normalmente son causadas al realizarse operaciones no
permitidas tales como la división entre 0, el desbordamiento, el acceso a una
posición de memoria no permitida, etc.
Interrupciones por software
Son aquellas generadas por un programa en ejecución. Para
generarlas, existen distintas instrucciones en el código máquina que permiten
al programador producir una interrupción.
Sistemas de prioridad
El sistema operativo necesita un mecanismo para priorizar
las interrupciones y tratar primero las más urgentes. Para ello, existen varias
alternativas:
- Interrupciones simultáneas: No tienen por qué ocurrir de manera simultánea, sino que se refiere a que en un momento dado puede haber varias interrupciones activas.
- Interrupciones anidadas: Mientras se está procesando una determinada rutina de servicio de interrupción sucede otra señal de interrupción.
- Inhibición de interrupciones: Se deshabilitan las demás interrupciones mientras se está tratando una.
Determinación de la fuente que genera la interrupción
Hay distintas formas de identificar la fuente de una
determinada interrupción.
- Polling: el microprocesador comprueba de manera sistemática todos los dispositivos de manera que «busca» cuál de ellos fue el que solicitó la interrupción.
- Interrupciones vectorizadas: Como ventajas podemos destacar que suele ser rápido, pero implica un alto costo en el hardware.
- Hardware paralelo: se utiliza un registro de interrupción cuyos bits se controlan de forma independiente por las señales de petición de interrupción de cada periférico. Según la posición de cada bit en el registro, se establece la prioridad.
Interrupciones
- int 01h-->un solo paso
- int 02h-->interrupción no enmascarable
- int 03h--> punto de interrupción
- int 04h-->desbordamiento
- int 05h-->impresión de pantalla
- int 08h-->Cronometro
- int 15h-->Servicios del sistema
- int 16h-->Funciones de entrada del teclado
- int 18h-->Entrada con el Basic de ROM
- int 1Ah-->Leer y establecer la hora
- int 1Bh-->Obtener el control con una interrupción de teclado.
- int 2oh-->Terminar un programa
- int 33h->Funciones del Ratón
Llamadas a servicios del sistema
Llamadas al sistema no bloqueantes
Son aquellas llamadas en las que, si lo que se solicita no
está disponible, el proceso no se queda bloqueado, sino que devuelven un valor
especial indicando la condición de información no disponible
Llamadas al sistema bloqueantes
La aplicación se bloquea a la espera del resultado. Si un
hilo hace una llamada bloqueante, todos los hilos se bloquearán. Si hace una
llamada no bloqueante, los demás hilos podrán seguir ejecutando.
Una llamada al sistema es un método o función que puede
invocar un proceso para solicitar un cierto servicio al sistema operativo. Dado
que los accesos a ciertos recursos del sistema requieren la ejecución de código
en modo privilegiado, el sistema operativo ofrece un conjunto de métodos o
funciones que el programa puede emplear para acceder a dichos recursos.
llamadas al sistema
Se activa una interrupción ejecutando una operación especial
conocida “Llamada al sistema"
Esta se lanza cuando:
- Una aplicación de usuario solicita un servicio del sistema operativo.
- Proporciona los medios para que un programa de usuario pida al so que realice tareas reservadas del so en nombre del programa de usuario.
- Una llamada al sistema se invoca de diversas maneras dependiendo de la funcionalidad proporcionada por el procesador subyacente.
- Se trata de un método usado por un proceso para solicitar la actuación del SO.
- Normalmente una llamada al sistema toma la forma de una excepción que efectúa una transferencia a una posición específica en el vector de interrupción.
Tipos de llamadas al sistema
Control de procesos
- Terminar (end), abortar (abort)
- cargar (load), ejecutar (execute)
- crear procesos (create process o submit job), terminar procesos (terminate process)
- fork: inicia un nuevo proceso
- exec:el programa se ejecuta
- obtener atributos del proceso (get process attributes), definir atributos del proceso (set process attributes)
Administración de dispositivos
- solicitar dispositivo (request), liberar dispositivo (release)
- leer (read), escribir (write), reposicionar (reposition)
- obtener atributos de dispositivo, definir atributos de dispositivo
- conectar y desconectar dispositivos lógicamente.
Mantenimiento de la información
- obtener la hora (time) o la fecha (date), definir la hora o la fecha
- obtener datos del sistema, establecer datos del sistema
- obtener los atributos de procesos, archivos o dispositivos
- establecer los atributos de procesos, archivos o dispositivos
Comunicaciones
- crear, eliminar conexiones de comunicación
- enviar, recibir mensajes
- transferir información de estado
Modos de direccionamiento
La memoria de acceso aleatorio, o RAM, es la memoria
principal de una computadora. Las aplicaciones son cargadas y ejecutadas en la
memoria RAM. Los modos de direccionamiento asignan memoria RAM en porciones que
pueden ser referenciadas individualmente para que la unidad central de
procesamiento, o CPU, pueda determinar qué ubicación de memoria está siendo
utilizada por una instrucción de la máquina.
Se les llama modos de direccionamiento a las distintas formas de combinar los operandos según el acceso que se hace a memoria.
Direccionamiento implícito
- Depende solamente de la instrucción, es decir, la instrucción no lleva parámetros.
- Particularmente en instrucciones que no accesan memoria, o bien que tienen una forma específica de accesarla.
Ejemplos: PUSHF, POPF, NOP
Modo registro
- Usa solamente registros como operandos
- Es el más rápido, pues minimiza los recursos necesarios (toda la información fluye dentro del EU del CPU)
Ejemplo: MOV AX, BX
Modo inmediato
- Tiene dos operandos: un registro y una constante que se usa por su valor.
- El valor constante no se tiene que buscar en memoria, pues ya se obtuvo al hacer el “fetch” de la instrucción.
Ejemplo: MOV AH, 9
Modo directo
- Uno de los operandos involucra una localidad específica de memoria
- El valor constante se tiene que buscar en memoria, en la localidad especificada.
- Es más lento que los anteriores, pero es el más rápido para ir a memoria, pues ya “sabe” la localidad, la toma de la instrucción y no la tiene que calcular.
Ejemplo: MOV AH, [0000]
Modo indirecto
- Se usan los registros SI, DI como apuntadores
- El operando indica una localidad de memoria, cuya dirección (sólo la parte desplazamiento) está en SI o DI.
- Es más lento que los anteriores, pues tiene que “calcular” la localidad
Ejemplos: MOV AL, [SI]
Modo indexado de base
Formato: [ BX o BP + SI o DI (opcionales) + constante (opcional) ]- BX o BP indica una localidad base de la memoria
- A partir de BX o BP, se puede tener un desplazamiento variable y uno constante
- La diferencia es el segmento sobre el que trabajan por defecto:
- BX por defecto en el segmento de datos
- BP por defecto en el segmento de pila.
Ejemplos:
- MOV AX, [BX]
- MOV DX, [BX+2]
- MOV CX, [BX+DI]
- MOV DL, [BX+SI+3]
Absoluto
El campo de operando contiene una dirección en memoria, en
la que se encuentra la instrucción. Y no se cancela.
Indirecto recursivo
Unos pocos sistemas como el PDP-6 o el PDP-10 tenían la
posibilidad de direccionamiento indirecto recursivo. Tal dirección de memoria
indirecta tenía un campo de registro para indexación y posiblemente un otro bit
indirecto, de modo que el proceso de direccionamiento indirecto con indexación
podría teóricamente repetirse cualquier número de veces hasta que se encontrara
una dirección sin un bit indirecto en la cadena.
Indirecto mediante registros
El campo de operando de la instrucción contiene un identificador
de registro en el que se encuentra la dirección efectiva del operando.
El control localiza la instrucción de la memoria y utiliza
su parte de dirección para acceder a la memoria de nuevo para leer una
dirección efectiva. Unos pocos modos de direccionamiento requieren que el campo
de dirección de la instrucción sea sumado al control de un registro
especificado en el procesador. La dirección efectiva en este modo se obtiene
del siguiente cálculo: Dir. efectiva = Dir. de la parte de la instrucción + Contenido
del registro del procesador.
De desplazamiento
Combina el modo directo e indirecto mediante registros.
De pila
Se utiliza cuando el operando está en memoria y en la
cabecera de la pila.
Este direccionamiento se basa en las estructuras denominadas
Pila (tipo LIFO), las cuales están marcados por el fondo de la pila y el
puntero de pila (*SP). El puntero de pila apunta a la última posición ocupada.
Así, como puntero de direccionamiento usaremos el SP.
El desplazamiento más el valor del SP nos dará la dirección
del objeto al que queramos hacer referencia. En ocasiones, si no existe C. de
desplazamiento solo se trabajará con la cima de la pila.
Proceso de ensamblado y ligado
- El programa utiliza un editor de texto para crear un archivo de texto ASCII, conocido como archivo de código fuente.
- El ensamblador lee el archivo de código fuete y produce un archivo de código objeto, una traducción del programa a lenguaje máquina. De manera opcional, produce un archivo de listado. Si ocurre un error, el programador debe regresar al paso 1 y corregir el programa.
- El enlazador lee el archivo de código objeto y verifica si el programa contiene alguna llamada a los procedimientos en una biblioteca de enlace.
- La herramienta cargadora del sistema operativo lee el archivo ejecutable y lo carga en memoria, y bifurca la CPU hacia la dirección inicial del programa, para que éste empiece a ejecutarse.
Edición
Los archivos fuente de código ensamblador deben estar en
formato ASCII standard. Para esto puede usarse cualquier editor que permita
crear archivos sin formato.
Ensamblado
El ensamblado se lleva a cabo invocando al MASM. Este puede
ser invocado, usando una línea de comando, de la siguiente manera: MASM archivo
[,[objeto][,[listado][,[cross]]]]][opciones][;] Dónde: Objeto.- Es el nombre
para el archivo objeto. Listado. - Nombre del archivo de listado de ensamblado.
cross. Es un archivo de referencias cruzadas.
Objeto. - Es el nombre para el archivo .OBJ Ejecutable. -
Nombre del archivo .EXE Mapa. - Nombre del archivo mapa Librería. - Nombre del
archivo biblioteca de rutinas
Ejecución
Para la ejecución del programa simplemente basta teclear su
nombre en el prompt de MS-DOS y teclear ENTER. Con esto el programa será
cargado en memoria y el sistema procederá a ejecutarlo.
Desplegado de mensajes en el monitor
- Todos los gráficos y el texto que se muestran en el monitor se escriben en la RAM de visualización de video, para después enviarlos al monitor mediante el controlador de video. El controlador de video es en sí un microprocesador de propósito especial, que libera a la CPU principal del trabajo de controlar el hardware de video.
- Un monitor de pantalla de cristal líquido (LCD) digital directo recibe un flujo de bits digitales directamente desde el controlador de video, y no requiere del barrido de trama.
Comentarios
Publicar un comentario