Buses y Periféricos. ITIS. (01/02) Ensamblador y Turbo debugger BUSES Y PERIFÉRICOS Programación en ensamblador utilizando TASM, TLINK, y TD 1. Introducción La idea de esta práctica 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 código simbólico con el que trabaja el programador en código máquina. TLINK: enlazador, que convierte el código máquina obtenido por TASM en un formato ejecutable en el sistema operativo base. TD (Turbo debugger): Una herramienta de depuración de errores del código. Nos permite simular la ejecución del código ejecutable y detectar los posibles fallos que se revelarán en tiempo de ejecución. 2. Creación 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 extensión sea .asm. A continuación se le somete a TASM. TASM admite una serie de opciones. Principalmente, en tiempo de desarrollo, nos interesa /zi, que ensambla el código introduciendo elementos añadidos que permitirán posteriormente su tratamiento mediante TD. Una vez hemos conseguido un programa depurado, esta opción nos perjudica porque genera un código menos eficiente. Otra opción de interés es /l, que nos devuelve un archivo con extensión .lst, el cual contiene un listado del código ya ensamblado. En él podemos observar el código máquina que asocia con cada instrucción, o la dirección relativa de cada instrucción con respecto al comienzo de segmento. El resultado de TASM sobre un archivo de código es un nuevo archivo con extensión .obj. Este archivo será el parámetro con que alimentaremos a TLINK. Éste también lleva una opción relacionada con el debugger que, por el momento, siempre añadiremos: /v. TLINK nos devuelve un archivo con extensión .exe. El ejecutable. Se podrá mandar a ejecutar directamente sobre MSDOS. En este caso, si ocurren errores, sólo podremos observar un comportamiento extravagante del sistema, que se corresponderá poco con lo que esperábamos de él. Por ello preferimos ejecutarlo en el debugger que nos permitirá ver paso a paso (instrucción a instrucción) la ejecución y determinar en qué momento se sale de nuestras previsiones. 1 Buses y Periféricos. ITIS. (01/02) Ensamblador y Turbo debugger 3.- Eliminación de errores. (Uso del TD) Una vez disponemos del archivo ejecutable (extensión .exe) podemos invocar con él al Turbo Debugger. Esta herramienta nos permitirá ver el programa fuente así como el código generado por el ensamblador en sus posiciones de memoria definitivas para la actual ejecución. También podemos observar (y modificar) los registros del procesador y los datos que hayamos situado en memoria (segmento de datos). Nos permitirá realizar una ejecución "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 opción más práctica, podemos ejecutar el programa instrucción a instrucción, con lo cual comprobamos que cada instrucción modifica exactamente aquellos recursos que esperábamos que modificase y de la manera en que deseábamos que lo hiciera cuando escribimos el programa. Para cargar el programa en el debugger basta invocar a éste con el archivo ejecutable como parámetro. Si la carga se realiza adecuadamente, estaremos visualizando el código 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 código fuente cual es la última instrucción que se ha ejecutado. La opción CPU del menú VIEW nos abrirá una ventana en la que podremos ver el código máquina ya localizado en memoria, con la flechita apuntando a la primera instrucción a ejecutar. También veremos otra ventana en la que aparecen los registros del procesador y su contenido se irá modificando en cada paso de ejecución. Y, por último, podemos ver el contenido del espacio de memoria que también se irá modificando a medida que vamos ejecutando instrucciones que le afecten. ACTIVIDADES A REALIZAR. 1º Introducirán el código que viene a continuación en un archivo de texto utilizando cualquier editor de textos plano (que no añada controles de edición): WordPad, NotePad. (Documento a generar 1: Un listado del programa con cada instrucción comentada. Ayúdese con el listado de instrucciones y directivas.) 2º Ensamblarán y enlazarán el archivo generado hasta obtener un ejecutable. (Este código en principio no tiene errores, de manera que cualquier problema que surja se deberá a la transcripción). Realizar una ejecución en msdos. (Documento a generar 2: Explicar qué es lo que hace el programa) 3º Cargarán el código en el TD y lo ejecutarán paso a paso. (Documento a generar 3: Explicar qué función realizan las teclas F1, F2, ALT-F5) (Documento a generar 4: Tratar de identificar en el programa qué secciones de código realizan cada parte del resultado de ejecución del programa según el documento 2) 2 Buses y Periféricos. ITIS. (01/02) Ensamblador y Turbo debugger Bibliografía: Turbo Debugger 3.0, User's Guide BORLAND Turbo Assembler 3.0, User's Guide BORLAND 8086/87 Programación ensamblador en entorno msdos. Miguel Angel Rodríguez Roselló Ediciones Anaya Multimedia 1990 3 Buses y Periféricos. ITIS. (01/02) Ensamblador y Turbo debugger 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') DB 'P' ENDS apuntador PILA CODIGO SEGMENT ASSUME CS:CODIGO, DS:DATOS, SS:PILA 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 Todo_es_empezar: MOV AX, DATOS MOV DS, AX MOV AX, PILA MOV SS, AX MOV SP, OFFSET apuntador MOV AH,09h MOV DX, OFFSET TEXTO INT 21h Call borra_pantalla NO: f: CODIGO ENDS END MOV AH,09h MOV DX, OFFSET TEXTE INT 21h MOV AH, 4Ch INT 21h Todo_es_empezar 4 Buses y Periféricos. ITIS. (01/02) Ensamblador y Turbo debugger INSTRUCCIONES 8086 Transferencia de datos IN LAHF LDS LEA LES MOV OUT POP POPF PUSh PUSHF SAHF XCHG XLAT - entrada de bytes o palabra - Cargar AH con las banderas - Cargar puntero usando DS - Cargar dirección efectiva - Cargar puntero usando ES - Mover - Salida de byte o palabra - Recuperar palabra de la pila - Recuperar banderas de la pila - Depositar palabra en la pila - Depositar banderas en la pila - Almacenar Ah en banderas - Intercambiar dos operandos - Traducir Instrucciones aritméticas AAA AAD AAM AAS ADC ADD CBW CMP CWD DAA DAS DEC DIV IDIV IMUL INC MUL NEG SBB SUB - Ajuste ASCII en suma - Ajuste ASCII en división - Ajuste ASCII en multiplicación - Ajuste ASCII en resta - Sumar con acarreo - Sumar (sin acarreo) - Convertir byte en palabra - Comparar operandos - Convertir palabra a doble palabra - Ajuste decimal en suma - Ajuste decimal en resta - Decrementar en uno - Dividir sin signo - Dividir con signo - Multiplicar con signo - Incrementar en uno - Multiplicar sin signo - Negar/formar complemento a 2 - Restar con acarreo - Restar (sin acarreo) Instrucciones de manejo de bits AND - Y lógico NOT - Negación lógica OR - O lógico RCL - Rotación a izquierda a través del bit de acarreo RCR - Rotación a derecha a través del bit de acarreo ROL - Rotación a izquierda ROR - Rotación a derecha SAL - Desplazamiento aritmético a izquierda SAR - Desplazamiento aritmético a derecha (conservando el signo) SHL - Desplazamiento lógico a izquierda SHR - Desplazamiento lógico a derecha TEST - Comparación lógica de dos operandos XOR - O lógico exclusivo Instrucciones de transferencia del control CALL JA JAE JB JBE JC JCXZ JE JG JGE JL JLE JNA JNAE JNB JNBE JNC JNE JNG - Llamada a procedimiento - Saltar si superior - Saltar si superior o igual - Saltar si inferior - Saltar si inferior o igual - Saltar si hay acarreo - Saltar si CX es cero - Saltar si igual - Saltar si mayor - Saltar si mayor o igual - Saltar si menor - Saltar si menor o igual - Saltar si no es mayor - Saltar sino es mayor o igual - Saltar si no es menor - Saltar si no es menor o igual - Saltar si no hay acarreo - Saltar si no es igual - 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 operación 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 interrupción. INT INTO IRET - Invocar a la interrupción - Interrupción si desbordamiento - Retorno de interrupción Instrucciones de control de microprocesador. CLC - Borrar bandera de acarreo CLD - Borrar bandera de dirección CLI - Borrar bandera de interrupción CMC - Complementar bandera de acarreo ESC - Escape (transmitir información a un coprocesador) HLT - Parar el procesador LOCK - Bloquear el bus NOP - No operación STC - Activar bandera de acarreo STD - Activar bandera de dirección STI - Activar bandera de interrupción WAIT - Esperar a que termine un coprocesador. 5 Buses y Periféricos. ITIS. (01/02) Ensamblador y Turbo debugger DIRECTIVAS DEL COMPILADOR Directivas de datos Definición de símbolos EQU = - Asigna símbolo a expresión fija - Asigna símbolo a expresión variable TITLE - Título del listado SUBTTL - Subtítulo del listado Listado de macros .LALL - Listar macros y expansiones .SALL - Suprimir listado macros y expansiones .XALL - Listar sólo macros que generan código objeto Control del listado Definición de datos DB DW DD DQ DT - Definir byte - Definir palabra - Definir doble palabra - Definir cuádruple palabra - Definir diez bytes .XCREF .CREF .XLIST .LIST - Suprimir referencias cruzadas - Restaurar listado de referencias cruzadas - Suprimir listado ensamblador - Restaurar listado ensamblador Comentarios COMMENT - Comentario Referencias externas PUBLIC - Definir símbolo público EXTRN - Definir símbolo externo INCLUDE - Incluir fichero fuente Control del ensamblador END - Fin del módulo fuente ORIGIN - Origen de código o datos EVEN - Poner contador de posiciones a par .RADIX - Definir base de numeración por defecto. Definición 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 Definición de bloques GROUP - Agrupar segmentos NAME - Nombrar un módulo LABEL - Asignar un atributo a un nombre RECORD - Definir registro STRUC - Definir estructura Directivas condicionales IF ELSE ENDIF - Evaluar condición y decidir - Si condición es falsa - Fin de estructura condicional Directivas de listado Mensajes %OUT - Emitir un mensaje durante el ensamblaje Control del listado de los bloques asociados a una condición falsa .LFCOND - Listar bloques asociados a una condición falsa .SFCOND - Suprimir ese listado mencionado arriba .TFCOND - Invertir el modo de listado de los bloques... Directivas de macro Definición de macros MACRO - Comienza macro ENDM - Fin macro LOCAL - Define etiquetas dentro de macro EXITM - Terminar expansión de la macro PURGE - Borrar macros de la memoria REPT - Repetir bloque de sentencias un número de veces IRP - Repetir bloque de sentencias con un valor cada vez IRPC - Repetir bloque de sentencias con un carácter cada vez Operadores de macro & - Operador para concatenar símbolos o texto ;; - Operador para comentarios que no aparecerán en la expansión ! - Operador para interpretar caracteres en sentido literal % - Operador para convertir una expresión en un número Formato del listado PAGE - Formato de la página del listado 6