LENGUAJE ENSAMBLADOR CON TURBO ASSEMBLER
Short Description
Download LENGUAJE ENSAMBLADOR CON TURBO ASSEMBLER...
Description
LENGUAJE ENSAMBLADOR CON TURBO ASSEMBLER (TASM) MICROPROGRAMACION INTRODUCCIÓN El lenguaje ensamblador es un tipo de lenguaje de bajo nivel, se llama así porque está muy cercano al hardware del ordenador. Es por ello de el lenguaje ensamblador asigna una abreviatura a cada instrucción en binario (código máquina), de esta forma es más fácil recordar y más difícil equivocarse con las instrucciones o abreviaturas. Una desventaja es que con este lenguaje sigue siendo necesario conocer muy bien el hardware del ordenador. En otras palabras es necesario conocer a fondo la arquitectura de la máquina para la que se va a programar. Fue usado ampliamente en el pasado para el desarrollo de software, pero actualmente sólo se utiliza en contadas ocasiones, especialmente cuando se requiere la manipulación directa del hardware o se pretenden rendimientos inusuales de los equipos. Este documento es una guía para lograr conocer la estructura básica de un programa en Lenguaje Ensamblador utilizando Tasm. Además de esto se dará una guía para la instalación de Borland Turbo Assembler 5.0, y la forma de utilizarlo. OBJETIVOS GENERAL • Conocer la estructura básica de un programa en Lenguaje Ensamblador utilizando Tasm. ESPECÍFICOS • Realizar la instalación adecuada de Borland Turbo Assembler 5.0. • Desarrollo de un programa básico en lenguaje ensamblador usando el tasm 5.0.
Binario: 10110000 01100001 (Hexadecimal: 0xb061) La representación equivalente en ensamblador es más fácil de recordar: mov al, 061h Esta instrucción significa: Mueva el valor hexadecimal 61 (97 decimal) al registro "al". El mnemónico "mov" es un código de operación u "opcode", elegido por los diseñadores de la colección de instrucciones para abreviar "move" (mover).- El opcode es seguido por una lista de argumentos o parámetros, completando una instrucción de ensamblador típica. La transformación del lenguaje ensamblador en código máquina la realiza un programa ensamblador, y la traducción inversa la puede efectuar un desensamblador. A diferencia de los lenguajes de alto nivel, aquí hay usualmente una correspondencia 1 a 1 entre las instrucciones simples del ensamblador y el lenguaje máquina. Sin embargo, en algunos casos, un ensamblador puede proveer "pseudo instrucciones" que se expanden en un código de máquina más extenso a fin de proveer la funcionalidad necesaria. Por ejemplo, para un código máquina condicional como "si X mayor o igual que", un ensamblador puede utilizar una pseudoinstrucción al grupo "haga si menor que", y "si = 0" sobre el resultado de la condición anterior. Los ensambladores más completos también proveen un rico lenguaje de macros que se utiliza para generar código más complejo y secuencias de datos. Cada arquitectura de computadoras tiene su propio lenguaje de máquina, y en consecuencia su propio lenguaje ensamblador. Los ordenadores difieren en el tipo y número de operaciones que soportan; también pueden tener diferente cantidad de registros, y distinta representación de los tipos de datos en memoria. Aunque la mayoría de las computadoras son capaces de cumplir esencialmente las mismas funciones, la forma en que lo hacen difiere, y los respectivos lenguajes ensambladores reflejan tal diferencia. Pueden existir múltiples conjuntos de mnemónicos o sintaxis de ensamblador para un mismo conjunto de instrucciones, instanciados típicamente en diferentes programas ensamblador. En estos casos, la alternativa más popular es la provista por los fabricantes, y usada en los manuales del programa. ESTRUCTURA DE UN PROGRAMA: La estructura de un programa en lenguaje ensamblador para el microprocesador 8088, puede ser visto como una colección de segmentos.
LENGUAJE ENSAMBLADOR HISTORIA Los lenguajes de computadoras toman diferentes formas; los de las primeras computadoras, como la ENIAC y la EDSAC, se componían en el lenguaje real de las máquinas mismas. La dificultad de programar las máquinas de esta manera limitaba drásticamente su utilidad y proporcionaba un fuerte incentivo para que se desarrollaran lenguajes de programación más orientados hacia la expresión de soluciones con la notación de los problemas mismos. Los primeros lenguajes de programación se conocieron como Lenguajes Ensambladores, un ejemplo es: TRANSCODE, desarrollado para la computadora FERUT. En los lenguajes ensambladores se define un código especial llamado mnemónico para cada una de las operaciones de la máquina y se introduce una notación especial para especificar el dato con el cual debe realizarse la operación. DEFINICIÓN Un programa escrito en lenguaje ensamblador consiste en una serie de instrucciones que corresponden al flujo de órdenes ejecutables que pueden ser cargadas en la memoria de una computadora. Por ejemplo, un procesador x86 puede ejecutar la siguiente instrucción binaria como se expresa en código maquina:
El programa básico de lenguaje ensamblador debe tener al menos dos segmentos: • Segmento de Pila. • Segmento de código. QUE SON LAS INSTRUCCIONES: El set de instrucciones de un microprocesador es el set de entradas binarias que producen acciones definidas durante un ciclo de instrucción. Un set de instrucciones es para el microprocesador lo mismo 1
que una tabla de verdad es para una compuerta lógica, un registro de desplazamiento o un circuito sumador. Por supuesto, las acciones que realiza un microprocesador con cada instrucción, son más complejas que las que realizan los dispositivos y compuertas antes mencionados. INSTRUCCIONES BINARIAS: Una instrucción es un patrón de dígitos binarios el cual debe estar a disposición del microprocesador en el tiempo y forma que éste lo requiera. Por ejemplo, cuando un micro controlador PIC16C5X recibe el patrón binario de 12 bits „000010000000‟ en el momento adecuado, significa: “CLEAR (borrar o poner a cero) EL REGISTRO W”
2- Colocar las rutinas en el mismo sitio, todas contiguas. 3- Dibujar diagramas de flujo o escribir seudocódigo. Mnemónicos (códigos de operación): La tarea principal del assembler es la traducción de los códigos de operación en mnemónico en sus equivalentes binarios. El assembler realiza ésta tarea usando una tabla como si lo haríamos “a mano”. El assembler debe hacer algo más que traducir los códigos de operación. También debe determinar cuantos operandos requiere la instrucción y de que tipo. Esto es un poco complejo; algunas instrucciones (como clrw) no tienen operandos, otras (como sumas o saltos) tienen una, mientras que otras (manipulación de bits o skips) requieren dos.
VENTAJAS
• • • •
Máximo rendimiento: máxima velocidad y mínimo tamaño } Puede explotar al máximo el CPU Acceso a cualquier recurso de la computadora Ayuda a conocer a detalle cómo trabaja la computadora
Desventajas • El programa sólo corre en un CPU • Es difícil llegar a ser programador experto • Es difícil escribir programas grandes y complejos • Es difícil depurar y dar mantenimiento a los programas • Un error puede provocar que falle el equipo Convenciones en la escritura del código fuente Para hacer la tarea del programador más grata, se usan algunas convenciones. Cada uno puede adoptar las que más le agraden y ayuden para ser más productivo. En general, las convenciones son cualquier acción que facilita la revisión y comprensión de un programa, especialmente el que uno mismo ha escrito cuando tiene que revisarlo algunos meses después. Comentamos algunas convenciones que usaremos: • Los ficheros de código fuente llevarán la extensión *.ASM • Los ficheros de listado llevarán la extensión *.LST • Los ficheros de código objeto llevarán la extensión *.OBJ • Los ficheros de errores llevarán la extensión *.ERR
• • • •
Los ficheros ejecutables en formato Intel Hex llevarán la extensión *.HEX Los nemónicos escritos en mayúscula hacen que el código escrito sea más visible. Comentarios explicando cada línea de código. Un párrafo de comentarios explica las rutinas o conjunto de instrucciones ya que los campos de comentarios suelen ser pequeños.
•
El espacio entre caracteres se escribe “_”. RB0_ES_1 es más fácil de leer que RB0ES1.
Recuerde que las convenciones son cualquier cosa que le haga más fácil la lectura y comprensión de su código, como por ejemplo: 1- Una cabecera estandarizada.
DIRECTIVAS: Algunas instrucciones del lenguaje assembler no se traducen directamente a instrucciones del lenguaje máquina. Estas instrucciones son directivas para el assembler; éstas asignan al programa ciertas áreas de memoria, definen símbolos, designan áreas de RAM para almacenamiento de datos temporales, colocan tablas o datos constantes en memoria y permiten referencias a otros programas. Las directivas se utilizan como comandos escritos en el código fuente para realizar un control directo o ahorrar tiempo a la hora de ensamblar. El resultado de incorporar directivas se puede ver en el fichero *.LST, después de ensamblar el programa. Para usar éstas directivas o pseudo-operandos, el programador las coloca en el campo del código de operación, y, si lo requiere la directiva, una dirección o dato en el campo de dirección. Las directivas más comunes son: • EQU (Equate) • ORG (Origin)
•
DEFB (Define Byte) DEFW (Define Word)
•
END (fin del código fuente)
•
EQU (Equate - Equivalente): La directiva EQU permite al programador igualar nombres a datos o direcciones. Esta pseudooperación se nota EQU. Los nombres utilizados se refieren generalmente a direcciones de dispositivos, datos numéricos, direcciones de comienzo, direcciones fijas, posiciones de bits, etc. PORT_A EQU 5 START EQU 0 CARRY EQU 3 TIEMPO EQU 5 También se puede definir una equivalencia con el nombre de otra equivalencia ya definida. PORT_B EQU PORT_A+1 PORT_C EQU PORT_A+2 FIN EQU START+100 FIN2 EQU START+200 El valor del operando debe estar ya definido anteriormente, sino el compilador entregará un error. ORG (Origin - Origen): La directiva origen (se nota ORG) permite al programador especificar la posición de memoria donde programas, subrutinas o datos residirán. Los programas y los datos pueden estar alojados en diferentes áreas de memoria dependiendo de la configuración de memoria. 2
Rutinas de comienzo, subrutinas de interrupción y otros programas deben comenzar en locaciones de memoria fijados por la estructura de microprocesador. La directiva ORG hace al compilador colocar el código que le sigue en una nueva dirección de memoria (la salida del compilador no solo coloca los códigos de operación sino también las direcciones de cada instrucción y datos del programa). Usualmente se la utiliza para: reset, programas de servicios de interrupción, almacenamiento en RAM, stack, programa principal, subrutinas. Por Ej: ORG 00h goto inicializa org 04h ; vector de interrupcion goto interr ORG 05h Inicializa movlw 08h ; aquí comienza el programa
El Turbo Assembler (TASM), es 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 microprocesadores x86 . Como se pudiera esperar, trabajaban bien con los compiladores de lenguaje de alto nivel de Borland para los PC, como Turbo C y Turbo Pascal. Junto con el resto de suite de lenguajes de programación Turbo, Turbo Assembler ya no es mantenido. Para la compilación de un programa en ensamblador y su enlazado, hay que seguir una serie de pasos. Este ensamblador lo que hace es obtener un programa “ejecutable” para un ordenador que tenga integrado un microprocesador de la familia 80x86. La figura siguiente detalla los cuatro pasos que lleva a cabo el compilador:
DEFB (Define Byte), DEFW (Define Word): Esta directiva le permite al programador ingresar datos fijos en la memoria de programa. Estos datos pueden ser: Tablas de conversión • Mensajes • Nombres • Umbrales • Comandos • Factores de conversión • Identificación de teclas • Direcciones de subrutinas Esta directiva trata a los datos como parte permanente del programa. El formato es muy simple: MENSAJE DEFB ’M’,’I’,’C’,’R’,’O’,0 DELAY DEFB 10 DATOS DEFW $A100 DEFW $A400 DEFW $0000 POTENCIA DEFB 1,4,9,16,25,36,49,64,81 SOFTWARE NECESARIO: Para poder crear un programa se requieren varias herramientas: Primero un editor para crear el programa fuente. Segundo un compilador (Turbo Assembler) que no es más que un programa que "traduce" el programa fuente a un programa objeto. Y tercero un enlazador (Turbo Linker), que genere el programa ejecutable a partir del programa objeto. El editor puede ser cualquier editor de textos que se tenga a la mano, como compilador utilizaremos el programa Turbo Assembler (TASM), y como enlazador utilizaremos el Turbo Link (TLINK). La extensión usada para que el TASM reconozca los programas fuente en ensamblador es .ASM, una vez traducido el programa fuente, el TASM crea un archivo con la extensión .OBJ, este archivo contiene un "formato intermedio" del programa, llamado así porque aún no es ejecutable pero tampoco es ya un programa en lenguaje fuente. El enlazador genera, a partir de un archivo .OBJ o la combinación de varios de estos archivos, un programa ejecutable, cuya extensión es .EXE. BORLAND TURBO ASSEMBLER
INSTALACIÓN BORLAND TURBO ASSEMBLER 5.0 Primero hay que descargar Borland Turbo Assembler 5.0. Este se puede descargar de la página siguiente: http://www.upseros.com/compiladores.php El instalador viene comprimido en formato .zip. Ahora procederemos a descomprimir el instalador de la siguiente forma: Damos clic derecho sobre el tasm.rar, y luego seleccionamos la opción “Extraer en tasm”
Figura1. Extraer archivos Aparecerá una carpeta con el nombre tasm con los archivos descomprimidos. Luego de esto abrimos esta carpeta y debemos dar clic sobre “Install.exe”, el cual iniciara la instalación:
3
Figura4. Pantalla de Instalación Figura2. Pantalla inicial de Instalación. Luego presionamos Enter para continuar. Aparecerá la siguiente ventana:
Figura3. Pantalla de Configuración En esta ventana debemos cambiar el lugar donde se instalaran nuestros archivos, en este caso escogimos el disco C. Luego de esto presionamos “Enter” para continuar con la instalación
En esta ventana nos pide la dirección de los archivos que descomprimimos previamente, solamente damos “Enter” dejando la que aparece por default. Luego aparecerá la siguiente ventana, en ella deje todas las opciones tal y como están por default, y seleccione la opción “start Installation” y luego de “Enter”. Otra forma de iniciar la instalación es presionando F9.
Figura5. Pantalla de Configuración de la Instalación Luego aparecerá un recuadro dando el estado de la instalación. Debe esperar unos minutos para terminar la instalación.
4
Figura8. Léeme (Readme) de Assembler Para salir de esta pantalla presione ESC. Figura 6. Pantalla Proceso de Instalación. Se pregunta si se desean asignar o crear iconos o grupos de programas para los diferentes archivos (Borland proporciona esos iconos), por lo general, se acepta.
Ejemplo en Borland Turbo Assembler 5.0 Se puede usar cualquier editor de texto para escribir el código del programa en ensamblador. Para que pueda ser interpretado por el ensamblador TASM, la condición necesaria es que el fichero de este programa lleve la extensión .ASM y el nombre del fichero no deba ser mayor a ocho caracteres. Para la edición, se puede usar EDIT como programa editor de texto, el notepad o el block de notas de Windows. En este documento mencionaremos 2 centrándonos en la segunda. 1- La primera es tecleando en Menú Inicio > Ejecutar > cmd > Enter
Figura 7. Mensaje asignar o crear iconos o grupos de programas Por último, y no por eso menos importante aparecerá el ReadMe de Assembler, se recomienda ver el contenido ya que contiene ayuda sobre el programa.
Figura9. Ejecutar Ya en la ventana de comando se teclea edit
5
Figura10. Ventana de comandos Nos aparecerá la siguiente ventana:
Figura13. Guardar como de Block de notas
Figura11. Edit de DOS En la que se puede editar el código del programa, una vez terminado solo hay que guardar el programa con la extensión .asm 2- La segunda forma es utilizando el Block de notas, la cual será la que se usará en el ejemplo.
Lo siguiente será ubicar el archivo a crear en la carpeta donde se desea guardar en este caso lo haremos en la siguiente ruta: C:\TASM\BIN. En la pestaña tipo se selecciona “Todos los Archivos”, y en la de nombre debe ir el nombre de mi aplicación con la extensión .asm y se presiona el botón Guardar.
Figura14. Ventana Guardar como Figura12. Block de notas de windows Al terminar de digitar el programa es hora de guardar, en este caso se selecciona Guardar como.
Editamos el siguiente programa, al terminar se guarda el fichero. No olvide confirmar que tiene extensión .asm. ; EJEMPLO.ASM ; Un programa en ensamblador que envía un mensaje ; A pantalla. A ver que pasa…. .model tiny ; directiva de modelo de programación .stack ; directiva de asignación de segmento de stack .data ; directiva de asignación de segmento de datos Message db "Hola Microprogramación$" ; mensaje a pantalla .code ; directiva de asignación de segmento de datos start: ; inicio de programa 6
mov dx,OFFSET Message ; offset en DX mov ax,SEG Message ; segmento en AX mov ds,ax ; DS:DX apunta al mensaje mov ah,9 ; función 9–llamada a servicio de pantalla int 21h ; llamada a interrupción del DOS mov ax,4c00h ; vuelta al DOS int 21h END start ; fin Ese código se guarda en el siguiente directorio: C:\TASM\BIN con la extensión .ASM Luego abrimos una consola de DOS de Windows: Inicio > Ejecutar > cmd Y escribimos lo siguiente: cd c:\tasm\bin tasm Ejemplo tlink Ejemplo Así como se muestra en la siguiente pantalla:
Y listo, aparecerá la aplicación que haya compilado, siempre y cuando no tenga ningún mensaje de Error. CONCLUSIONES • Para el Lenguaje Ensamblador su funcionamiento radica en la importancia de su uso y su profundo estudio, ya que ayuda a conocer a detalle cómo trabaja un CPU.
•
El lenguaje ensamblador es el que va traduciendo instrucciones de código de maquina a nemónicos, es decir interpreta los nombres de los nemónicos a direcciones de memoria y otras entidades.
•
El modo segmentado de memoria permite a los programas poder moverse reubicarse en la misma, debido a que no se manejan posiciones completamente directas en memoria sino referentes al valor de segmento.
Figura15. Ejemplo en Consola Para ejecutar lo que hemos compilado debe escribir: Ejemplo.exe
Figura16. Programa en ejecución. 7
View more...
Comments