Lenguaje Ensamblador

Porque un lenguaje ensamblador?

Comunmente los ingenieros en software  utilizamos lenguajes que son ciertamente entendibles para el ser humano al tratar de ordenarle a la computadora que realize ciertas acciones.
A esta accion le llamamos programar.

No es mas que escribirle una serie de instrucciones en una archivo de texto para que despues mediante un proceso de compilacion y traduccion ese archivo sea entendible por la computadora.

La computadora solo entiende una secuencia binaria de ceros y unos 0,1. A esto le llamaremos lenguaje maquina, ya que es el lenguaje que la maquina puede comprender con respecto a su hardware.

Cada vez que nosotros reservamos una variable al momento de hacer un programa, lo que en realidad esta pasando es que una secuencia binaria es enviada y procesada por el maquina y con un conjunto de acciones basicas logra cumplir su funcion.

Este tipo de secuencias de numeros binarios al que denominaremos instruccion, es facilmente comprendida por la maquina, pero por los programadores es practicamente imposible saber que es lo que una secuencia como 0001110101001011010010 seria capaz de realizar al ser ejecutada.

Ahora que sabemos lo dificil que seria darle instrucciones directas a una maquina, debemos saber que es posible utilizar la propia maquina para ayudarnos a traducir lenguaje comprensible a lenguaje maquina. Es decir que si a una maquina especifica se le proporcionaba de un programa especifico que tradujera caracteres alfabeticos a instrucciones binarias, se podia construir un programa constituido de caracteres entendibles para los humanos, en el cual se utilizarian palabras especificas para realizar acciones concretas de la maquina.

 Entonces de ahora en delante la maquina podria tomar codigo que los humanos entendemos para poder traducirlo a un codigo que ella especificamente entienda. A esas palabras especificas se les llama mnemotecnico y existe un mnemotecnico para cada instruccion. se les llama asi porque ayudan a recordar el conjunto de instrucciones de una determinada maquina.
A los programas que logran pasar del programa escrito en forma de instrucciones de mnemotecnicos a un lenguaje maquina se les conoce como ensambladores.

Porque utilizar un lenguaje ensamblador?



  • A diferencia de un lenguaje de alto nivel, los programas que se escriben en un lenguaje ensamblador requieren mucho menos memoria y tienen un tiempo de ejecuccion mucho menor.
  • Los lenguajes ensambladores le dan la posibilidad a el programador de realizar acciones muy especificas y tecnicas que al contrario de los lenguajes de alto nivel son dificiles de realizar.
  • El conocimineto del lenguaje ensamblador de una maquina en especifico le confiere una compresion de la arquitectura de dicha maquina mucho mayor que la que le confiere un lenguaje de alto nivel.
  • Por lo general es una buena practica recodificar en lenguaje ensamblador las rutinas de aquellos sistemas que requieren de un procesamiento muy tardado, para asi optimizar las rutinas que le conlleven mas problemas a dicho sistema.
  • Si se quiere implementar porciones de código en un lenguaje de bajo nivel como ensamblador para disminuir el tiempo de procesamiento. Por ejemplo, en aplicaciones que necesiten renderizar gráficos 3D que requieren más tiempo de procesamiento, habrá que escribir una librería para gráficos en lenguaje ensamblador para tener un mejor rendimiento
  • Los programas que realizan interrupciones  y rutinas de servicio para los sistemas operativos casi siempre estan escritos en un lenguaje ensamblador.
Un lenguaje ensamblador trabaja sobre los registros del procesador interno de la maquina los cuales sirven par a controlar la ejecuccion, la memoria y proporcionan capacidad aritmetica, estos poseen 16 bits que se enumeran de izquierda a derecha. 15,14,13,...,0.
Nota: En arquitecturas x86 el largo de estos registros aumento a 32 bits, y eso se refleja en el codigo ensamblador anteponiendo la letra E (Extended) a los registros.

Tabla de Registros
Registro de datos  Estos registros se pueden direccionar como parte de una palabra o de un byte, el ultimo byte de la izquierda es considerado la parte alta y el ultimo byte de la derecha la parte baja. Como podemos ver en la tabla de registros, cada registro consta de una parte alta ( High ) y una baja ( Low ), es decir consta de 8 bits para cada parte, del 0 al 7 Low, del 8 al 15 high.
  • Registro AX ( Acumulador ). Este se utiliza en las operaciones E/S y en las   aritmeticas. Es el mas eficiente de los registros de datos.
  • Registro BX  ( Base ). Registro de proposito general que puede servir para direccionamiento o para hacer calculos.
  • Registro CX  ( Contador ). Conocido como registro contador, puede tener valores que controlan los ciclos o el valor del corrimiento de los bits.
  • Registro DX  ( Datos ). Este se utiliza en las operaciones E/S y por lo general las operaciones aritmeticas de punto flotante en conjunto con AX.
Registros de Apuntadores e indices Estos registros estan asociados con el registro de segmento de pila y permiten el acceso a los datos de este segmento.
  • Registro SP  (Stack Pointer / Apuntador de Pila ). Proporciona una valor de desplazamiento que se refiere a la palabra actual que esta siendo procesada.
  • Registro BP  (Base Pointer / Apuntador de Base ). Facilita la referencia de los parametros los cuales son datos y  direcciones transmitidas en la pila.
  • Registro SI  (Indicie fuente ) Esta asociado con el segmento de datos y en conjunto realizan operaciones con caracteres.
  • Registro DI  (Indice destino ) Al igual que el SI, este registro esta asociado con el segmento extra para realizar operaciones de cadenas de caracteres.
Registros de segmentos Son segmentos de 16 bits que facilitan el area de memoria para direccionamiento conocida como el segmento actual, es decir son partes de memoria que pueden pasar a estar en ejecuccion.
  • Registro CS  ( Segmento de Codigo ) Aqui se almacenan las instrucciones para ser ejecutadas.
  • Registro DS  ( Segmento de Datos ) Aqui se almacenan los datos para su uso posterior
  • Registro SS  ( Segmento de Pila ) Este registro permite el almacenamiento  en memoria de una pila, para guardar temporalmente datos y direcciones.
  • Registro ES  ( Segmento Extra ) Este registro se usa para operaciones con cadenas de caracteres.
El IP ( Instruction pointer / Puntero de instrucciones ) es un puntero que se usa con la mayoria de los registros de segmento para dar la direccion de cierta parte de datos de cada uno de esos registros.

Tambien esta un registro general que guarda las banderas que se pueden utilizar al momento de programar para señalar algunos eventos.

Flags

Cada uno refiere a un motivo diferente.

  • Overflow Flag (desbordamiento) Indica que se desbordo un bit despues de una operacion matematica.
  • Direction Flag (direccion) Indica la direccion hacia la izquierda o derecha para mover o comparar cadenas de caracteres.
  • Interruption Flag (interrupcion) Indica si deben ser tomadas en cuenta las interrupciones externas.
  • Trap Flag (trampa) permite la ejecuccion paso por paso, para debugeo.
  • Sign Flag (signo) el ultimo bit de la mantisa, contiene si es positivo o negativo
  • Zero Flag (cero) indica si el resultado de una comparacion aritmetica es uno(resultado es cero) o zero(resultado diferente de cero)
  • Auxiliar Flag (auxiliar) contiene un acarreo externo del BIT 3 en un dato de 8 bits para aritmética especializada.
  • Parity Flag (paridad) indica paridad en los bits de bajo nivel
  • Carry Flag (acarreo) contiene el acarreo de alto nivel despues de operaciones aritmeticas.

Referencias:
PDF assembly work creado por Carlos Navarro
Linux Assembly

One thought on “Lenguaje Ensamblador

Ever Medina. Con la tecnología de Blogger.