MICROPROCESADORES Y CONTROL DE PERIFRICOS ENSAMBLADORES Prof Juan
MICROPROCESADORES Y CONTROL DE PERIFÉRICOS ENSAMBLADORES Prof. Juan Álvarez
LENGUAJE ENSAMBLADOR • • • Ensambladores Directivas del lenguaje ensamblador Creación y depuración de programa Ejemplos básicos Formatos de memoria Interrupciones DOS
LENGUAJE DE MÁQUINA El lenguaje de máquina es el lenguaje con el que trabaja la computadora. Este lenguaje binario posee reglas de composición de instrucciones y los programas con este lenguaje son reconocidos por el microprocesador. El lenguaje de máquina no puede ser ejecutado por otro microprocesador de arquitectura distinta o que no sea compatible.
LENGUAJE DE MÁQUINA El lenguaje de máquina es sin embargo un lenguaje difícil de manejar por el programador, se presta para cometer errores en la escritura de instrucciones y en el cálculo de direcciones. Existe sin embargo una correspondencia uno entre las instrucciones del lenguaje de máquina y las del lenguaje ensamblador.
ENSAMBLADORES El ensamblador es un programa que permite escribir programas en lenguaje ensamblador y agrega un conjunto de pseudo-operaciones (directivas) que sirven para definir datos y rutinas que facilitan la tarea de programar. Los ensambladores convierten las rutinas escritas en lenguaje ensamblador en lenguaje de máquina para formar el código objeto y cambian toda referencia simbólica (etiquetas) por las direcciones o datos correspondientes.
ENSAMBLADORES Los ensambladores permiten al programador utilizar el lenguaje ensamblador para escribir los programas. Para crear el programa ejecutable a partir del código objeto, se requiere llamar a otros programas y servicios del sistema operativo y agregar rutinas de run-time. Este proceso se conoce como link. Eventualmente se puede utilizar el Debugger para ejecutar paso a paso el programa ejecutable.
ENSAMBLADORES Existen 2 ensambladores muy usados: • Macro Assembler de Microsoft (MASM). • Turbo Assembler de Borland (TASM). La diferencia entre los ensambladores radica en la forma de generar el código y en las directivas con que cuenta, pero en general las diferencias son mínimas.
DIRECTIVAS DEL ENSAMBLADOR Las directivas del lenguaje ensamblador indican la forma en se va a procesar un programa. Algunas directivas generan y almacenan información en memoria. Por ejemplo: la directiva DB (definir byte) almacena bytes de datos en memoria; la directiva BYTE PTR (puntero de byte) indica más bien el tamaño de los datos a los que un apuntador o registro índice hace referencia.
DIRECTIVAS DEL ENSAMBLADOR El ensamblador acepta por omisión las instrucciones del 8086, a menos que un programa esté precedido de la directiva. 386 ó. 386 P ó por algún otro modificador de selección del microprocesador. Una lista de algunas directivas básicas se dan en la siguiente tabla.
DIRECTIVAS. MODEL Selecciona el modelo de programación . STARTUP Indica el inicio del programa cuando se utilizan modelos de programa . EXIT Regresa al DOS ASSUME Informa al ensamblador del nombre de cada segmento para definir segmento completo OFFSET Especifica una dirección de desplazamiento PROC Inicia un procedimiento
DIRECTIVAS SEGMENT Inicia un segmento STACK Inicio del segmento de pila BYTE Indica tamaño de Byte; al igual que BYTE PTR DB Define un dato de 8 bits DW Define un dato de 16 bits DD Define un dato de 32 bits
DIRECTIVAS DQ Define un dato de 64 bits DT Define un dato de 10 Bytes (80 bits) DUP Genera duplicados DWORD Indica tamaño de palabra doble; al igual que DWORD PTR EQU Relaciona datos con etiqueta NEAR Define un puntero cercano
DIRECTIVAS FAR Define un puntero lejano ORG Establece el inicio dentro de un segmento MACRO Señala el inicio de una secuencia de macros PTR Designa un puntero STRUC Define el inicio de una estructura de datos WORD Indica el tamaño de palabra; así como WORD PTR
DIRECTIVAS END Finaliza un archivo de programa ENDM Finaliza una secuencia de macros ENDP Finaliza un procedimiento ENDS Finaliza un segmento o estructura de datos . 386 Reconoce las instrucciones del 386 . 386 P Reconoce las instrucciones del 386 en el modo protegido
DIRECTIVAS. 586 Reconoce las instrucciones del Pentium . 586 P Reconoce las instrucciones del Pentium en el modo protegido
EL USO DEL TASM El Turbo Assembler de Borland (TASM) tiene varias versiones. En su versión más simple debe considerar los siguientes archivos: C: >Tasm Tasm. exe Tlink. exe También se pueden agregar los archivos Td. exe y rtm. exe para depuración.
EL USO DEL TASM • Para escribir un programa se puede usar el editor del DOS: C: > TAsmedit Escribir el programa y guardar como <nombre>. asm dentro de TAsm También se puede utilizar el notepad 2. • Para obtener el archivo objeto: C: >TAsmTasm <nombre> se crea el archivo <nombre>. obj
EL USO DEL TASM • Para obtener el archivo ejecutable: C: >TAsmTlink <nombre> se crea el archivo <nombre>. exe • Se puede utilizar el depurador (Debug) del sistema operativo para revisar los programas ejecutables en lenguaje de máquina o para ejecutarlos paso a paso. También es posible revisar el contenido del segmento de datos y del segmento de pila. • A continuación, algunos programas básicos:
EJEMPLO 01. model small. stack 100 h. code main proc mov dl, “A” mov ah, 2 int 21 h mov ah, 4 Ch int 21 h main endp end main
EJEMPLO 01 En este programa contiene varias directivas pertenecientes al TASM además de las instrucciones que permite el lenguaje ensamblador del procesador. El programa empieza con la directiva “. model small” que significa que se va a utilizar para este programa un espacio de memoria del tipo “small” de acuerdo al formato de memoria.
FORMATOS DE MEMORIA MODELO CODIGOS DATOS Tiny (diminuto) PILA 64 KB Small (pequeño) 64 KB Medium (mediano) 1 MB 64 KB Compact (compacto) Large (grande) 64 KB 1 MB 1 MB Huge (enorme) 1 MB 64 KB
EJEMPLO 01 Al elegir “model small” se le indica al sistema que se va a separar un espacio de memoria de 64 KB para el segmento de códigos y de 64 KB para los datos y la pila. El modelo “tiny” se utiliza para los programas del tipo *. com, en tanto que los otros modelos se usan para los programas exe.
EJEMPLO 01 Luego viene la directiva “. stack 100 h”, que inicia la pila y separa dentro del espacio reservado para datos 256 bytes. La directiva “. code” permite iniciar el segmento de códigos, dentro del cual se pueden escribir varias rutinas. En este programa no figuran datos y por tanto no se inicia el segmento de datos. El programa termina con “end” y se agrega el nombre del procedimiento con el que empieza el programa.
EJEMPLO 01 El programa en sí aparece entre las expresiones “main proc” y “main endp”. Cualquier rutina debe tener un nombre, en este caso “main”. La rutina pudo haberse llamado con otro nombre, por ejemplo “pancho”. Entonces la rutina empieza después de la fórmula “pancho proc” y termina con “pancho endp”.
EJEMPLO 01 Las tres primeras instrucciones de la rutina imprimen en la pantalla la letra “A”. Para ello se utiliza “int 21 h” que es una interrupción del DOS. Esta interrupción actúa siempre con el contenido del registro AH. Cuando AH=2, entonces significa que el contenido del registro DL será enviado al monitor. Por esta razón se carga previamente DL con el código ASCII de la letra A.
EJEMPLO 01 En el Tasm, el código ASCII de un caracter puede referirse escribiendo el caracter entre comillas. Las dos últimas instrucciones sirven para terminar el programa principal y devolver el control al sistema operativo. Más adelante se da una tabla con algunas interrupciones INT 21 h.
EJEMPLO 01 Al compilar el programa recordando la secuencia: C: >TAsm Tasm ejem 01 C: >TAsm Tlink ejem 01 Se puede ejecutar directo ejem 01. exe; pero también se puede ejecutar paso a paso con el debug: C: >TAsm debug ejem 01. exe
EJEMPLO 01 C: Tasm>debug ejem 01. exe -u 15 D 4: 0000 B 241 MOV DL, 41 15 D 4: 0002 B 409 MOV AH, 09 15 D 4: 0004 CD 21 INT 21 15 D 4: 0006 B 44 C MOV AH, 4 C 15 D 4: 0008 CD 21 INT 21 15 D 4: 000 A FFFF ? ? ? DI
EJEMPLO 01 Obsérvese que el programa está constituido por las cinco primera líneas a partir de CS: 0000, las demás líneas tienen información de la memoria que no va a ser ejecutada. También se puede visualizar el segmento de datos y el segmento de pila, los registros y las banderas. Se puede ejecutar paso a paso. Estas son las facilidades del Debug.
EJEMPLO 01 Nótese que, (al apelar al comando “u” del debug), se observa que en las cinco líneas del programa hay una columna para las direcciones, otra columna para el lenguaje de máquina y otra para el listado en lenguaje ensamblador. Igualmente se ve que en la primera instrucción ya no aparece “A” sino el correspondiente código ASCII de “A”; también que no figuran las sufijos “h” que indicas cantidad hexadecimal.
EJEMPLO 02 ; Este programa visualiza mov ah, 9 en el monitor una cadena lea dx, mensaje de caracteres int 21 h mov ah, 4 Ch. model small int 21 h. stack 100 h main endp. code. data main proc mensaje db ‘Hola mov ax, @data camaron con mov ds, ax cola', 0 dh, 0 ah, ‘$’ end main
EJEMPLO 02 Este programa tiene una estructura parecida al del ejemplo anterior, sin embargo se introduce esta vez el segmento de datos con una información: mensaje db “Hola camaron cola”, 0 Dh, 0 Ah, “$” • Se trata de una cadena de datos del tamaño de 1 byte cada uno. El nombre de la cadena es mensaje y debe terminar con el código ASCII de “$”.
EJEMPLO 02 • Esta cadena está formada por un conjunto de códigos ASCII, cada uno ocupa una posición de memoria en el segmento de datos. El byte 0 Dh indica retornar al inicio de línea y el byte 0 Ah, saltar a la siguiente línea. • Int 21 h con AH = 9 hace que la cadena de caracteres se visualice en la pantalla.
EJEMPLO 02 Las dos primeras instrucciones hacen que la posición de memoria, donde ha sido ubicado el segmento de datos por el sistema operativo, se cargue en el registro DS. • La expresión @data es utilizada para adquirir este dato, que inicialmente el programador no lo conoce. No existe una instrucción para cargar de modo inmediato el dato en DS.
EJEMPLO 02 La instrucción lea dx, mensaje permite cargar en DX la posición de memoria donde empieza la cadena mensaje. El segmento de datos pudo haberse escrito después del segmento de pila y antes del segmento de códigos.
EJEMPLO 03. model small. stack 100 h. code main proc mov cx, 26 mov dl, 'A' L 1: mov ah, 2 int 21 h inc dl loop L 1 mov ah, 4 Ch int 21 h main endp End main
EJEMPLO 03 El programa del ejemplo 03 imprime en la pantalla 28 caracteres ASCII empezando por el código de “A”. Este programa incluye dos instrucciones nuevas. • La instrucción INC reg, incrementa el contenido del registro en una unidad. • La instrucción Loop direcc. , ejecuta un bucle un número de veces igual al contenido de CX desde la posición direcc.
EJEMPLO 03 • Así L 1: es una etiqueta que reemplaza la posición de memoria de la instrucción escrita en esa línea en el segmento de códigos. • En este caso el bucle se ejecutará 28 veces antes de terminar con el programa. En cada vez el contenido de DL se incrementará en 1 para obtener el siguiente código ASCII a imprimir.
EJEMPLO 04. model small. stack 100 h. code main proc mov al, 7 Ah mov cx, 8 L 1: shl al, 1 mov dl, '0' jnc L 2 mov dl, '1' L 2: push ax mov ah, 2 int 21 h pop ax loop L 1 mov ah, 4 Ch int 21 h main endp End main
EJEMPLO 04 Este programa imprime en el monitor el contenido del registro AL en binario. El número 7 Ah = 01111010 aparecerá en la pantalla. En este programa aparecen dos nuevas instrucciones. • La instrucción SHL AL, 1 desplaza todos sus bits una posición hacia la derecha, el bit que sale se carga en el Carry y el espacio vacío se llena con un “ 0”.
EJEMPLO 04 • La instrucción jnc L 2 es un salto condicional dentro del segmento de códigos. Si Carry = 0, entonces el programa continúa en la dirección L 2; si Carry = 1, el programa continúa con la instrucción que sigue sin efectuar ningún salto.
EJEMPLO 04 • La idea de las instrucciones mov dl, '0' jnc L 2 mov dl, ‘ 1’ L 2: --es cargar en DL el código ASCII de ‘ 0’ ó de ‘ 1’ dependiendo de si Carry = 0 ó si Carry = 1.
INTERRUPCIONES Los recursos del sistema se utilizan a través de un conjunto de rutinas que realizan una serie de funciones. Existen dos tipos de rutinas: • BIOS (Basic Input Output System): son rutinas básicas de entrada o salida como leer una tecla, escribir un carácter por pantalla, acceder a un sector de disco.
INTERRUPCIONES • DOS (Disk Operating System): son las rutinas del sistema operativo que facilitan el desarrollo de aplicaciones. Una de las rutinas más frecuentes del DOS se conoce como la INT 21 h, cuya acción recurre a transferir datos por un dispositivo de Entrada/Salida. El tipo de acción depende del valor que tome el registro AH y de algunos otros valores que tomen otros registros, por ejemplo el registro DX o DL.
INTERRUPCIONES Algunas otras rutinas del BIOS son útiles para controlar el ambiente E/S. Estas rutinas están almacenadas en la ROM del sistema y de video. La INT 10 h se conoce como interrupción de servicios de video porque controla directamente la visualización de la pantalla
INTERRUPCIONES La INT 13 h controla las unidades de disco flexible y las unidades de disco duro conectados al sistema. La INT 14 h controla los puertos COM seriales que sirven para comunicaciones.
INTERRUPCIONES La INT 15 h controla a varios dispositivos de entrada/ salida y permite el acceso a la operación en modo protegido y al sistema de memoria extendido. La INT 16 h se utiliza como una interrupción de teclado. La INT 17 h accede al puerto paralelo de la impresora. La INT 33 h controla el uso del ratón.
INT 21 h (tabla resumida) AH OPERACIÓN Detalle 01 Lee el teclado 02 Escribe en el monitor DL = carácter ASCII a (pantalla) visualisar 03 Lee carácter del COM 1 Escribe en COM 1 AL = carácter ASCII leído Imprime en LPT 1 (impresora) DL = carácter ASCII a imprimir 04 05 AL = carácter ASCII; lo escrito en el teclado hace eco en el monitor DL = carácter a enviar
INT 21 h (tabla resumida) AH OPERACIÓN Detalle 08 Lee entrada de dispositivo sin eco Lee carácter de teclado en AL sin eco 09 Visualiza una cadena DS: DX = dirección de de caracteres en el cadena; la cadena se termina monitor con 24 h; 0 Dh para retorno al inicio de línea; 0 Ah para saltar a la siguiente línea 0 A Ingreso de cadena de DS: DX = dirección del buffer, caracteres por teclado el segundo byte del buffer a un buffer contiene el número de caracteres pulsados, en el tercer byte empieza la cadena hasta terminar con 0 Dh
INT 21 h (tabla resumida) AH OPERACIÓN Detalle 0 E Selecciona unidad de DL = número de unidad de disco por omisión disco; AL = número total de unidades de discos presentes. Unidad de disco A = 00 h, B = 01 h, C = 02 h, etc 2 A Lee fecha del sistema AL = día de la semana; CX = año; DH = mes; DL = día del mes (domingo = 00; sábado = 06) Establece fecha del CX = año; DH = mes; DL = sistema día del mes 2 B
INT 21 h (tabla resumida) AH OPERACIÓN Detalle 2 C Lee hora del sistema CH = hora (0 a 23); CL = minutos; DH = segundos; DL = seg/10 2 D Establece hora del sistema CH = hora; CL = minutos; DH = segundos; DL = seg/10 36 Determina espacio libre en disco Crear subdirectorio DL = número de unidad; (ver detalles en manual) DX = dirección de subdirecto- rio de cadena. 39
INT 21 h (tabla resumida) AH OPERACIÓN Detalle 3 A Borra subdirectorio DS: DX = dirección de cadena ASCII del nombre del directorio 3 B Cambiar subdirectorio DX = dirección de subdirectorio 3 C Crear nuevo archivo CX = palabra de atributo: 01 h acceso de sólo lectura, 02 h archivo o directorio oculto, 04 h archivo del sistema , 08 h etiqueta volumen, 10 h subdirectorio, 20 h bit de archivo. DX = dirección de nombre de archivo.
INT 21 h (tabla resumida) AH OPERACIÓN 3 D Abrir un archivo 3 E Cerrar un archivo 3 F Leer un archivo Detalle DX = dirección de archivo. En AL el código de acceso: 00 h sólo lectura, 01 h sólo escritura, 02 h lectura o escritura. BX = manejar archivo, CX = número de bytes a leer, DX = dirección de buffer de archivo
INT 21 h (tabla resumida) AH OPERACIÓN Detalle 40 Escribe un archivo 41 Borra archivo 4 C Devuelve el control al Si hay error este se guarda en DOS AL CX = número de bytes a escribir; BX = asa del archivo; DS: DX = dirección del buffer de archivo que contiene lo datos a escribir DS: DX = dirección de cadena ASCII del nombre del archivo
PROBLEMAS PROPUESTOS 1. Se tiene la siguiente fracción de programa en lenguaje ensamblador: XOR AX, AX MOV SI, 0000 H SUB AX, [SI] ADC AX, [SI + 2] XCHG AX, [SI + 4] MOV BX, [0012 H] AND [BX], AX CMP DX, CX a) Dar el modo de direccionamiento de cada instrucción b) Escribir el lenguaje de máquina de este programa.
PROBLEMAS PROPUESTOS 2. Indicar el modo de direccionamiento de las siguientes instrucciones: MOV BX, [BX + 0050 H] ADD [1000 H], BP SUB CX, 1020 H MOV [EBX + 8*EAX], EDX
PROBLEMAS PROPUESTOS 3. Dar el lenguaje de máquina de las siguientes instrucciones: a)CMP DX, [BX + 200 H] b) ADD [SI], AH c) MOV [1234 H], CX d) MOV DH, BH Nota sobre los códigos de operación: CMP: 001110; ADD: 000000; MOV: 100010.
PROBLEMAS PROPUESTOS 4. Considerar el siguiente programa en lenguaje ensamblador. PUSH DS PUSHA SUB AX, AX MOV AX, CS MOV DS, AX MOV BX, 0100 H MOV AX, [BX] ADD AX, [BX + 2] ADC AX, [BX + 4] MOV [BX + 6], AX
PROBLEMAS PROPUESTOS POPA HLT Se pide: a) Deducir el modo de direccionamiento de cada instrucción b) Traducir a lenguaje de máquina este programa con la información que se adjunta.
- Slides: 59