miércoles, 1 de junio de 2016

Clases 10 - Codigo_intermedio

Clase 10:
1.       Definición
2.      Historia
3.      Componentes
4.      Software Utilizado
5.      Registros
6.      Instrucciones
7.      Ejemplos

1. definición

El término ensamblador (del inglés assembler) se refiere a un tipo de programa informático que se encarga de traducir un fichero fuente
escrito en un lenguaje ensamblador, a un fichero objeto que contiene
código máquina, ejecutable directamente por la máquina para la que se ha generado.
El propósito para el que se crearon este tipo de aplicaciones es la de facilitar la escritura de programas, ya que escribir directamente en
código binario, que es el único código entendible por la computadora, es en la práctica imposible.

La evolución de los lenguajes de programación a partir del lenguaje ensamblador originó también la evolución de este programa ensamblador hacia lo que se conoce como programa compilador.

2 . historia

El primer compilador fue escrito por Grace Hopper, en 1952 para el lenguaje de programación A-0.
En 1950 John Backus dirigió una investigación en IBM sobre un lenguaje algebraico.
En 1954 se empezó a desarrollar un lenguaje que permitía escribir fórmulas matemáticas de manera traducible por un ordenador; le llamaron FORTRAN (FORmulae TRANslator).
Fue el primer lenguaje de alto nivel y se introdujo en 1957 para el uso de la computadora IBM modelo 704.
El primer compilador de FORTRAN tardó 18 añospersona en realizarse y era muy sencillo.

El primer compilador autocontenido, es decir, capaz de compilar su propio código fuente fue el creado para Lisp por Hart y Levin en el MIT
en 1962. Desde 1970 se ha convertido en una práctica común escribir el compilador en el mismo lenguaje que este compila, aunque Pascal y C han sido alternativas muy usadas.
Crear un compilador autocontenido genera un problema llamado bootstrapping, es decir el primer compilador creado para un lenguaje tiene que o bien ser compilado por un compilador escrito en otro lenguaje o bien compilado al ejecutar el compilador en un intérprete.

3 . componentes

Los elementos básicos del lenguaje ensamblador son:
q  Etiquetas
q  Instrucciones
q  Operandos
q  Directivas
q  Comentarios

etiquetas

Una etiqueta es una palabra utilizada para designar alguna línea o secci ón del programa, se pueden utilizar para saltar de una parte hacia esa etiqueta.
Es importante que las etiquetas empiecen con una letra o con un guión bajo "_". La longitud de una etiqueta puede ser de hasta 32 caracteres y como ya se dijo se deben escribir en la primer columna.

instrucciones

Las instrucciones son las operaciones que realiza el microcontrolador, así que esta s ya están definidas para cada familia de PIC.

Microcontrolador PIC

Los PIC son una familia de microcontroladores tipo RISC fabricados por Microchip Technology Inc. y derivados del PIC1650, originalmente desarrollado por la división de microelectrónica de General Instrument.
El nombre actual no es un acrónimo. En realidad, el nombre completo es PICmicro, aunque generalmente se utiliza como Peripheral Interface Controller (controlador de interfaz periférico)*.

Microcontrolador PIC

operandos

Son los elementos que emplea la instru cción que se está ejecutando. Usualmen te los operandos son los registros, las variables o las constantes.

directivas

Las directivas son similares a las instrucciones, pero a diferencia de
estas las directivas
son propias del lenguaje ensamblador e independientes del microcontr
olador que se utilice.
Las directivas representan algunas características del lenguaje ensambl
ador, se utilizan
para especificar el procesador empleado así como la configuración de e
ste, también para asignar locaciones de memoria.

comentarios

Los comentarios son las palabras, frases y oracione s que se pueden escribir en el código para hacer el programa más claro y legible, o solo para recordar.
Los comentarios se pueden escribir en cualquier parte del código pero siempre deben empezar con punto y coma ";".

4 . Software editores

Un programador escribe el programa origen en lenguaje ensamblador utilizando cualquier editor de textos o procesador de palabras que sea capaz de producir una salida de texto en
ASCII. Una vez que el código origen ha sido escrito, el archivo origen es ensamblado
mediante su procesamiento a través de algún ensamblador.
Para la programación se utiliza una cierta tabulación que se debe respetar, además utilizar
una tabulación adecuada hace los programas más claros y le gibles.
Las etiquetas
se escriben en la primer columna de cualquier línea, las inst rucciones y directivas en la  segunda y por último, en la tercer columna, los operandos. Los comentarios se pueden escribir en cualquier parte del programa.

ENS2001

MASM

TAST


Ejemplo: Hola alumno

4. Software MASM Y TLINK

El Turbo Assembler (TASM) un paquete ensamblador principalmente destinado a la plataforma del IBM PC y sus compatibles.
El enlazador o linkador LINK permite convertir el código objeto generado por TASM en archivo ejecutable de tipo EXE*.
*empleando el ML de MASM 6.X se obtiene directamente el fichero EXE ya que invoca automáticamente al linkador.

5 . registros

Se trata de una serie de "variables", que contienen información que puede ser cambiada.


REGISTROS IP Y CS

El registro CS es una variable de un tamaño de dos bytes. Contiene el Segmento actual en que se encuentra el programa.
El registro IP es la variable, de dos bytes también, que contiene el Offset actual. Esto significa, el ordenador va interpretando las secuencias de bytes, pero necesita "algo" que le indique donde tiene que leer.

COMBINACION DE REGISTROS

IP Y CS

La combinación CS:IP contiene la dirección en la que el ordenador     está     interpretando        información en       el momento. Indica la dirección de la próxima instrucción que se va a ejecutar.
El registro DS y el registro ES también sirven para guardar direcciones de Segmentos, y también son variables de dos bytes, pueden ser utilizados para por ejemplo mover datos en memoria, imprimir cadenas, etc. Son "punteros", que apuntan a cierta zona de memoria. El registro SS apunta a la pila, y el SP es el que contiene el offset de la pila.

REGISTROS AX,BX,CX,DX

Todos ocupan dos bytes, y se pueden utilizar divididos en dos partes con un byte de longitud.  
◦ AX se divide en AH y AL
◦ BX en BH y BL ◦ CX en CH y CL
◦ DX en DH y DL.  
AX
|-----------------------------|
11010110    10111000
AH               AL
La 'H' se refiere a High en inglés, alto (de mayor valor), y la 'L' a Low (de menor valor).

REGISTROS

AX y BX

AX se suele utilizar como propósito general, indica función a las interrupciones, etc., y es el más flexible, ya que ser el único que permita multiplicaciones y divisiones. Se denomina a veces acumulador. Realiza operaciones como entrada/salida de datos, ultiplicación, división, operaciones con decimales codificados en binario, etc.
BX nos servirá mucho como "handler", para abrir/cerrar archivos, etc, y como registro de propósito general al igual que AX, CX y DX. Funciona como registro Base, en algunas ocasiones, para referenciar direcciones de memoria En estos casos mantiene la dirección de base, comienzo de tabla o matrices, en la que la dirección se determina usando valores de desplaza- miento.

REGISTROS cX y dX

CX se suele usar como contador. Es decir, cuenta el número de bits o palabras en una determinada cadena de datos durante los operaciones con cadenas.
◦ Ej: Si se va a mover de un área de memoria a otra n palabras, CX mantiene inicialmente el número total de palabras a desplazar llevando la cuenta de la palabra o byte que va siendo trasladada.
DX suele ser el puntero, señalando haciendo el papel de Offset lugares en memoria. Se usa en la multiplicación para mantener parte del producto de 32 bits o en las divisiones para antener el valor del resto. Y en operaciones de Entrada/Salida de datos para especificar la dirección del puerto de E/S usado.

6 . instrucciones

Se pueden clasificar en los siguientes grupos:
De Transferencia.
Aritméticos.
q  Lógicos.
q  De salto.

INSTRUCCIONES DE TRANSFERENCIA
Este grupo de instrucciones se utiliza para efectuar la transferencia de datos, copian datos de un origen a un destino sin modificar dicho origen. Pueden transferir palabras, fracciones de palabras, o bloques completos.
TRANSFERENCIA push
PUSH: Guarda en la cima de la pila 16 bits, decrementando el puntero de la pila en dos bytes, hay que tener en cuenta que no se puede guardar en la pila el contenido del registro CS o el contenido del registro IP ya que estos deben ser modificados por las instrucciones de salto.
SINTAXIS:
PUSH: reg16
PUSH: mem16
Ejemplo:        PUSH: CX
PUSH: TABLA ( SI )
TRANSFERENCIA pop
POP: Extrae de la cima de la pila el valor de 16 bits almacenado, depositándolo en la dirección de memoria indicada y a diferencia del PUSH incrementa el puntero de la pila en dos bytes, igualmente se debe tener en cuenta que no se debe rescatar valores para los registros CS e IP ya que estos deben ser modificados por las instrucciones de salto.
SINTAXIS:
PUSH: reg16
PUSH: mem16
Ejemplo:        POP: DX
POP: [BX]
TRANSFERENCIA xchg
XCHG: (Intercambio): Consta de dos operandos e intercambia sus valores por lo que modifica los operandos a no ser que tengan idéntico valor, cabe recalcar que no se permite que los operandos estén los dos en la misma memoria.
SINTAXIS:  XCHG destino, origen Indicadores:
Ejemplo:        XCHGN: bl, ch
XCHGN: mem pal, bx

INSTRUCCIONES aritméticas
Son efectuada por la
Unidad Aritmeto – logica (ALU) y suelen cambian los flags o indicadores de
condición.

INSTRUCCIONES aritméticas inc

INC: Incrementa. Suma 1 al contenido de un registro o de una posición de memoria, dicho contenido puede ser byte o palabra.
SINTAXIS: INC  destino
Indicadores: OF  DF  IF TF SF  ZF  AF  PF CF
Ejemplo:       INC AX          ; AX = AX+1
INC DL            ; DL = DL +1
INC WORD PTR ES: [DI+4]; Increm. Palabra contenida
; es ES: DI+4

INSTRUCCIONES aritméticas dec

DEC: Decrementa. resta 1 al contenido de un registro o de una posición de memoria, dicho contenido puede ser byte o palabra.
SINTAXIS: DEC  destino
Indicadores: OF  DF  IF TF SF  ZF  AF  PF CF
Ejemplo:       DEC AX         ; AX = AX+1
DEC DL           ; DL = DL-1
DEC WORD PTR ES: [DI+4] ; Decrem. Byte contenido ;en ES: DI+4

INSTRUCCIONES aritméticas sub

SUB: Resta el operando destino al operando origen, colocando dicho resultado en el operando destino, los operandos pueden tener signo siempre y cuando sean del mismo tipo byte o palabra.
SINTAXIS:
SUB op_destino, op_fuente         ; sintaxis básica.
Ejemplo:        SUB    al, bl
SUB dx,dx
INSTRUCCIONES LOGICAS
En este grupo se incluyen las instrucciones de conjunción, disyunción, exclusiva y negación, la aplicación practica no es de siempre sin embargo suelen estar presentes en la mayoría de los programas.
INSTRUCCIONES LOGICAS and
AND: Realiza una operación de “Y” lógico entre el operando origen y el operando destino quedando el resultado en el operando destino.
SINTAXIS:
AND destino, origen
Ejemplo:       AND AX,BX  ; AX = AX AND BX
AND SI,ES:[DI]        ; SI=SI AND ES:[ DI ] AND BX,0A34H    ; BX=BX AND 0A34H
AND ES:[BX], CX    ; ES: [BX] = ES: [BX] AND CX
AND BYTE PTR [SI+4],5 ; [SI+4] = [SI+4] AND 5
INSTRUCCIONES LOGICAS or
OR: Realiza una operación de “O” lógico a nivel de bits entre los dos operandos , almacenándose después dicho resultado en el operando destino.
SINTAXIS:
OR destino, origen
Ejemplo:       OR AL,BL      ; AL = AL OR BL OR DI:[BX]   ; DI=DI OR [ BX ]
OR CL,34       ; CL=CL OR 34
OR [DI], BX  ; [DI] = [DI] OR BX
OR BYTE PTR [DI],8 ; [DI] = [DI] OR 8
INSTRUCCIONES LOGICAS xor
XOR: Realiza una operación de “O” exclusivo lógico a nivel de bits entre los dos operandos , almacenándose después dicho resultado en el operando destino.
SINTAXIS:
XOR destino, origen
Ejemplo:
XOR CX,BX
; CX = CX XOR BX

XOR DI,ES:[SI]
; DI= DI XOR ES:[ SI ]

XOR AX,4500H
; AX=AX XOR 4500H

XOR [BX], AX
; [BX] = [BX] XOR AX
XOR BYTE PTR [SI+BX],50 ; [SI+BX] = [SI+BX] XOR 50
INSTRUCCIONES de salto
Sirven para que el procesador, en lugar de ejecutar la siguiente instrucción , pase a ejecutar otra en lugar que se denomina
“destino de salto”.
INSTRUCCIONES de salto jmp
JMP: Realiza un salto de ejecución incondicional hacia la dirección o etiqueta especifica.
SINTAXIS:
JMP dirección  o JMP SHORT dirección
Ejemplos:      JMP    100H  ; Salta a CX:100h
JMP 55AAH:100H    ; Salto lejano a otro segmento
JMP    WORD           PTR    [BX]   ;           Salto   a          la         dirección       contenida      en
; la dirección de memoria especificada
; por BX (salto indirecto)
JMP     REPITE         ; Salto a la etiqueta REPITE
INSTRUCCIONES de salto
call
CALL: El efecto de esta instrucción es similiar a la de salto incondicional con la diferencia de que el procesador guarda ciertos datos en lugares para facilitar el retorno una vez terminada la ejecución de la subrutina.
SINTAXIS:
CALL destino
LAB1 50%>.: Tarea 1 - GUIA DE EJERCICIOS 02-Junio
Investigar que otras instrucciones hay disponibles para ensamblador y desarrolle 6 ejemplos donde se utilicen estas.
Tarea:
1.              Traer los archivos de código fuente escritos en su cuaderno
2.              Presentar los archivos en digital listo para ser compilador en una memoria usb
3.              El docente seleccionara uno para que lo explique a sus compañeros
4.              Individual


EJEMPLOS DE COMPILACION DE CODIGO ENSAMBLADOR USANDO TASM
TLINK 

Antes de iniciar la realización de cualquier programa en Lenguaje Ensamblador debemo
conocer algunos conceptos básicos. En este caso es primordial el software que
utilizaremos para todo el proceso de realización de dichos programas.

 TASM
El Turbo Assembler (TASM), un paquete ensamblador principalmente destinado a la
plataforma del IBM PC y sus compatibles. Fue la oferta de Borland en el mercado de
herramientas de programación en lenguaje ensamblador para la familia de los
 
Turbo Assembler también se refiere a un ensamblador común, basado en el
microprocesador 6502 para el Commodore 64, creado por la compañía alemana Omikron
en 1985. 

TLINK  
El enlazador o linkador permite combinar varios módulos objeto, realizando las
conexiones entre ellos y, finalmente, los convierte en módulo ejecutable de tipo EXE
(empleando el ML de MASM 6.X se obtiene directamente el fichero EXE ya que invoca
automáticamente al linkador). El linkador permite el uso de librerías de funciones y
rutinas. TLINK, a diferencia de LINK, permite generar un fichero de tipo COM
directamente de un OBJ si se indica el parámetro /t, lo que agiliza aún más el proceso.
Puede obtenerse ayuda ejecutándolo sin parámetros. Los parámetros de TLINK son
sensibles a mayúsculas y minúsculas, por lo que /T no es lo mismo que /t. 
 
Un enlazador (en inglés, linker) es un programa que toma los ficheros de código objeto
generado en los primeros pasos del proceso de compilación, la información de todos los
recursos necesarios (biblioteca), quita aquellos recursos que no necesita, y enlaza el código
objeto con su(s)biblioteca con lo que finalmente produce un fichero ejecutable o una
biblioteca.. En el caso de los programas enlazados dinámicamente, el enlace entre el
programa ejecutable y las bibliotecas se realiza en tiempo de carga o ejecución del
programa. 

EDITOR DE TEXTO PARA EL CODIGO FUENTE  
Un editor de texto es un programa que permite crear y modificar archivos digitales
compuestos únicamente por texto sin formato, conocidos comúnmente como archivos de
texto ó texto plano. Se utiliza para escribir el código fuente de los programas considerando
que al guardarse no conserve la extencion txt, ya que debe cambiarse por la extensión
asm. En el caso de Windows se usa el Block de Notas de Microsoft, en linus podemos usar
gedit o nano. 

PROCESO DE COMPILACION CON TASM Y TLINK  
Para iniciar la compilación de los programas de ejemplo, debemos copiar los dos archivos
ejecutables TASM.EXE y TLINK.EXE, dentro del directorio donde estarán los archivos
de código fuente, en este caso podemos crear un directorio en la unidad C llamado
CLASS18.
   
Con los archivos de código fuente y los ejecutables al iniciar el proceso de compilación, vamos al directorio y ejecutamos el comando que corresponda. 

CODIGOS DE EJEMPLO, COMPILADO Y LINKADO 
Creamos el primer ejemplo llamado saludo.asm

Entramos al símbolo del sistema (MS-DOS) nos direccionamos en donde se encuentra nuestra carpeta
             
Una vez situados en la dirección correcta, nos dirigimos a compilar nuestro programa.
 
Para la compilación se debe ejecutar la siguiente instrucción:
  
tasm /zi saludo.asm

Una vez compilado nos aparecerá un reporte, el cual nos muestra si hay errores en nuestras líneas de código. 
Con esto se ah realizado la compilación de nuestro programa y está listo para ser ligado. Para linkar el programa. Esto lo haremos con la siguiente instrucción.
 
tlink /v saludo
El último paso es la ejecución del programa. Solo escribimos el nombre del programa, sin extensiones.
  
Saludo

Al ejecutarlo podemos comprobar que no se realiza acción alguna y que genera ciertos mensajes de advertencia, es porque el programa solo tiene la estructura básica y no estamos indicando que realice una acción determinada.
Los caracteres especiales /v y /z tiene la siguiente finalidad.
/v  Desplegar el número de líneas fuente y símbolos procesados.
/z  Si ocurre un error que nos diga en que línea ocurrió
Corregir los errores en los siguientes programas para poder compilarlos: