Lenguaje Ensamblador Equipo 3 Alberto Abraham Gomez Cruz Edgar Unidad 1 1.3 Interruptores 1.4 Estructura de un programa en ensamblador Introducción El lenguaje ensamblador es el sistema alfanumérico para escribir código máquina mediante expresiones abreviadas (mnemotécnicos). La compilación es más complicada porque incluye la conversión de operaciones matemáticas complejas, comandos de lenguaje natural o tipos de comandos complejos. Introducción Cada ordenador tiene su propio lenguaje ensamblador, exclusivo de su CPU; un lenguaje de alto nivel (LAN) puede ser compilado en distintas máquinas. Introducción Es usado principalmente porque hay aplicaciones o programas que deben tratar directamente con los registros de la máquina, la memoria, dispositivos de E/S, etc. 1.3 Interruptores Definición: Una interrupción es una operación que suspende la ejecución de un programa de modo que el sistema pueda realizar una acción especial. La rutina de interrupción ejecuta y por lo regular regresa el control al procedimiento que fue interrumpido, el cual entonces reasume su ejecución. 1) INTERRUPCIONES INTERNAS DE HARDWARE: Las interrupciones internas son generadas por ciertos eventos que surgen durante la ejecución de un programa. Este tipo de interrupciones son manejadas en su totalidad por el hardware y no es posible modificarlas. 2) INTERRUPCIONES EXTERNAS DE HARDWARE: Las interrupciones externas las generan los dispositivos periféricos, como pueden ser: teclado, impresoras, tarjetas de comunicaciones, etc. También son generadas por los coprocesadores. No es posible desactivar a las interrupciones externas. Estas interrupciones no son enviadas directamente a la UCP, sino que se mandan a un circuito integrado cuya función es exclusivamente manejar este tipo de interrupciones. 3) INTERRUPCIONES DE SOFTWARE: Las interrupciones de software pueden ser activadas directamente por el ensamblador invocando al número de interrupción deseada con la instrucción INT. El uso de las interrupciones nos ayuda en la creación de programas, utilizándolas nuestros programas son más cortos, es más fácil entenderlos y usualmente tienen un mejor desempeño debido en gran parte a su menor tamaño. IRQ Definición (Interrupt ReQuest - solicitud de interrupción). Canales utilizados para gestionar dispositivos periféricos. Las IRQ son las líneas de interrupción que utilizan los dispositivos para avisar al microprocesador que necesitan su atención. Números IRQ IRQ 0: cronómetro del sistema. Este interruptor está reservado para el timer del sistema y jamás está disponible para otros dispositivos. •IRQ 1: controlador del teclado. •IRQ 2: Interrupciones en cascada para las interrupciones IRQ del 8 al 15. •IRQ 3: Segundo Puerto Serie (COM2). A menudo es también para el cuarto puerto serie (COM4). •IRQ 4: Primer Puerto Serie (COM1). También es utilizado por defecto para el COM3. Numeros IRQ •IRQ 5: Tarjeta de sonido. •IRQ 6: Controlador de disquetera. •IRQ 7: Puerto Paralelo LPT1 para impresoras o cualquier otro dispositivo que utiliza puerto paralelo. •IRQ 8: Reloj del Sistema. •IRQ 9, 10, 11: Interrupción disponible para periféricos extras. Números IRQ •IRQ 12: Mouse PS/2 o Placa de Red o similares. •IRQ 13: Coprocesador/Unidad de punto flotante •IRQ 14: Canal IDE Primario. En sistemas que no se utiliza dispositivos IDE, este canal se utiliza para otros periféricos •IRQ 15: Canal IDE Secundario PIC Definición Los PIC son los circuitos integrados de Microchip Technology Inc. , que pertenece a la categoría de los microcontroladores es decir, aquellos componentes que integran en un único dispositivo todos los circuitos necesarios para realizar un completo sistema digital programable. INT fundamental (es decir, integrada en el compilador de tipo numérico utilizado para definir las variables de explotación números enteros). El tamaño del número que se puede almacenar en un entero depende del hardware. Por lo general, pero no siempre es así de 32 bits el rango de valores está entre -2.147.483.648 y 2.147.483.647. FLAGS la bandera o flag se refiere a uno o más bits que se utilizan para almacenar un valor binario o código que tiene asignado un significado 1.3.1 Hardware Las interrupciones hardware ocurren cuando un dispositivo necesita atención del procesador y genera una señal eléctrica en la línea IRQ que tiene asignada. Esta señal es recogida y procesada por el controlador de excepciones PIC antes de ser enviada al procesador, lo que puede realizarse de dos formas, según el tipo de interrupción sea enmascarable o no enmascarable. 1.3.1 Hardware Cuando se habla de una significa que, bajo control del software, el procesador puede aceptar o ignorar (enmascarar) la señal de interrupción. Para ello se envía una señal a la patilla INTR, y el procesador la atiende o la ignora en función del contenido de un bit (IF) en un registro (FLAGS) que puede estar habilitado o deshabilitado. 1.3.1 Hardware En el primer caso, cuando se recibe la señal, el procesador concluye la instrucción que estuviese en proceso y a continuación responde con una combinación de señales en algunas de sus patillas componiendo una sucesión de dos señales INTA ("Interrupt Acknowledge“). 1.3.1 Hardware La primera señal es simplemente un aviso; la segunda es una petición para que el PIC coloque en el bus de datos un Byte con el número de interrupción, de forma que el procesador pueda localizar el servicio solicitado. 1.3.1 Hardware El valor recibido (0-255) es multiplicado por 4 para calcular la dirección del vector correspondiente en la tabla de vectores de interrupción, lo que se realiza mediante un desplazamiento binario de dos posiciones a la izquierda. El procesador dejará de hacer lo que está haciendo para atender al dispositivo para posteriormente regresar a la tarea que estaba ejecutando antes de ser interrumpido. 1.3.1 Hardware A este tipo de interrupción se le conoce como Interrupción por Hardware. Para atender a un dispositivo el procesador ejecuta una rutina especial llamada Rutina de Servicio a Interrupciones. Las rutinas de servicio a interrupciones, por lo general, se cargan a la memoria RAM como parte del proceso de iniciación de la computadora. Interrupción no enmascarable significa que la interrupción no puede ser deshabilitada por software. Este tipo de interrupciones ocurren cuando se recibe una señal en la patilla NMI ("Nonmaskable Interrupt") del procesador. Se reservan para casos en que es crítica la respuesta, por ejemplo que se detecte un error de paridad en la memoria. Además son de prioridad más alta que las enmascarables. 1.3.2.- Software Un programa escrito en un lenguaje de alto nivel utiliza funciones de la biblioteca estándar, provistas por el compilador empleado, para realizar la mayoría de las tareas relacionadas con el manejo de los dispositivos de entrada y salida, y la gestión de los archivos y memoria 1.3.2.- Software. Los procesadores Intel de la gama x86 y compatibles, disponen de una instrucción INT que permite generar por software cualquiera de los 256 tipos de interrupción anteriormente descritos 1.3.2.- Software El proceso seguido es exactamente el mismo que si se recibe una interrupción hardware en la patilla INTR, salvo que en este caso se conoce el tipo de interrupción, y no se requiere ningún ciclo INTA. Este tipo de interrupciones son de prioridad más alta que las de hardware (enmascarables y no enmascarables), de forma que si se recibe una interrupción hardware mientras que se ejecuta una software, esta última tiene prioridad 1.3.2.- Software Cuando un programa ejecuta una llamada al sistema interrumpe al procesador. 1.3.2.- Software El procesador dejará de hacer lo que está haciendo para ejecutar la rutina del sistema deseada y posteriormente regresará a la tarea que estaba ejecutando antes de ser interrumpido. 1.3.2.- Software La estructura de una rutina del sistema es igual a la estructura de una rutina de servicio a interrupciones. Una llamada al sistema se genera mediante una instrucción del ensamblador llamada Interrupción por Software. FUNCIONES DE LA BIOS Las funciones de la BIOS se invocan, desde los programas de usuario, ejecutando una interrupción software con un cierto valor inicial en los registros Funciones del BIOS Las rutinas del BIOS (Basic Input/Output System) son específicas a cada computadora y las proporciona el fabricante del sistema. Contienen los manejadores por defecto para los siguientes dispositivos: Funciones del BIOS · · · · · Monitor y teclado Puerto serie Dispositivo auxiliar Reloj de tiempo real Unidades de disco FUNCIONES DE LA BIOS INT 10h: Servicios de Vídeo (texto y gráficos). INT 11h: Informe sobre la configuración del equipo. INT 12h: Informe sobre el tamaño de la memoria convencional. INT 13h: Servicios de disco (muy elementales: pistas, sectores, etc.). INT 14h: Comunicaciones en serie. INT 15h: Funciones casette (PC) y servicios especiales del sistema (AT). INT 16h: Servicios de teclado. INT 17h: Servicios de impresora. INT 18h: Llamar a la ROM del BASIC (sólo máquinas IBM). INT 19h: Reinicialización del sistema. INT 1Ah: Servicios horarios. INT 1Fh: Apunta a la tabla de los caracteres ASCII 128-255 (8x8 puntos). FUNCIONES DEL BIOS Las rutinas del BIOS son cargadas a memoria RAM durante el proceso de iniciación del sistema y se encuentran en un archivo llamado IO.SYS o IBMBIO.COM. Ejemplo sobre Rutinas del BIOS ;************************************************************* ; BIOS_MAC.ASM ; ; Este archivo contiene macros permiten desplegar un carácter ; a pantalla y leer un carácter del teclado. Las macros utilizan ; llamadas a las rutinas del BIOS ;************************************************************* ;************************************************************* ; APUTCH ; ; Esta macro despliega un carácter en la pantalla ; ; Parámetro: ; ; AL = carácter ; ; Regresa: ; ; Nada ;************************************************************* macro aputch mov ah, 0Eh ;; Despliega un carácter mov bh, 0 ;; en la página 0 int 10h ;; Interrupción de video endm aputch ;************************************************************* ; AGETCH ; ; Esta macro lee un carácter del teclado ; ; Parámetro: ; ; Nada ;;; ; Regresa: ; ; AH = Código de la tecla ; AL = Código ASCII del carácter ;************************************************************* macro agetch mov ah, 10h ;; Leer un carácter int 16h ;; Interrupción del teclado endm agetch FUNCIONES DEL DOS NT 20h: Terminar programa (tal vez en desuso). INT 21h: Servicios del DOS. INT 22h: Control de finalización de programas. INT 23h: Tratamiento de Ctrl-C. INT 24h: Tratamiento de errores críticos. INT 25h: Lectura absoluta de disco (sectores lógicos). INT 26h: Escritura absoluta en disco (sectores lógicos). INT 27h: Terminar dejando residente el programa (en desuso). INT 28h: Idle (ejecutada cuando el ordenador está inactivo). INT 29h: Impresión rápida en pantalla (no tanto). INT 2Ah: Red local MS NET. INT 2Bh-2Dh: Uso interno del DOS. INT 2Eh: Procesos Batch. INT 2Fh: Interrupción Multiplex. INT 30h-31h: Compatibilidad CP/M-80. INT 32h: Reservada. Vectores De Interrupción Ejemplo sobre Rutinas del DOS ;************************************************************* ; DOS_MAC.ASM ; ; Este archivo contiene macros que permiten desplegar un ; carácter a pantalla y leer un carácter del teclado. Las ; macros utilizan llamadas a las rutinas del DOS ;************************************************************* ;************************************************************* ; APUTCHAR ; ; Esta macro despliega un carácter en la pantalla ; ; Parámetro: ; ; DL = carácter ; ; Regresa: ; ; Nada ;************************************************************* 1.4.- Estructura de un programa en ensamblador. Un programa en lenguaje ensamblador estará formado por una secuencia de sentencias. Cada sentencia ocupa una sola línea y tiene la siguiente estructura: etiqueta] [operación] [operandos] [;comentarios] Estructura de un programa en ensamblador. Los cuatro campos de una sentencia son opcionales, si no aparece ninguno de ellos (una línea en blanco) tendríamos una sentencia vacía. Las sentencias se dividen en dos tipos: * Instrucciones: Estas sentencias representan órdenes al procesador y tras el proceso de compilación generan código ejecutable. * Directivas: Estas sentencias dirigen el proceso de compilación o construcción del programa ejecutable. No generan código ejecutable. Normalmente se utilizan para aumentar la legibilidad del código fuente. Estructura de un fichero en lenguaje ensamblador La estructura a seguir se muestra a continuación: escala EQU 1000 ;Definición de constantes simbólicas ORIGEN 7F40h ;Definición del origen de carga del programa INICIO ini ;Definición de la etiqueta que marca la ;primera instrucción a ejecutar del programa .PILA 100h ;Definición de la pila .DATOS ;Definición de los datos del programa dato1 VALOR 12h … .CODIGO ;Definición del código del programa INI: MOV R5, R4 … FIN Estructura de un fichero en lenguaje ensamblador Los ficheros de código fuente escritos en lenguaje ensamblador se organizan en líneas. Cada una de las líneas del fichero puede contener una directiva, una instrucción o ambas cosas a la vez en los casos en que sea posible. No existe una convención establecida para la estructura de un programa en lenguaje ensamblador (no como sucede con otros lenguajes, como C/C++). Como regla de oro, es necesarios la declaración de dos segmentos, la de código (CODE) y la de pila (STACK). En total, hay 4 segmentos principales: Segmento de datos, Segmento de código, Segmento de pila y Segmento Extra. Los diferentes segmentos tienen las siguientes funciones: Segmento de datos: Contiene la dirección donde inicia la declaración de variables. Aquí, escribiremos nuestras variables. Segmento de código: Contiene la dirección de inicio donde se encuentran las instrucciones del programa. Aquí, escribiremos todo el código de nuestro programa Segmento de pila: Contiene la dirección donde se encuentra la pila. Segmento Extra: Contiene la dirección donde podemos almacenar datos extras. TÉCNICAS DE CODIFICACIÓN EN ENSAMBLADOR: BUCLES: Inicialización de un registro(a modo de contador) al nº de vueltas del bucle Etiqueta: Primera instrucción del bucle <resto de instrucciones dentro del bucle> decrementar el contador saltar a la etiqueta si el contador es mayor que cero <instrucciones fuera del bucle> TÉCNICAS DE CODIFICACIÓN EN ENSAMBLADOR: SALTOS CONDICIONALES: Instrucción de comparación Evaluar condición y si se cumple saltar a la etiqueta prefijada <instrucciones para el caso de no cumplirse la condición> saltar fuera del condiciona TÉCNICAS DE CODIFICACIÓN EN ENSAMBLADOR: MACROS: Declaración: <nombre de la macro> MACRO <instrucciones de la macro> ENDM 5 Llamada: <nombre de la macro> TÉCNICAS DE CODIFICACIÓN EN ENSAMBLADOR: SUBRUTINAS: Declaración: <nombre la de subrutina> PROC <instrucciones de la subrutina> RET <nombre de la subrutina> ENDP Llamada: CALL <nombre de la subrutina> Llamado De Procedimientos En Ensamblador Desde C Modelos de memoria Nomenclatura de los segmentos en los programas en C Conclusión Considerando lo mencionado, decimos que : Bibliografía 1. Abel, Peter. Lenguaje Ensamblador y Programación para PC IBM y Compatibles. Capítulo 9 Rutinas en Ensamblador en Programas en C 171 ITSON Manuel Domitsu Kono 3. Brey, Barry B. Los microprocesadores Intel: 8086/8088, 80186, 80286, 80386 y 80486. Hispanoamericana, S. A. México. 1995. 4. Godfrey, J. Terry. Lenguaje Ensamblador para Microcomputadoras IBM para