Ir al contenido principal

Introducción al lenguaje ensamblador


1.1 Importancia de la programación en lenguaje ensamblador
Definición: El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de microprocesador.

La importancia del lenguaje ensamblador es 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 el 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.

1.2 El procesador y sus registros internos 
Que es un 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.

Definición de 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).
1.3 La memoria principal (RAM)


La memoria principal o primaria,"Memoria Central ", es aquella memoria de un
ordenador, donde se almacenan temporalmente tanto los datos como los
programas que la CPU está procesando o va a procesar en un determinado
momento. Por su función, es una amiga inseparable del microprocesador, con el
cual se comunica a través de los buses de datos. Por ejemplo, cuando la CPU
tiene que ejecutar un programa, primero lo coloca en la memoria y después lo 
empieza a ejecutar. Lo mismo ocurre cuando necesita procesar una serie de
datos; antes de poder procesarlos los tiene que llevar a la memoria principal.

Esta clase de memoria es volátil, es decir que, cuando se corta la energía
eléctrica, se borra toda la información que estuviera almacenada en ella.

Por su función, la cantidad de memoria RAM de que disponga una computadora
es una factor muy importante; hay programas y juegos que requieren una gran
cantidad de memoria para poder usarlos. Otros andarán más rápido si el sistema
cuenta con más memoria RAM.

La memoria Caché: dentro de la memoria RAM existe una clase de memoria
denominada Memoria Caché que tiene la característica de ser más rápida que las
otras, permitiendo que el intercambio de información entre el procesador y la
memoria principal sea a mayor velocidad.

1.4 El concepto de interrupciones
Definición: 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.

Dentro de una computadora existen dos clases de interrupciones: Interrupciones por software: Son aquellas programadas por el usuario, es decir, el usuario decide cuando y donde ejecutarlas, generalmente son usadas para realizar entrada y salida.

Interrupciones por hardware: Son aquellas que son provocadas por dispositivos externos al procesador su característica principal es que no son programadas, esto es, pueden ocurrir en cualquier momento en el programa. Existen dos clases de interrupciones de este tipo: 
  • Interrupciones por hardware enmascarables: Aquellas en las que el usuario decide si quiere o no ser interrumpido. 
  • Interrupciones por hardware no enmascarables (NMI): Aquellas que siempre interrumpen al programa. 
Las interrupciones por software se ejecutan con ayuda de las instrucciones: INT e IRET, además se tiene 256 interrupciones: de la 00 a la FF.  

Asociado al concepto de interrupción se tiene un área de memoria llamada vector de interrupciones; la cual contiene las direcciones de las rutinas de servicio de cada interrupción. Esta área se encuentra en el segmento 0000:0000.

1.5 Llamadas a servicios del sistema
Es el mecanismo usado por una aplicación para solicitar un servicio al sistema operativo. 

Las llamadas al sistema comúnmente usan una instrucción especial de la CPU que causa que el procesador transfiera el control a un código privilegiado. previamente especificado por el mismo código. Esto permite al código privilegiado especificar donde va a ser conectado así como el estado del procesador. 

Cuando una llamada al sistema es invocada, la ejecución del programa que invoca es interrumpida y sus datos son guardados, normalmente en su PCB (Bloque de Control de Proceso del inglés Process Control Block), para poder continuar ejecutándose luego. El procesador entonces comienza a ejecutar las instrucciones de código de alto nivel de privilegio, para realizar la tarea requerida. Cuando esta finaliza, se retorna al proceso original, y continúa su ejecución. El retorno al proceso demandante no obligatoriamente es inmediato, depende del tiempo de ejecución de la llamada al sistema y del algoritmo de planificación de CPU. 

1.6 Modos de direccionamiento
Los llamados modos de direccionamiento son las diferentes maneras de especificar en informática un operando dentro de una instrucción en lenguaje ensamblador. 

Un modo de direccionamiento especifica la forma de calcular la dirección de memoria efectiva de un operando mediante el uso de la información contenida en registros y / o constantes, contenida dentro de una instrucción de la máquina o en otra parte. 

Diferentes arquitecturas de computadores varían mucho en cuanto al número de modos de direccionamiento que ofrecen desde el hardware. Eliminar los modos de direccionamiento más complejos podría presentar una serie de beneficios, aunque podría requerir de instrucciones adicionales, e incluso de otro registro. Se ha comprobado que el diseño de CPUs segmentadas es mucho más fácil si los únicos modos de direccionamiento que proporcionan son simples.

La mayoría de las máquinas RISC disponen de apenas cinco modos de direccionamiento simple, mientras que otras máquinas CISC tales como el DEC VAX tienen más de una docena de modos de direccionamiento, algunos de ellos demasiado complejos. El mainframe IBM System/360 disponía únicamente de tres modos de direccionamiento; algunos más fueron añadidos posteriormente para elSystem/390. 

Cuando existen solo unos cuantos modos, estos van codificados directamente dentro de la propia instrucción (Un ejemplo lo podemos encontrar en el IBM/390, y en la mayoría de los RISC). Sin embargo, cuando hay demasiados modos, a menudo suele reservarse un campo específico en la propia instrucción, para especificar dicho modo de direccionamiento. El DEC VAX permitía múltiples operandos en memoria en la mayoría de sus instrucciones, y reservaba los primeros bits de cada operando para indicar el modo de direccionamiento de ese operando en particular. 

Incluso en computadores con muchos modos de direccionamiento, algunas medidas realizadas a programas indican que los modos más simples representan cerca del 90% o más de todos los modos de direccionamiento utilizados. Dado que la mayoría de estas medidas son obtenidas a partir de códigos de alto nivel generados a partir de compiladores, nos da una idea de las limitaciones que presentan los compiladores que se utilizan.

1.7 Proceso de ensamblado y ligado
  1. El programa utiliza un editor de texto para crear un archivo de texto ASCII, conocido como archivo de código fuente.
  2. 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.
  3. 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.
  4. 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.

Comentarios

Entradas más populares de este blog

Unidad III: Configuración y administración del espacio en disco

3.1 Estructuras lógicas de almacenamiento  Para la gestión del almacenamiento de una base de datos existen 4 conceptos bien definidos que deben ser conocidos para poder comprender la forma en la que se almacenan los datos. Vamos a ver la diferencia entre bloque, extensión, segmento y espacio de tablas. Bloques: Se tratan de la unidad más pequeña. Generalmente debe múltiple del tamaño de bloque del sistema operativo, ya que es la unidad mínima que va a pedir Oracle al sistema operativo. Si no fuera múltiple del bloque del sistema se añadiría un trabajo extra ya que el sistema debería obtener más datos de los estrictamente necesarios. Se especifica mediante DB_BLOCK_SIZE. Extensiones: Se forma con uno o más bloques. Cuando se aumenta tamaño de un objeto se usa una extensión para incrementar el espacio. Segmentos: Grupo de extensiones que forman un objeto de la base de datos, como por ejemplo una tabla o un índice. Espacio de tablas: Formado por uno o más datafiles, cada da...

Conexion MySQL Workbench con Python

CODIGO (FORMA 1): import pymysql try: conexion = pymysql.connect(host='localhost',user='root',password='kennethbd',db='escuela') print("Conexión correcta") except (pymysql.err.OperationalError, pymysql.err.InternalError) as e: print("Ocurrió un error al conectar: ", e) CODIGO (FORMA 2): import pymysql ############### CONFIGURAR ESTO ################### # Abre conexion con la base de datos db = pymysql.connect(host='localhost',user='root',password='kennethbd',db='escuela') ################################################## # prepare a cursor object using cursor() method cursor = db.cursor() # ejecuta el SQL query usando el metodo execute(). cursor.execute("SELECT VERSION()") # procesa una unica linea usando el metodo fetchone(). data = cursor.fetchone() print ("Database version : {0}".format(data)) # desconecta del servidor db.close() NOTA (FORMA 2) Si corres este...

Ejemplos de Lenguaje Ensamblador (Emu8086)

Ejemplos de lenguaje ensamblador Programa 1 Programa que muestre como mensaje en la pantalla "Hello World" Código: https://gist.github.com/46e552d13e29cc398d48ce6bfe195eb9.git Resultado: Programa 2 Programa que convierta números de decimal a binario Código: https://gist.github.com/46af226806fdfa4c94359dd9c982d6e7.git Resultado: Programa 3 Programa que verifica si dos cadenas son iguales Código: https://gist.github.com/7c9d5013124f78a94341696756c9c25d.git Resultado: Programa 4 Escribir un código que verifique si una cadena es subcadena de otra. Por ejemplo: «la Mu» es subcadena de «Hola Mundo». La cadena: «233» es subcadena de la cadena «2122432234» Código: https://gist.github.com/Kenneth9951/20bd7ed7b9871018af99aab6685e7f3f Resultado: Programa 5  Escribir un código que verifique que todas los caracteres de una cadena se encuentran en otra. Por ejemplo: todas las letras de la cadena «casa» se encuentran en «escaso». Pero no todas las letras de «cerro» se en cuentran en «recana...