1 BUSES Y PERIFRICOS (Prctica de introduccin a ensamblador. Va acompaada del documento Ensamblador del 8086.doc. Su realizacin no cuenta para la nota de prcticas)
Programacin en ensamblador utilizando TASM, TLINK, y TD
1. Introduccin
La idea de esta prctica es introducir al alumno en el manejo de las herramientas de desarrollo de programas en ensamblador de la familia de procesadores 8086. Estas herramientas son: TASM: ensamblador, que transforma el cdigo simblico con el que trabaja el programador en cdigo mquina. TLINK: enlazador, que convierte el cdigo mquina obtenido por TASM en un formato ejecutable en el sistema operativo base. TD (Turbo debugger): Una herramienta de depuracin de errores del cdigo. Nos permite simular la ejecucin del cdigo ejecutable y detectar los posibles fallos que se revelarn en tiempo de ejecucin.
2. Creacin de un programa en ensamblador
Un programa en ensamblador debe ser introducido con un editor de textos como el Block de Notas o el WordPad. Se recomienda que su extensin sea .asm. A continuacin se le somete a TASM.
TASM admite una serie de opciones. Principalmente, en tiempo de desarrollo, nos interesa /zi, que ensambla el cdigo introduciendo elementos aadidos que permitirn posteriormente su tratamiento mediante TD. Una vez hemos conseguido un programa depurado, esta opcin nos perjudica porque genera un cdigo menos eficiente. Otra opcin de inters es /l, que nos devuelve un archivo con extensin .lst, el cual contiene un listado del cdigo ya ensamblado. En l podemos observar el cdigo mquina que asocia con cada instruccin, o la direccin relativa de cada instruccin con respecto al comienzo de segmento.
El resultado de TASM sobre un archivo de cdigo es un nuevo archivo con extensin .obj. Este archivo ser el parmetro con que alimentaremos a TLINK. ste tambin lleva una opcin relacionada con el debugger que, por el momento, siempre aadiremos: /v.
TLINK nos devuelve un archivo con extensin .exe. El ejecutable. Se podr mandar a ejecutar directamente sobre MSDOS. En este caso, si ocurren errores, slo podremos observar un comportamiento extravagante del sistema, que se corresponder poco con lo que esperbamos de l. Por ello preferimos ejecutarlo en el debugger que nos permitir ver paso a paso (instruccin a instruccin) la ejecucin y determinar en qu momento se sale de nuestras previsiones.
Buses y Perifricos. ITIS. Ensamblador y Turbo debugger 2 3.- Eliminacin de errores. (Uso del TD) Una vez disponemos del archivo ejecutable (extensin .exe) podemos invocar con l al Turbo Debugger. Esta herramienta nos permitir ver el programa fuente as como el cdigo generado por el ensamblador en sus posiciones de memoria definitivas para la actual ejecucin. Tambin podemos observar (y modificar) los registros del procesador y los datos que hayamos situado en memoria (segmento de datos). Nos permitir realizar una ejecucin "segura" del programa, entendiendo por esto que si el programa alberga errores tenemos la certeza de que estos no van a perjudicar al sistema, lo que no podemos asegurar si directamente lo sometemos al msdos. Y principalmente, porque es la opcin ms prctica, podemos ejecutar el programa instruccin a instruccin, con lo cual comprobamos que cada instruccin modifica exactamente aquellos recursos que esperbamos que modificase y de la manera en que desebamos que lo hiciera cuando escribimos el programa.
Para cargar el programa en el debugger basta invocar a ste con el archivo ejecutable como parmetro. Si la carga se realiza adecuadamente, estaremos visualizando el cdigo fuente, en ensamblador, de nuestro programa. A partir de aqu podemos mandar a ejecutar el programa, tanto de forma completa como paso a paso. En este ltimo caso, tras cada paso, una flechita indicar en el cdigo fuente cual es la ltima instruccin que se ha ejecutado.
La opcin CPU del men VIEW nos abrir una ventana en la que podremos ver el cdigo mquina ya localizado en memoria, con la flechita apuntando a la primera instruccin a ejecutar. Tambin veremos otra ventana en la que aparecen los registros del procesador y su contenido se ir modificando en cada paso de ejecucin. Y, por ltimo, podemos ver el contenido del espacio de memoria que tambin se ir modificando a medida que vamos ejecutando instrucciones que le afecten.
ACTIVIDADES A REALIZAR.
1 Introducirn el cdigo que viene a continuacin en un archivo de texto utilizando cualquier editor de textos plano (que no aada controles de edicin): WordPad, NotePad. (Documento a generar 1: Un listado del programa con cada instruccin comentada. Aydese con el listado de instrucciones y directivas.)
2 Ensamblarn y enlazarn el archivo generado hasta obtener un ejecutable. (Este cdigo en principio no tiene errores, de manera que cualquier problema que surja se deber a la transcripcin). Realizar una ejecucin en msdos. (Documento a generar 2: Explicar qu es lo que hace el programa)
3 Cargarn el cdigo en el TD y lo ejecutarn paso a paso. (Documento a generar 3: Explicar qu funcin realizan las teclas F1, F2, ALT-F5) (Documento a generar 4: Tratar de identificar en el programa qu secciones de cdigo realizan cada parte del resultado de ejecucin del programa segn el documento 2)
Buses y Perifricos. ITIS. Ensamblador y Turbo debugger 3 Bibliografa: Turbo Debugger 3.0, User's Guide BORLAND Turbo Assembler 3.0, User's Guide BORLAND 8086/87 Programacin ensamblador en entorno msdos. Miguel Angel Rodrguez Rosell Ediciones Anaya Multimedia 1990
Buses y Perifricos. ITIS. Ensamblador y Turbo debugger 4 com_pantalla EQU 0B800h tam_pantalla EQU 4000
DATOS SEGMENT TEXTO DB "BUSES Y PERIFERICOS. EUI.",13,10,"TITULACION DE INGENIERO TECNICO DE SISTEMAS",13,10,'$' TEXTE DB "AMIGOS Y AMIGAS, BIEN VENIDOS A LAS PRACTICAS DE BUSES PERIFERICOS",13,10,'$' DATOS ENDS
PILA SEGMENT DB 127 DUP('p') apuntador DB 'P' PILA ENDS
borra_pantalla PROC PUSH ES PUSH AX PUSH CX PUSH DI PUSHF MOV AX, com_pantalla MOV ES,AX MOV CX, (tam_pantalla/2)+1 MOV DI, tam_pantalla MOV AL, '-' MOV AH, 07h STD REP STOSW POPF POP DI POP CX POP AX POP ES RET ENDP
NO: MOV AH,09h MOV DX, OFFSET TEXTE INT 21h f: MOV AH, 4Ch INT 21h
CODIGO ENDS END Todo_es_empezar
Buses y Perifricos. ITIS. Ensamblador y Turbo debugger 5 INSTRUCCIONES 8086 Transferencia de datos IN - entrada de bytes o palabra LAHF - Cargar AH con las banderas LDS - Cargar puntero usando DS LEA - Cargar direccin efectiva LES - Cargar puntero usando ES MOV - Mover OUT - Salida de byte o palabra POP - Recuperar palabra de la pila POPF - Recuperar banderas de la pila PUSh - Depositar palabra en la pila PUSHF - Depositar banderas en la pila SAHF - Almacenar Ah en banderas XCHG - Intercambiar dos operandos XLAT - Traducir Instrucciones aritmticas AAA - Ajuste ASCII en suma AAD - Ajuste ASCII en divisin AAM - Ajuste ASCII en multiplicacin AAS - Ajuste ASCII en resta ADC - Sumar con acarreo ADD - Sumar (sin acarreo) CBW - Convertir byte en palabra CMP - Comparar operandos CWD - Convertir palabra a doble palabra DAA - Ajuste decimal en suma DAS - Ajuste decimal en resta DEC - Decrementar en uno DIV - Dividir sin signo IDIV - Dividir con signo IMUL - Multiplicar con signo INC - Incrementar en uno MUL - Multiplicar sin signo NEG - Negar/formar complemento a 2 SBB - Restar con acarreo SUB - Restar (sin acarreo) Instrucciones de manejo de bits AND - Y lgico NOT - Negacin lgica OR - O lgico RCL - Rotacin a izquierda a travs del bit de acarreo RCR - Rotacin a derecha a travs del bit de acarreo ROL - Rotacin a izquierda ROR - Rotacin a derecha SAL - Desplazamiento aritmtico a izquierda SAR - Desplazamiento aritmtico a derecha (conservando el signo) SHL - Desplazamiento lgico a izquierda SHR - Desplazamiento lgico a derecha TEST - Comparacin lgica de dos operandos XOR - O lgico exclusivo Instrucciones de transferencia del control CALL - Llamada a procedimiento JA - Saltar si superior JAE - Saltar si superior o igual JB - Saltar si inferior JBE - Saltar si inferior o igual JC - Saltar si hay acarreo JCXZ - Saltar si CX es cero JE - Saltar si igual JG - Saltar si mayor JGE - Saltar si mayor o igual JL - Saltar si menor JLE - Saltar si menor o igual JNA - Saltar si no es mayor JNAE - Saltar sino es mayor o igual JNB - Saltar si no es menor JNBE - Saltar si no es menor o igual JNC - Saltar si no hay acarreo JNE - Saltar si no es igual JNG - Saltar si no es mayor JNGE - Saltar si no es mayor o igual JNL - Saltar si no es menor JNLE - Saltar si no es menor o igual JNO - Saltar si no se produce desbordamiento JNP - Saltar si no hay paridad JNS - Saltar si no es negativo JNZ - Saltar si no es cero JMP - Salto incondicional JO - Saltar si se produce desbordamiento JP - Saltar si hay paridad JPE - Saltar si hay paridad par JPO - Saltar si hay paridad impar JS - Saltar si el signo es negativo JZ - Saltar si el resultado es cero LOOP - Bucle hasta que acabe contador LOOPE - Bucle mientras igual LOOPNE - Bucle mientras no igual LOOPNZ - Bucle mientras resultado no cero LOOPZ - Bucle mientras resultado cero RET - Retornar de un procedimiento Instrucciones de manejo de cadenas. CMPS - Comparar cadenas de bytes o palabras CMPSB - Comparar cadenas de bytes CMPSW - Comparar cadenas de palabras LODS - Cargar cadena (bytes o palabras) LODSB - Cargar cadena de bytes LODSW - Cargar cadena de palabras MOVS - Mover cadena (bytes o palabras) MOVSB - Mover cadenas de bytes MOVSW - Mover cadenas de palabras REP - Repetir operacin de cadena REPE - Repetir mientras igual REPNE - Repetir mientras no igual REPNZ - Repetir mientras resultado no cero REPZ - Repetir mientras resultado cero SCAS - Explorar cadena (b o p) SCASB - Explorar cadena de bytes SCASW - Explorar cadena de palabras STOS - Almacenar cadena (b o w) STOSB - Almacenar cadena de bytes STOSW - Comprarse una tienda en el polo norte. Instrucciones de interrupcin. INT - Invocar a la interrupcin INTO - Interrupcin si desbordamiento IRET - Retorno de interrupcin Instrucciones de control de microprocesador. CLC - Borrar bandera de acarreo CLD - Borrar bandera de direccin CLI - Borrar bandera de interrupcin CMC - Complementar bandera de acarreo ESC - Escape (transmitir informacin a un coprocesador) HLT - Parar el procesador LOCK - Bloquear el bus NOP - No operacin STC - Activar bandera de acarreo STD - Activar bandera de direccin STI - Activar bandera de interrupcin WAIT - Esperar a que termine un coprocesador.
Buses y Perifricos. ITIS. Ensamblador y Turbo debugger 6 DIRECTIVAS DEL COMPILADOR Directivas de datos Definicin de smbolos EQU - Asigna smbolo a expresin fija = - Asigna smbolo a expresin variable Definicin de datos DB - Definir byte DW - Definir palabra DD - Definir doble palabra DQ - Definir cudruple palabra DT - Definir diez bytes Referencias externas PUBLIC - Definir smbolo pblico EXTRN - Definir smbolo externo INCLUDE - Incluir fichero fuente Control del ensamblador END - Fin del mdulo fuente ORIGIN - Origen de cdigo o datos EVEN - Poner contador de posiciones a par .RADIX - Definir base de numeracin por defecto. Definicin de segmentos y procedimientos SEGMENT - Comienzo de segmento ENDS - Final de segmento ASSUME - Suponer registros de segmentos PROC - Comienzo de procedimiento ENDP - Fin de procedimiento Definicin de bloques GROUP - Agrupar segmentos NAME - Nombrar un mdulo LABEL - Asignar un atributo a un nombre RECORD - Definir registro STRUC - Definir estructura Directivas condicionales IF - Evaluar condicin y decidir ELSE - Si condicin es falsa ENDIF - Fin de estructura condicional Directivas de listado Formato del listado PAGE - Formato de la pgina del listado TITLE - Ttulo del listado SUBTTL - Subttulo del listado Listado de macros .LALL - Listar macros y expansiones .SALL - Suprimir listado macros y expansiones .XALL - Listar slo macros que generan cdigo objeto Control del listado .XCREF - Suprimir referencias cruzadas .CREF - Restaurar listado de referencias cruzadas .XLIST - Suprimir listado ensamblador .LIST - Restaurar listado ensamblador Comentarios COMMENT - Comentario Mensajes %OUT - Emitir un mensaje durante el ensamblaje Control del listado de los bloques asociados a una condicin falsa .LFCOND - Listar bloques asociados a una condicin falsa .SFCOND - Suprimir ese listado mencionado arriba .TFCOND - Invertir el modo de listado de los bloques...
Directivas de macro Definicin de macros MACRO - Comienza macro ENDM - Fin macro LOCAL - Define etiquetas dentro de macro EXITM - Terminar expansin de la macro PURGE - Borrar macros de la memoria REPT - Repetir bloque de sentencias un nmero de veces IRP - Repetir bloque de sentencias con un valor cada vez IRPC - Repetir bloque de sentencias con un carcter cada vez Operadores de macro & - Operador para concatenar smbolos o texto ;; - Operador para comentarios que no aparecern en la expansin ! - Operador para interpretar caracteres en sentido literal % - Operador para convertir una expresin en un nmero