ELABORO: Ninci Victoria Serrano Reyes PROFESOR: Rogelio Fernando Hernndez Miranda
Chilpancingo, Gro., noviembre de 2013
UNIDAD I
INTRODUCCIN AL LENGUAJE ENSAMBLADOR
1.1 Importancia de la programacin en lenguaje ensamblador. 1.2 El procesador y sus registros internos 1.3 La memoria principal (RAM) 1.4 El concepto de interrupciones 1.5 Llamadas a servicios del sistema 1.6 Modos de direccionamiento 1.7 Proceso de ensamblado y ligado 1.8 Desplegado de mensajes en el monitor
1.1 IMPORTANCIA DE LA PROGRAMACIN EN LENGUAJE ENSAMBLADOR. El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas informticos, y constituye la representacin ms directa del cdigo mquina especfico para cada arquitectura de microprocesador. La importancia del lenguaje ensamblador radica principalmente que se trabaja directamente con el microprocesador; por lo cual se debe de conocer el funcionamiento interno de este, tiene la ventaja de que en l se puede realizar cualquier tipo de programas que en los lenguajes de alto nivel no lo pueden realizar. Otro punto sera que los programas en ensamblador ocupan menos espacio en memoria. Ventajas 1. Como trabaja directamente con el microprocesador al ejecutar un programa, pues como este lenguaje es el ms cercano a la mquina la computadora lo procesa ms rpido. 2. Eficiencia de tamao. Un programa en ensamblador no ocupa mucho espacio en memoria porque no tiene que cargar libreras y dems como son los lenguajes de alto nivel 3. Flexibilidad .- Es flexible porque todo lo que puede hacerse con una mquina, puede hacerse en el lenguaje ensamblador de esta mquina; los lenguajes de alto nivel tienen en una u otra forma limitantes para explotar al mximo los recursos de la mquina. O sea que en lenguaje ensamblador se pueden hacer tareas especficas que en un lenguaje de alto nivel no se pueden llevar acabo porque tienen ciertas limitantes que no se lo permite. Desventajas Tiempo de programacin .- Como es un lenguaje de bajo nivel requiere ms instrucciones para realizar el mismo proceso, en comparacin con un lenguaje de alto nivel. Por otro lado, requiere de ms cuidado por parte del programador, pues es propenso a que los errores de lgica se reflejen ms fuertemente en la ejecucin. Programas fuente grandes .- Por las mismas razones que aumenta el tiempo, crecen los programas fuentes; simplemente requerimos ms instrucciones primitivas para describir procesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores. Peligro de afectar recursos inesperadamente .- Que todo error que podamos cometer, o todo riesgo que podamos tener, podemos afectar los recursos de la mquina, programar en este lenguaje lo ms comn que pueda pasar es que la mquina se bloquee o se reinicialice. Porque con este lenguaje es perfectamente posible (y sencillo) realizar secuencias de instrucciones invlidas, que normalmente no aparecen al usar un lenguaje de alto nivel. Falta de portabilidad.- Porque para cada mquina existe un lenguaje ensamblador; por ello, evidentemente no es una seleccin apropiada de lenguaje cuando deseamos codificar en una mquina y luego llevar los programas a otros sistemas operativos o modelos de computadoras. BIBLIOGRAFIA: www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r78731.DOCX
1.2 EL PROCESADOR Y SUS REGISTROS INTERNOS
BIBLIOGRAFIA: Programacin Avanzada en Lenguaje Ensamblador, Ramn Medina 1.3 LA MEMORIA PRINCIPAL (RAM)
BIBLIOGRAFIA: Lenguaje Ensamblador y programacin para IBM PC y compatibles, Peter Abel, Tercera Edicin. 1.4 EL CONCEPTO DE INTERRUPCIONES Ya que un procesador no puede procesar simultneamente varios trozos de informacin (procesa un trozo de informacin por vez), un programa que est siendo ejecutado puede, gracias al pedido de interrupcin, ser momentneamente suspendido mientras se produce una interrupcin. El programa interrumpido puede continuar ejecutndose luego. Existen 256 direcciones de interrupcin diferentes. Una interrupcin se convierte en una interrupcin de hardware cuando es solicitada por uno de los compone ntes de hardware del equipo. En efecto, existen varios perifricos en un equipo. Estos perifricos necesitan generalmente utilizar los recursos del sistema aunque slo sea para comunicarse con el sistema mismo. Cuando un perifrico desea acceder a un recurso, enva un pedido de interrupcin al procesador para llamar su atencin. Los perifricos cuentan con un nmero de interrupcin que se denomina IRQ (Peticiones de Interrupcin. Es como si cada perifrico tirara de un "hilo" que est atado a una campana para sealarle al equipo que desea que le preste atencin. Este "hilo" es, de hecho, una lnea fsica que conecta cada ranura de expansin as como cada interfaz E/S a la placa madre. Para una ranura ISA de 8 bits, por ejemplo, hay 8 lneas IRQ que unen ranuras ISA de 8 bits a la placa madre (IRQ0 a IRQ7). Estos IRQ estn controlados por un "controlador de interrupcin" que se encarga de cederle la palabra al IRQ que posee la mayor prioridad. Al aparecer las ranuras de 16 bits, se agregaron IRQ 8 a 15. En consecuencia, fue necesario agregar un segundo controlador de interrupcin. Los dos grupos de interrupciones estn unidos por IRQ 2 el cual se conecta (o "produce una cascada") a IRQ9. En cierto modo, esta cascada "inserta" IRQ 8 a 15 entre IRQ1 y 3:
Dado que la prioridad va del IRQ inferior al superior y que se insertan IRQ 8 a 15 entre IRQ 1 y 3, el orden de prioridad es el siguiente: 0 > 1 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 3 > 4 > 5 > 6 > 7 BIBLIOGRAFIA:
1.5 LLAMADAS A SERVICIOS DEL SISTEMA Las llamadas son peticiones a ejecucin de rutinas y proporcionan la interfaz entre el sistema operativo y un programa en ejecucin. Estas llamadas son instrucciones de lenguaje ensamblador y se presentan en los manuales que emplean los programadores de este lenguaje. Las llamadas al sistema para ejecucin y el control de programas, usualmente incluyen un conjunto completo de los servicios accesibles por la va del lenguajes de rdenes, tales como: RUN, EXECUTE, ABORT y planificacin relacionada con el tiempo, adems los usuarios con las llamadas del sistema pueden suspender, establecer o cambiar atributos del tiempo de ejecucin de uno o ms programas. Las llamadas del sistema para el gestor de recursos, proporcionan servicios para la asignacin, reserva y reclamacin de los recursos del sistema. Por ejemplo, existen llamadas del sistema para extender o reducir la cantidad de memoria poseda por el programa que es llama. Las llamadas del sistema pueden asignar o reservar otros tipos de objetos del sistema y despus destruir o devolver su custodia al sistema operativo. Las llamadas al sistema se pueden agrupar en cinco categoras: 1. Control de proceso (Crear, cargar, ejecutar un proceso, obtener y establecer atributos, esperar un suceso, liberar memoria, abortar y terminar proceso). 2. Manipulacin de archivos (Crear, abrir, leer, obtener y establecer atributos, cerrar y eliminar archivos). 3. Manipulacin de perifricos (Solicitar, escribir, leer, obtener y establecer atributos, liberar perifrico). 4. Manipulacin de la informacin (Obtener fecha y hora, establecer fecha y hora, obtener y establecer datos del sistema, obtener y establecer atributos). 5. Comunicaciones (Crear conexin, enviar mensajes, recibir mensajes, transferir informacin del estado y eliminar conexin. BIBLIOGRAFIA: www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r87219.PPTX 1.6 MODOS DE DIRECCIONAMIENTO
BIBLIOGRAFIA: Programacin Avanzada en Lenguaje Ensamblador, Ramn Medina 1.7 PROCESO DE ENSAMBLADO Y LIGADO
BIBLIOGRAFIA: http://www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r87222.PDF 1.8 DESPLEGADO DE MENSAJES EN EL MONITOR Empezamos con escribir el mensaje que queremos desplegar esto de hace de la siguiente forma. mov ah, 09h lea cx, mensaje int 21h * En la primera instruccin (mov ah,09h) es lo que nos permite desplegar el mensaje. *en la segunda instruccin(lea cx, mensaje) es el que manda a llamar el mensaje en este caso el mensaje se llama "mensaje" por eso despus de la coma le puse mensaje este nombre puede variar, debe recordar que al final del mensaje usted tiene que poner el smbolo $ para que el programa vea que es el final del mensaje. *en la ltima instruccin (int 21h) llama al BIOS.
"aclaro el mensaje tiene que ser del mismo nombre que le pusiste al principio de lo contrario marcara un error y no se desplegara el mensaje (datas segment mensaje db "mi nombre es$" datas ends) este es un ejemplo de cmo declarar un mensaje, el mensaje es lo que est escrito entre comillas y termina con $" El siguiente cdigo es para posicionar el curso el cualquier parte de la pantalla, para que puedas empezara a escribir desde donde t le pongas a tu programa. Para realizar esto se deber ingresar este conjunto de instrucciones.
mov ah,02h mov dh,03h mov dl,0ch int 10h
* En la primera instruccin (mov ah,02h) es lo que nos permite mover el cursor. *la segunda instruccin (mov dh,03h) es la direccin de la fila, en este caso yo estoy posicionando el cursor en la fila 3 (hexadecimal). *en la tercera instruccin (mov dl,0ch) es la direccin de la columna, en esta caso tambin yo estoy posicionando el cursor en la columna 12 solo que esta en hexadecimal. *y por ultimo mandamos a llamar al BIOS.
El siguiente cdigo nos permitir leer un carcter con eco. Leer un carcter con eco quiere decir que al leer el carcter, este lo mostrara y lo podemos hacer con el siguiente cdigo. mov ah,01h
int 21h *La primera instruccin (mov ah,01h) es lo que nos permite leer el carcter con eco, cabe destacar que yo estoy utilizando esta funcin(01h) pero hay otros tambin. *En el ltimo solo mandamos a llamar el BIOS y listo. Este cdigo nos permitir leer un carcter sin eco. Leer un carcter sin eco quiere decir que al pulsar un carcter esta no se mostrara hasta que hagamos un mtodo para desplegar el carcter.
mov ah,07h int 21h *En la primera instruccin (mov ah,07h) nos permite leer el carcter sin eco, al igual que el cdigo anterior aqu tambin hay otras funciones ms. * Y por ltimo mandamos a llamar al BIOS. "Este cdigo puede ser til, cuando queramos que nuestro programa acepte solo algunos caracteres en especfico".
Cdigo para desplegar un solo carcter. Algunas veces queremos imprimir cualquier carcter y para lograr eso el siguiente cdigo no ser de utilidad. mov ah,0eh mov al, '@' int 10h * En la primera instruccin (mov ah,0eh) es la funcin para poder imprimir un carcter. *En la segunda instruccin (mov al, '@') es lo que nos permite imprimir el carcter en este caso el carcter es @ y se almacena en ' al ' en este cdigo le puse el arroba pero tambien esto puede variar, por ejemplo para imprimir un carcter del cdigo ASCII solo puedes poner el numero en hexadecimal equivalente al cdigo pero solo se quitan los apostrofes( ' ' ) es solamente el puro numero pero no olvides que si pones ay directamente el carcter es son apostrofes. * Por ultimo mandamos a llamar al BIOS con la interrupcin 21 (int 21h).
Los siguientes cdigos son para empilar y desempolvar (push) y (pop) Al hablar de empilar me refiero a ingresar un dato o registro en una pila (un espacio para guardar elementos) y desempilar es quitar el dato de alguna pila y para ello utilizaremos los siguientes cdigos. push ax * Con esta instruccin podemos empilar el registro ax, es decir guardar el contenido del registro, tambin se pueden empilar los dems registros (bx, cx, dx) pop ax * Con esta instruccin desempilamos el registro ax, es decir quitamos el contenido del registro ax de la pila.
nota: "en las pilas, los datos que se ingresan al principio se desempilan al ltimo y los que se empilan al ltimo de empilan al principio".
Cdigo para obtener la fecha del sistema. A veces necesitamos obtener la fecha del sistema es por eso que tambin pongo el cdigo para realizar esto. mov ah,02h int 21h
*En la primera instruccin (mov ah,02h) es para pedir la fecha del sistema y se almacenan en los siguientes registros al=dia (en donde 0 equivale a domingo) , cx= ao(que se muestra en hexadecimal), dh=mes(que se muestra del 01 al 12), dl=dia (que se muestra de 01 al 31). * Y por ltimo mandamos a llamar al BIOS para finalizar.
Cdigo para obtener la hora del sistema. Este es el cdigo que se utiliza para obtener la hora del sistema.
mov ah,2ch int 21h
*En la primera instruccin (mov ah,2ch) es para pedir la hora del sistema y se guarda en los siguientes registros ch=hora, cl=minutos, dh=segundos y cl=centsimas de segundo *Por ultimo mandamos a llamar al BIOS
UNIDAD II
PROGRAMACIN BSICA 2.1 Ensamblador (y ligador) a utilizar 2.2 Ciclos numricos 2.3 Captura bsica de cadenas 2.4 Comparacin y prueba 2.5 Saltos 2.6 Ciclos condicionales 2.7 Incremento y decremento 2.8 Captura de cadenas con formato 2.9 Instrucciones aritmticas 2.10 Manipulacin de la pila 2.11 Obtencin de cadena con representacin decimal 2.12 Instrucciones lgicas 2.13 Desplazamiento y rotacin 2.14 Obtencin de una cadena con la representacin hexadecimal 2.15 Captura y almacenamiento de datos numricos 2.16 Operaciones bsicas sobre archivos de disco
2.1 ENSAMBLADOR (Y LIGADOR) A UTILIZAR
Bibliografa: Lenguaje Ensamblador y programacin para IBM PC y compatibles, Peter Abel, Tercera Edicin. 2.2 CICLOS NUMRICOS El lenguaje ensamblador cuenta con una instruccin muy poderosa que permite la programacin de ciclos _nitos, la instruccin LOOP. Esta instruccin trabaja en forma conjunta con el registro contador CX. El formato general de esta instruccin es: Mov CX,Numero_Veces Etiqueta: Instrucciones a realizar Loop Etiqueta
La instruccin Loop ejecuta las instrucciones que se encuentran entre la Etiqueta: y Loop Etiqueta el numero de veces que indique el campo No_Veces. Por ejemplo, el siguiente grupo de instrucciones incrementa en 1 el registro AX, esto lo repite 100 veces. Mov CX,100 ;100 veces repetir: Nombre de la etiqueta Inc AX ;AX = AX + 1 Loop repetir Regresa a la etiqueta y compara el ciclo
La instruccin Loop decrementa el registro CX en cada iteracin y se detiene cuando CX es igual a cero.
2.3 CAPTURA BSICA DE CADENAS En este ejemplo simplemente capturamos una cadena en un vector y la imprimimos cuantas veces quiera el usuario, en este programa aprendemos a usar vectores en MASM.
Los vectores se pueden declarar de cualquier tipo de dato que una variable cualquiera solo que se especifica la longitud del vector y con que tipo de dato inicia al crearse para ello se utiliza la palabra reservada dup.
Ejemplo de declaracion de un vector: vector db 100 dup('$')
En este caso declaramos un vector de tipo db con una longitud de 100 posiciones y la iniciamos con cadena vacia ('$').
Para manejar las posiciones de los vectores se utilizan los registros SI y DI.
Ejemplo del programa usuando un vector para almacenar una cadena digitada por el usuario.
.model small .stack 64 .data inicio db 'Repetir Texto..',10,13,'$' ingresar db 10,13,'Ingresa tu nombre', 10,13,'$' nombre db 'Su nombre es: $' repetir db 10,13,'Quiere repetir s/n?',10,13,'$' ;Declaracion del vector vtext db 100 dup('$')
;Iniciamos nuestro conteo de si en la posicion 0. mov si,00h leer: mov ax,0000 mov ah,01h int 21h ;Guardamos el valor tecleado por el usuario en la posicion si del vector. mov vtext[si],al inc si ;Incrementamos nuestro contador cmp al,0dh ;Se repite el ingreso de datos hasta que se teclee un Enter. ja leer jb leer lea dx,nombre mov ah,09 int 21h
ver: mov dx,offset vtext ;Imprime el contenido del vector con la misma instruccin de una cadena mov ah,09h int 21h lea dx,repetir ;imprime si quiere ver de nuevo el texto escrito. mov ah,09 int 21h mov ah,01h int 21h cmp al,73h ;Si la tecla presiona es una s se repite la impresin del vector. je ver
salir: mov ah,4ch int 21h
end
2.4 COMPARACIN Y PRUEBA Las instrucciones CMP (comparacin) y TEST (comprobacin) realizan sendas operaciones aritmticas de las que no se guarda el resultado obtenido sino que nicamente se modifican los bits de estado. La instruccin CMP recibe dos operandos. El primero de ellos puede ser de tipo constante, registro u operando en memoria. El segundo puede ser nicamente de tipo registro u operando en memoria. La instruccin no permite que ambos operandos estn en memoria. Al ejecutar esta instruccin se resta el primer operando del segundo. El valor resultante no se almacena en lugar alguno, pero s se modifican los bits de estado del procesador. Considrese el cdigo mostrado en el ejemplo 5.5. La instruccin de comparacin modifica los bits de estado para que la instruccin de salto los interprete y decida si debe saltar o continuar ejecutando la instruccin ADD. Ejemplo 5.5. Instruccin de comparacin antes de salto condicional CMP $0, %eax # Se calcula %eax - 0 JE destino ADD %eax, %ebx
La instruccin JE produce un salto cuando el bit de estado ZF tiene el valor 1. Este bit, a su vez se pone a uno si los operandos de la instruccin CMP son iguales. Por tanto, la instruccin JE, cuando va a continuacin de una instruccin de comparacin, se puede interpretar como salto si los operandos (de la instruccin anterior) son iguales. En la mayora de las instrucciones de salto condicional detalladas en la seccin 5.4.5, las ltimas letras del nombre hacen referencia a la condicin que se comprueba cuando se ejecutan a continuacin de una instruccin de comparacin. Por ejemplo, la instruccin JLE produce un salto cuando los bits de condicin cumplen ZF= 1 o SF!=OF. Si esta instruccin va precedida de una instruccin de comparacin, ZF es igual a 1 si los dos operandos son iguales. Si SF es diferente a OF la resta ha producido un bit de signo, y el bit de desbordamiento con valores diferentes. Esta situacin se produce si el segundo operando es menor que el primero, de ah el sufijo LE(del ingls less or equal) en la instruccin de salto. La tabla 5.11 muestra las combinaciones obtenidas del bit de desbordamiento y la resta para el caso de enteros representados con 2 bits. Tabla 5.11. Resta y bit de desbordamiento de dos enteros de 2 bits OF, A-B B (-2) 10 (-1) 11 (0) 00 (1) 01 A (-2) 10 0, 00 0, 11 0, 10 1, 01 (-1) 11 0, 01 0, 00 0, 11 0, 10 (0) 00 1, 10 0, 01 0, 00 0, 11 (1) 01 1, 11 1, 10 0, 01 0, 00
El bit de signo y el de desbordamiento tienen valores diferentes nicamente en el caso en que el primer operando de la resta es menor que el segundo. Por tanto, la instruccin JLEsi se ejecuta a continuacin de una instruccin CMP se garantiza que el salto se lleva a cabo si el segundo operando es menor que el primero. Las instrucciones de salto cuya condicin puede interpretarse con respecto a la instruccin de comparacin que le precede son las que en la descripcin mostrada en la tabla tabla 5.10 incluyen una comparacin. Aunque estas instrucciones no deben ir necesariamente precedidas por una instruccin de comparacin porque la condicin se evala con respecto a los bits de estado, generalmente se utilizan acompaadas de stas. Para interpretar el comportamiento de una instruccin de comparacin seguida de una de salto condicional se puede utilizar la siguiente regla mnemotcnica: Salto condicional precedido de comparacin Dada la siguiente secuencia de dos instrucciones en ensamblador: CMP B, A Jcond Donde A y Bson cualquier operando ycondes cualquiera de las condiciones posibles, el salto se lleva a cabo si se cumpleA cond B. Por ejemplo, si la instruccin CMP $4, %eax va seguida del salto condicional JL destino, el procesador saltar a destino si %eax < 4. La tabla 5.12 muestra posibles secuencias de instrucciones de comparacin y salto condicional. Tabla 5.12. Secuencias de instrucciones de comparacin y salto condicional Cdigo Comentario inicio: inc %eax cmp $128, %eax jae final ... jmp inicio final: mov $'A, %cl ... El salto a final se produce si el registro %eax contiene un valor mayor o igual a 128. La condicin del salto es para operandos sin signo, es decir, el resultado de la comparacin se interpreta como si los operandos fuesen nmeros naturales. cmp El salto amenor se produce si el registro%eaxes menor o igual Cdigo Comentario $12, %eax jle menor mov $10, %eax
.... jmp final menor: mov $100, %eax ... final: inc %ebx que 12. La condicin del salto es para operandos con signo (nmeros enteros).
La posibilidad de saltar a una posicin de cdigo dependiendo de una condicin est presente en la mayora de lenguajes de programacin de alto nivel. Por ejemplo, en el lenguaje Java, la construccin if () {} else {} se implementa a nivel de ensamblador basado en instruccin de salto condicional. La instruccin de comprobacin TEST es similar a la de comparacin, tambin consta de dos operandos, el segundo de ellos puede ser nicamente de tipo registro o memoria y no se permite que ambos sean de tipo memoria. La diferencia con CMP es que se realiza una conjuncin bit a bit de ambos operandos. El resultado de esta conjuncin tampoco se almacena, pero s modifica los bits de estado OF, CF(ambos se ponen a cero), SF, ZF y PF. La tabla 5.13 muestra posibles secuencias de instrucciones de comprobacin y salto condicional. Tabla 5.13. Secuencias de instrucciones de comprobacin y salto condicional Cdigo Comentario testl $0x0080, contador jz ignora .... ignora: incl %ebx El salto a ignora se produce si el operando de 32 bits almacenado en memoria a partir de la posicin contador tiene su octavo bit igual a cero. Esta instruccin precisa el sufijo de tamao. test 0xFF00FF00, %eax jnz pl .... jmp final pl: mov %eax ... El salto a pl se produce si alguno de los bits en las posiciones 8 a 15 o 24 a 31 del registro %eax es igual a uno. Bibliografa: http://ocw.uc3m.es/ingenieria-telematica/arquitectura- deordenadores/lecturas/html/isa.html#isa:sec:comparetest
2.5 SALTOS El procesador ejecuta una instruccin tras otra de forma secuencial a no ser que dicho flujo de ejecucin se modifique. Las instrucciones de salto sirven para que el procesador, en lugar de ejecutar la siguiente instruccin, pase a ejecutar otra en un lugar que se denomina destino del salto. La instruccin de saltoJMP(del ingls jump) tiene un nico operando que representa el lugar en el que el procesador debe continuar ejecutando. Al llegar a esta instruccin, el procesador no realiza operacin alguna y simplemente pasa a ejecutar la instruccin en el lugar especificado como destino del salto. El nico registro, por tanto, que se modifica es el contador de programa. A la instruccin JMP se le denomina tambin de salto incondicional por contraposicin a las instrucciones de salto en las que el procesador puede saltar o no al destino dependiendo de una condicin. La arquitectura IA-32 dispone de 32 instrucciones de salto condicional. Todas ellas comienzan por la letra J seguida de una abreviatura de la condicin que determina si el salto se lleva a cabo o no. Al ejecutar esta instruccin el procesador consulta esta condicin, si es cierta continua ejecutando la instruccin en la direccin destino del salto. Si la condicin es falsa, la instruccin no tiene efecto alguno sobre el procesador y se ejecuta la siguiente instruccin. Las condiciones en las que se basa la decisin de saltar dependen de los valores de los bits de estado CF, ZF, OF , SF y PF. La tabla 5.10 muestra para cada instruccin los valores de estos bits para los que se salta a la instruccin destino. Tabla 5.10. Instrucciones de salto condicional Instrucci n Condici n Descripcin Instrucci n Condici n Descripcin JA mem JNBE mem CF= 0 yZF= 0 Salto si mayor, salto si no menor o igual (sin signo) JBE mem JNA mem CF= 1 ZF= 1 Salto si menor o igual, salto si no mayor (sin signo) JAE mem JNB mem CF= 0 Salto si mayor o igual, salto si no menor (sin signo) JB mem JNAE mem CF= 1 Salto si menor, salto si no mayor o igual (sin signo) JE mem ZF= 1 Salto si igual, JNE mem ZF= 0 Salto si Instrucci n Condici n Descripcin Instrucci n Condici n Descripcin JZ mem salto si cero. JNZ mem diferente, salto si no cero. JG mem JNLE mem ZF= 0 ySF=OF Salto si mayor, si no menor o igual (con signo) JLE mem JNG mem ZF= 1 SF!=OF Salto si menor o igual, si no mayor (con signo) JGE mem JNL mem SF=OF Salto si mayor o igual, si no menor (con signo) JL mem JNGE mem SF!=OF Salto si menor, si no mayor o igual (con signo) JC mem CF= 1 Salto si acarreo es uno JNC mem CF= 0 Salto si acarreo es cero JCXZ mem %cx= 0 Salto si registro%cxes cero. JECXZ mem %ecx= 0 Salto si registro%ecxes cero. JO mem OF= 1 Salto si el bit de desbordamien to es uno. JNO mem OF= 0 Salto si el bit de desbordamien to es cero. JPO mem JNP mem PF= 0 Salto si paridad impar, si no paridad. JPE mem JP mem PF= 1 Salto si paridad par, si paridad. JS mem SF= 1 Salto si positivo. JNS mem SF= 0 Salto si negativo.
En la tabla se incluyen instrucciones con diferente nombre e idntica condicin. Estos sinnimos son a nivel de lenguaje ensamblador, es decir, las diferentes instrucciones tienen una codificacin idntica y por tanto corresponden con la misma instruccin mquina del procesador. La utilidad de estas instrucciones se debe entender en el contexto del flujo normal de ejecucin de un programa. El resto de instrucciones realizan diferentes operaciones sobre los datos, y a la vez modifican los bits de la palabra de estado. Las instrucciones de salto se utilizan despus de haber modificado estos bits y para poder tener dos posibles caminos de ejecucin. El ejemplo 5.4 muestra una porcin de cdigo ensamblador muestra un posible uso de las instrucciones de salto. Ejemplo 5.4. Uso de saltos condicionales MOV $100, %ecx dest2: DEC %ecx JZ dest1 ADD %ecx, %eax JMP dest2 La instruccin DEC %ecx decrementa el valor del registro %ecx y modifica los bits de la palabra de estado. La instruccin JZ provoca un salto si ZF= 1. Como consecuencia, la instruccin ADD %ecx, %eax se ejecuta un total de 100 veces. Las instrucciones de salto condicional son tiles siempre y cuando los valores de los bits de estado hayan sido previamente producidos por instrucciones anteriores, como por ejemplo, operaciones aritmticas. Pero en algunos casos, la ejecucin de un salto condicional requiere que se realice una operacin aritmtica y no se almacene su resultado, sino simplemente que se realice una comparacin. Por ejemplo, si se necesita saltar slo si un nmero es igual a cero, en lugar de ejecutar una instruccin ADD, SUB, INC o DEC para que se modifique el bit ZF slo se necesita comprobar si tal nmero es cero y modificar los bits de estado. Para este cometido el procesador dispone de las instrucciones de comparacin y comprobacin. Bibliografa: http://ocw.uc3m.es/ingenieria-telematica/arquitectura- deordenadores/lecturas/html/isa.html#isa:sec:comparetest
2.6 CICLOS CONDICIONALES Existen dos tipos de instrucciones de salto: las instrucciones de salto condicional y las de salto incondicional. Las instrucciones de salto condicional, revisan si ha ocurrido alguna situacin para poder transferir el control del programa a otra seccin, por ejemplo:
CMP AX,0 JEotro ::::::::::: ::::::::::: otro : :::::::::: :::::::::: End
En este ejemplo, la instruccin JE (Salta si es igual) revisa si la prueba implcita en la instruccin anterior result positiva, es decir, si la comparacin de AX con 0 fue cierta. En caso de que AX sea igual a 0, JE trans_ere el control del programa a las instrucciones que se encuentran despus de la etiqueta "otro". En caso contrario ejecuta las instrucciones siguientes a JE.
La siguiente es una lista de las instrucciones de salto condicional y su descripcin:
JA o JNBE: Salta si est arriba o salta si no est por debajo o si no es igual (jump if above or jump if not below or equal). El salto se efecta si la bandera de CF=0 o si la bandera ZF=0. JAE o JNB: Salta si est arriba o es igual o salta si no est por debajo (jump if above or equal or jump if not below). El salto se efecta si CF=0. JB o JNAE: Salta si est por debajo o salta si no est por arriba o es igual (jump if below or jump if not above or equal). El salto se efecta si CF=1. JBE o JNA: Salta si est por debajo o es igual o salta si no est por arriba (jump if below or equal or jump if not above). El salto se efecta si CF=1 o ZF=1. JE o JZ: Salta si es igual o salta si es cero (jump if equal or jump if zero).El salto se efecta si ZF=1. JNE o JNZ: Salta si no es igual o salta si no es cero (jump if not equal or jump if not zero). El salto se efecta si ZF=0. JG o JNLE: Salta si es mayor o salta si no es menor o igual (jump if greater or jump if not less or equal). El salto se efecta si ZF=0 u OF=SF. JGE o JNL: Salta si es mayor o igual o salta si no es menor (jump if greater or equal or jump if not less). El salto se efecta si SF=OF.
2.7 INCREMENTO Y DECREMENTO Las instrucciones INC y DEC permiten incrementar los contenidos de los registros. Ejemplos: INC AX ;AX=AX+1 INC VAR1 ;VAR1=VAR1+1 DEC AX ;AX=AX-1 DEC VAR1 ;VAR1=VAR1-1 y de las variables almacenadas en memoria. Bibliografa: www.scribd.com/doc/132044216/Unidad-2 2.9 INSTRUCCIONES ARITMTICAS Las operaciones en aritmtica binaria a entera permiten a la CPU realizar clculos con nmeros enteros positivos y negativos con una representacin en complemento a 2. NEG operando: cambia el signo del operando. Equivaldra al NOT del nmero y le sumara 1. ADD destino, fuente: destino = destino + fuente. ADC destino, fuente: destino = destino + fuente + carry (acarreo). SUB destino, fuente: destino = destino - fuente. SBB destino, fuente: destino = destino - (fuente + acarreo). MUL operando: multiplica sin considerar el signo. Multiplica el acumulador {AL} o {AX} por el operando fuente. Si el operando fuente es de tipo byte, el resultado se almacena en AX y si es de tipo palabra el resultado se almacena en AX la parte inferior y en DX la palabra superior. Si tipo fuente = byte: AX = AL * fuente (multiplicacin sin signo) Si tipo fuente = palabra: DX, AX = AX * fuente (multiplicacin sin signo) Si mitad superior (CF: acarreo) del resultado = 0 En CC CF = 1 IMUL operando: multiplica considerando el signo. DIV operando: divide sin considerar el signo, un nmero contenido en el acumulador entre el operando fuente. El cociente se almacena en el acumulador. El resto se almacena en la extensin del acumulador. Si la extensin de AX ser DX (que ocurrir cuando sea de tipo palabra), la operacin y la extensin de AL ser AH.
IDIV operando: igual que el DIV pero considerando el signo. CBW: pasa de byte a palabra el contenido del acumulador. CWD: pasa de palabra a doble palabra el contenido del acumulador. INC destino: incrementa el destino. DEC destino: decrementa el destino. Bibliografa: http://www.uhu.es/tomas.mateo/ac2/manual%20ensamblador%20UHU.pdf
2.10 MANIPULACIN DE LA PILA Todo programa escrito en el lenguaje ensamblador del 8086 requiere de una pila. La pila se emplea para almacenar temporalmente direcciones y datos. En los programas hechos para el microprocesador 8086, una pila es un arreglo de palabras. El tamao de la pila lo establece el programador mediante la directiva stack en el cdigo de inicio de un programa. Tal como se estudi en el tema 3, la directiva stack cuya sintaxis es: stack tamPila Crea una pila para el programa de tamao tampila. El cargador del programa inicializa en forma automtica el registro de segmento de pila SS a la direccin del segmento en que se cre la pila y el registro apuntador de pila SP al valor de tamPila. La figura 6.1 muestra el estado inicial de la pila de un programa al ser cargado a memoria para su ejecucin (la pila se encuentra vaca).
Note que el registro apuntador de pila SP apunta a la palabra que est pasando el final de la pila. La pila difiere de los otros segmentos en la manera en que almacena los datos: empieza en la localidad ms alta (la que tiene la direccin dada por SS:tamPila-2) y almacena los datos hacia las localidades ms bajas de la pila (hacia SS:0000).
Instrucciones para el manejo de la pila
El ensamblador del 8086 posee un conjunto de instrucciones especiales para insertar y extraer datos en la pila:
push fuente
Transfiere el valor dado por fuente a la pila del programa. Sintaxis:
push regW|memW
Donde regW puede ser cualquiera de los registros de propsito general o de segmento.
La instruccin push transfiere una palabra a la pila del programa. La instruccin push primero decrementa el valor del registro apuntador de pila SP en dos. A continuacin copia el valor especificado por su operando a la localidad cuya direccin est dada por SS:SP. Note que esto hace que la pila crezca hacia las direcciones ms pequeas de memoria.
La instruccin push no afecta a las banderas.
pop destino
Extrae un valor del tope de la pila del programa y lo almacena en destino.
Sintaxis:
pop regW|memW
Donde regW puede ser cualquiera de los registros de propsito general o de segmento excepto el registro de segmento de cdigo CS, que no est permitido. La instruccin pop extrae una palabra de la localidad cuya direccin est dada por SS:SP (el tope de la pila del programa) y lo almacena en la localidad especificada por el operando. A continuacin incrementa el valor del registro apuntador de pila SP en dos.
La instruccin pop no afecta a las banderas.
En la figura 6.2 se muestran los estados de la pila despus de insertar los valores de los registros AX y BX mediante la instruccin push y en la figura 6.3 se muestran los estados de la pila despus de extraer esos valores de la pila mediante la instruccin pop al ejecutar el siguiente fragmento de cdigo:
mov ax, 0123h mov bx, 4567h push ax push bx pop bx pop ax
Note en la figura 6.3a que al extraer el valor 4567h de la pila, ste no se elimina fsicamente de la pila. Sin embargo no hay una garanta de que ese valor permanezca en la pila. Si en ese momento insertamos un nuevo valor en la pila, ste se escribir en la localidad SS:tamPila-4 sobrescribiendo el valor de 4567h.
pushf
Transfiere el registro de banderas a la pila del programa.
Sintaxis:
pushf
La instruccin pushf transfiere el contenido del registro de banderas a la pila del programa de la misma manera en la que opera la instruccin push.
La instruccin pushf no afecta a las banderas.
popf
Extrae un valor del tope de la pila del programa y lo almacena en registro de banderas.
Sintaxis:
popf
La instruccin popf extrae una palabra del tope de la pila y la inserta en el registro de banderas de la misma manera en que trabaja la instruccin pop. Normalmente se hace esto para extraer el estado de las banderas almacenado previamente por una instruccin pushf, o para fijar las banderas a nuevos valores.
La instruccin popf afecta todas las banderas Bibliografa: http://www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r90594.PDF
2.11 OBTENCIN DE CADENA CON REPRESENTACIN DECIMAL En las computadoras el formato natural para la aritmtica es el binario. La representacin del nmero decimal 1; 527 en los tres formatos decimales: . ASCII 31 35 32 37 (cuatro bytes) . BCD desempaquetado 01 05 02 07 (cuatro bytes) . BCD empaquetado 15 27 (dos bytes) El procesador realiza aritmtica en valores ASCII y BCD un dgito a la vez. Ya que los datos son ingresados desde un teclado signi_can que estn en formato ASCII, la representacin en memoria de un nmero decimal ingresado tal como 1234 es 31323334H. Pero realizar aritmtica sobre tal nmero implica un tratamiento especial. Las instrucciones AAA y AAS realizan aritmtica de manera directa sobre nmeros ASCCI.
2.12 INSTRUCCIONES LGICAS Se usan para realizar operaciones a nivel de bits. NOT operando: cambia los bits 1 por 0 y viceversa y devuelve el resultado en el mismo operando. AL = F2h AL 1111 0010 NOT AL; NOT AL 0000 1101 = Odh
OR destino, fuente: operacin o lgico inclusivo. El resultado se almacena en destino. AX = FEDCh= 1111 1110 1101 1100 BX = 1234 h = 0001 0010 0011 0100 OR AX, BX 1111 1110 1111 1100 = FEFC h
AND destino, fuente: la operacin Y lgica entre 2 operandos, el resultado se deja en destino. AX = FEDC h 1111 1110 1101 1100 BX = 1234 h 0001 0010 0011 0100 ADD AX, BX 0001 0010 0001 0100 = 1214 h
XOR destino, fuente: la operacin o lgico exclusiva; el resultado se deja en destino. AX = FEDC h 1111 1110 1101 1100 BX = 1234 h 0001 0010 0011 0100 XOR AX, BX 1110 1100 1110 1000 = ECE8 h
2.13 DESPLAZAMIENTO Y ROTACIN INSTRUCCIONES DE DESPLAZAMIENTO O CORRIMIENTO DE BITS. Las instrucciones de corrimiento, que son parte de la capacidad lgica de la computadora, pueden realizar las siguientes acciones: 1. Hacer referencia a un registro o direccin de memoria. 2. Recorre bits a la izquierda o a la derecha. 3. Recorre hasta 8 bits en un byte, 16 bits en una palabra y 32 bits en una palabra doble. 4. Corrimiento lgico (sin signo) o aritmtico (con signo).
El segundo operando contiene el valor del corrimiento, que es una constante (un valor inmediato) o una referencia al registro CL. Para los procesadores 8088/8086, la constante inmediata solo puede ser 1; un valor de corrimiento mayor que 1 debe estar contenido en el registro CL. Procesadores posteriores permiten constantes de corrimiento inmediato hasta 31. El formato general para el corrimiento es | [etiqueta:] | Corrim. | {registro/memoria}, {CL/inmediato} |
DESPLAZAMIENTO O CORRIMIENTO DE BITS HACIA LA DERECHA. Los corrimientos hacia la derecha (SHR y SAR) mueven los bits hacia la derecha en el registro designado. El bit recorrido fuera del registro mete la bandera de acarreo. Las instrucciones de corrimiento a la derecha estipulan datos lgicos (sin signo) o aritmticos (con signo):
Las siguientes instrucciones relacionadas ilustran SHR y datos con signo:
INSTRUCCION COMENTARIO MOV CL, 03 MOV AL, 10110111B ; AL = 10110111 SHR AL, 01 ; AL = 01011011 Un corrimiento a la derecha SHR AL, CL ; AL = 00001011 Tres corrimientos adicionales a la derecha
El primer SHR desplaza el contenido de AL un bit hacia la derecha. El bit de mas a la derecha es enviado a la bandera de acarreo, y el bit de mas a la izquierda se llena con un cero. El segundo SHR desplaza tres bits ms a AL. La bandera de acarreo contiene de manera sucesiva 1, 1 y 0; adems, tres bits 0 son colocados a la izquierda del AL. SAR se difiere de SHR en un punto importante: SAR utiliza el bit de signo para llenar el bit vacante de ms a la izquierda. De esta manera, los valores positivos y negativos retienen sus signos. Las siguientes instrucciones relacionadas ilustran SAR y datos con signo en los que el signo es un bit 1: En especial, los corrimientos a la derecha son tiles para (dividir entre 2) obtener mitades de valores y son mucho ms rpidas que utilizar una operacin de divisin. Al terminar una operacin de corrimiento, puede utilizar la instruccin JC (Salta si hay acarreo) para examinar el bit desplazado a la bandera de acarreo. DESPLAZAMIENTO O CORRIMIENTO DE BITS A LA IZQUIERDA. Los corrimientos hacia la izquierda (SHL y SAL) mueven los bits a la izquierda, en el registro designado. SHL y SAL son idnticos en su operacin. El bit desplazado fuera del registro ingresa a la bandera de acarreo. Las instrucciones de corrimiento hacia la izquierda estipulan datos lgicos (sin signo) y aritmticos (con signo): SHL: Desplazamiento lgico a la izquierda SAL: Desplazamiento aritmtico a la izquierda
Las siguientes instrucciones relacionadas ilustran SHL para datos sin signo: INSTRUCCION COMENTARIO MOV CL, 03 MOV AL, 10110111B ; AL = 10110111 SHL AL, 01 ; AL = 01101110 Un corrimiento a la izquierda SHL AL, CL ; AL = 01110000 Tres corrimientos mas
El primer SHL desplaza el contenido de AL un bit hacia la izquierda. El bit de ms a la izquierda ahora se encuentra en la bandera de acarreo, y el ltimo bit de la derecha del AL se llena con cero. El segundo SHL desplaza tres bits ms a AL. La bandera de acarreo contiene en forma sucesiva 0, 1 y 1, y se llena con tres ceros a la derecha del AL. Los corrimientos a la izquierda llenan con cero el bit de mas a la derecha. Como resultado de esto, SHL y SAL don idnticos. Los corrimientos a la izquierda en especial son tiles para duplicar valores y son mucho ms rpidos que usar una operacin de multiplicacin. Al terminar una operacin de corrimiento, puede utilizar la instruccin JC (Salta si hay acarreo) para examinar el bit que ingreso a la bandera de acarreo. ROTACION DE BITS (DESPLAZAMIENTO CIRCULAR) Las instrucciones de rotacin, que son parte de la capacidad lgica de la computadora, pueden realizar las siguientes acciones: 1. Hacer referencia a un byte o a una palabra. 2. Hacer referencia a un registro o a memoria. 3. Realizar rotacin a la derecha o a la izquierda. El bit que es desplazado fuera llena el espacio vacante en la memoria o registro y tambin se copia en la bandera de acarreo. 4. Realizar rotacin hasta 8 bits en un byte, 16 bits en una palabra y 32 bits en una palabra doble. 5. Realizar rotacin lgica (sin signo) o aritmtica (con signo).
El segundo operando contiene un valor de rotacin, el cual es una constante (un valor inmediato) o una referencia al registro CL. Para los procesadores 8088/8086, la constante inmediata solo puede ser 1; un valor de rotacin mayor que 1 debe estar contenido en el registro CL. Procesadores posteriores permiten constantes inmediatas hasta el 31. El formato general para la rotacin es: | [etiqueta:] | Rotacin | {registro/memoria}, {CL/inmediato} |
ROTACIN A LA DERECHA DE BITS Las rotaciones a la derecha (ROR y RCR) desplazan a la derecha los bits en el registro designado. Las instrucciones de rotacin a la derecha estipulan datos lgicos (sin signo) o aritmticos (con signo):
Las siguientes instrucciones relacionadas ilustran ROR: INSTRUCCION COMENTARIO MOV CL, 03 MOV BH, 10110111B ; BH = 10110111 ROR BH, 01 ; BH = 11011011 Una rotacin a la derecha ROR BH, CL ; BH = 00001011 Tres rotaciones a la derecha
El primer ROR desplaza el bit de ms a la derecha del BH a la posicin vacante de ms a la izquierda. La segunda y tercera operaciones ROR realizan la rotacin de los tres bits de mas a la derecha. RCR provoca que la bandera de acarreo participe en la rotacin. Cada bit que se desplaza fuera de la derecha se mueve al CF y el bit del CF se mueve a la posicin vacante de la izquierda. ROTACIN A LA IZQUIERDA DE BITS Las rotaciones a la izquierda (ROL y RCL) desplazan a la izquierda los bits del registro designado. Las instrucciones de rotacin a la izquierda estipulan datos lgicos (sin signo) y aritmticos (con signo):
Las siguientes instrucciones relacionadas ilustran ROL: INSTRUCCION COMENTARIO MOV CL, 03 MOV BL, 10110111B ; BL = 10110111 SHR BL, 01 ; BL = 11011011 Una rotacin a la izquierda SHR BL, CL ; BL = 00001011 Tres rotaciones a la izquierda El primer ROL desplaza el bit de ms a la izquierda del BL a la posicin vacante de ms a la derecha. La segunda y tercera operaciones ROL realizan la rotacin de los tres bits de ms a la izquierda. De manera similar a RCR, RCL tambin provoca que la bandera de acarreo participe en la rotacin. Cada bit que se desplaza fuera por la izquierda se mueve al CF, y el bit del CF se mueve a la posicin vacante de la derecha. Puede usar la instruccin JC (salta si hay acarreo) para comprobar el bit rotado hacia la CF en el extremo de una operacin de rotacin. Bibliografa: http://www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r90594.PDF
2.14 OBTENCIN DE UNA CADENA CON LA REPRESENTACIN HEXADECIMAL Procedimiento para leer cadenas. PUBLIC LeeCadena PROC LeeCadena and cl,cl ;Es CL = 0 ? jz @@99 ;si, sale push ax ;Salva registros usados. push bx push dx push si mov [Buffer.maxlon],cl ;Pone byte de largo mximo mov ah,0ah ;Entrada de cadenas con DOS mov dx,offset Buffer.maxlon ;DS:DX apunta a la estructura int 21h ;DOS captura la cadena xor bh,bh ;Parte alta de BX a cero mov bl,[Buffer.cadlon] ;BX = nmero de caracteres en el Buffer mov [bx + Buffer.carac],ASCnulo ;Cambia RC a ASCII nulo (0) mov si,offset Buffer.carac ;Apunta al buffer con SI call CopiaCad ;Copia cadena al buffer del ;usuario pop si ;Repone registros pop dx bx ax
@@99:
ret ;Regresa a programa fuente
ENDP LeeCadena
Mediante este procedimiento se introducir el nmero a convertir.
Utilizaremos la interrupcin 21H, servicio 0AH para introducir caracteres por el teclado y para capturar la cadena oprimimos RETURN.
Bibliografa: http://www.itescam.edu.mx 2.15 CAPTURA Y ALMACENAMIENTO DE DATOS NUMRICOS Un procesador (llamados indistintamente as, "microprocesadores" o incluso simplemente "micros") contiene en su interior pequeos dispositivos que pueden almacenar nmeros de cierta cantidad de bits, denominados registros. Ah guardar la informacin que vaya a manejar temporalmente, para luego, si procede, guardarla en memoria, en el disco duro, o donde sea. En el caso de los 80x86 los registros bsicos son de 16 bits, por lo que en uno de estos registros podemos escribir cualquier nmero desde el 0 hasta el 2^N - 1, es decir, desde 0000000000000000b hasta 1111111111111111b. Sin embargo, siguiendo este razonamiento, slo hemos determinado cmo representar nmeros enteros positivos. Qu pasa con nmeros como -184 o incluso 3.141592? -Aritmtica de enteros Vamos a ver cmo operar con nmeros en binario para entender la importancia del sistema de representacin que se emplee. La suma/resta de enteros positivos en binario es idntica a cuando empleamos representacin decimal, pero con unas regla mucho ms sencillas: 0+0=0 0+1=1 1+0=1 1+1=0 y me llevo 1
0-0=0 0-1=1 y me llevo 1 1-0=1 1-1=0 Por ejemplo, sumando/restando 10101 + 110: llevadas:
1
1 1 1
1 0 1 0 1
1 0 1 0 1 SUMA +
1 1 0 RESTA -
1 1 0
- - - - -
- - - - -
1 1 0 1 1
0 1 1 1 1 Las "llevadas" se conocen como bits de acarreo o, en ingls, de carry. Si representamos nmeros con un mximo nmero de bits, puede darse el caso de que al sumarlos, el resultado no quepa. Con cuatro bits 1111+1=10000, dando un resultado de 5 bits. Como slo nos podemos quedar con los cuatro ltimos, el carry se pierde. En un ordenador el carry se almacena en un sitio aparte para indicar que nos llevbamos una pero no hubo dnde meterla, y el resultado que se almacena es, en este caso, 0000. Salvo que se diga lo contrario, si el resultado de una operacin no cabe en el registro que lo contiene, se trunca al nmero de bits que toque. Un modo de representar tanto nmeros negativos como positivos, sera reservar un bit (el de mayor peso, por ejemplo) para indicar positivo o negativo. Una posible representacin de +13 y -13 con registros de ocho bits: 00001101 +13 10001101 -13 Para sumar dos nmeros miraramos los bits de signo; si son los dos negativos o positivos los sumamos y dejamos el bit de signo como est, y si hay uno negativo y otro positivo, los restamos, dejando el bit de signo del mayor. Si quisiramos restarlos haramos algo parecido, pero considerando de manera distinta los signos. Cmo primer mtodo no est mal, pero es mejorable. Saber si un nmero es negativo o positivo es tan sencillo como mirar el primer bit, pero hay que tener en cuenta que esas comparaciones y operaciones las tiene que hacer un sistema electrnico, por lo que cuanto ms directo sea todo mejor. Adems, tenemos dos posibles representaciones para el cero, +0 y -0, lo cual desperdicia una combinacin de bits y, lo que es peor, obliga a mirar dos veces antes de saber si el resultado es 0. Una manera muy usada de comprobar si un nmero es igual a otro es restarlos; si la resta da cero, es que eran iguales. Si hemos programado un poco por ah sabremos que una comparacin de este tipo es terriblemente frecuente, as que el mtodo no es del todo convincente en este aspecto. La representacin en complemento a dos cambia el signo a un nmero de la siguiente manera: invierte todos los bits, y suma uno. Con nuestro querido +13 como 00001101b, hacemos lo siguiente: al invertir los bits tenemos 11110010b, y si sumamos 1, 11110011b. Ya est, -13 en complemento a dos es 11110011. Molaba ms cambiar el signo modificando un bit, es cierto, pero veamos la ventaja. Qu pasa cuando sumamos +13 y -13, sin tener en cuenta signos ni ms milongas? 00001101 11110011 -------- 00000000 Efectivamente, cero. Para sumar nmeros en complemento a dos no hace falta comprobar el signo. Y si uno quiere restar, no tiene ms que cambiar el signo del nmero que va restando (inviertiendo los bits y sumando uno), y sumarlos. Fcil, no? Lo bueno es que con este mtodo podemos hacer que el primer bit siga significando el signo, por lo que no hace falta mayores comprobaciones para saber si un nmero es positivo o negativo. Si seguimos con ocho bits tenemos que los nmeros ms altos/bajos que se pueden representar son 0111111b (127) y 10000000 (-128) En general, para N bits, podremos almacenar cualquier nmero entre 2^(N-1) - 1 y -2^(N-1). Es un buen momento para introducir el concepto de overflow (desbordamiento, aunque no tan comn en espaol) Cuando al operar con dos nmeros el resultado excede el rango de representacin, se dice que ha habido overflow. Esto es sutilmente diferente a lo que suceda con el carry. No es que "nos llevemos una", es que el resultado ha producido un cambio de signo. Por ejemplo, la suma de 10010010 + 10010010, si consideramos ambos nmeros con su signo (- 110d + -110d), nos da como resultado 00100100, 36d. Ahora el resultado ya no es negativo, porque hemos "dado la vuelta al contador", al exceder - 128 en la operacin. Los procesadores tambin incluyen un indicador que se activa con estas situaciones, pero es tarea del programador comprobar los indicadores, y saber en todo momento si trabajamos dentro del rango correcto. Una ventaja adicional del complemento a dos es que operamos indistintamente con nmeros con signo o sin l, es decir, si queremos podemos utilizar todos los bits para representar nmeros positivos exclusivamente (de 0 a 2^N - 1), haciendo exactamente las mismas operaciones. El que un nmero sea entero positivo o entero con signo depende nicamente de la interpretacin que haga el programador del registro; tendr que comprobar, si fuera necesario, los bits de overflow y carry para operar correctamente segn sus intereses. Las multiplicaciones/divisiones se pueden descomponer en una retahla de sumas y restas, por lo que no merece la pena ahondar demasiado; responden a consideraciones similares, salvo que el producto de N bits por N bits da, en general, 2N bits, y que ahora s que habr que especificar si la operacin va a ser entre nmeros con o sin signo. -Nmeros reales La forma ms simple de representacin de nmeros reales es sin duda la de punto fijo (o coma fija, segn digas usar una cosa u otra para separar las cifras). La idea consiste en plantar un punto entre los bits, y ya est. Ejemplo: 1110.0111b El peso de las cifras a la izquierda del punto son las mismas que para enteros, mientras que a la derecha el peso sigue disminuyendo en potencias de dos.. pero negativas. 1110.0111b = 1*2^3 + 1*2^2 + 1*2^1 + 0*2^0 + 0*2^(-1) + 1*2^(-2) + 1*^2(-3) +1*2^(-4) Como 2^(-N) = 1/(2^N) tenemos que los pesos son 0.5, 0.25, 0.125 etc 1110.0111b = 8 + 4 + 2 + 0 + 0 + 0.25 + 0.125 + 0.0625 = 14.4375 que no es ms que coger el nmero 11100111b, pasarlo a decimal, y dividirlo entre 2^P, siendo P el nmero de cifras a la derecha del punto. Se opera exactamente igual que con enteros (podemos dejar un bit de signo si nos apetece, haciendo complemento a dos), siempre que los dos operandos tengan no slo el mismo nmero de bits, sino el punto en el mismo sitio. Podemos seguir usando nuestra calculadora de enteros para manejar reales si decidimos usar este mtodo. Algunos dispositivos de clculo, especialmente de procesado de seal, usan este sistema por su sencillez y velocidad. La "pega" es la precisin. Ahora no slo tenemos que intentar "no pasarnos" del nmero de bits por exceso, sino que las potencias negativas limitan nuestra precisin "por abajo". Un nmero como 1/3 (0.3333 etc) podemos intentar expresarlo en los 8 bits de arriba, pero nos encontraremos con que el nmero de potencias dos negativas necesarias para hacerlo nos sobrepasan ampliamente (infinitas). 0000.0101 es lo mejor que podemos aproximar, y sin embargo tenemos un nmero tan feo como 0.3125 El problema no es tanto el error como el error relativo. Cometer un error de aproximadamente 0.02 puede no ser grave si el nmero es 14 (0.02 arriba o abajo no se nota tanto), pero si se trata de 0.3333.., s. Los nmeros en punto flotante (o coma flotante) amortiguan este problema complicando un poco (un mucho) las operaciones. Parecer muy muy engorroso, pero es lo que se usa mayormente en ordenadores, as que algo bueno tendr. Vamos con un primer intento con anestesia, para no marear demasiado. Digamos que de los 8 bits de antes (que, de todos modos, son muy poquitos; lo normal en nmeros reales es 32,64,80..) dedicamos 2 a decir cunto se desplaza el punto, y los 6 restantes a almacenar el nmero propiamente. Un nmero tal que 11011110 que representase a un nmero real estara en realidad compuesto por 1.10111 y 10, o sea, 3.4375 y 2; el dos indica posiciones desplazadas (potencias de 2), as que el nmero en cuestin sera 3.4375 * 2^2 = 13.75 Podramos an as representar un nmero tan pequeo como 0.03125, 0.03125*2^0, con "0.00001 00", o sea, 00000100 Hemos ampliado el margen de representacin por arriba y por abajo, a costa de perder precisin relativa, es cierto, pero hacindola ms o menos constante en todo el rango, porque cada nmero se puede escribir con 6 cifras binarias ya est el punto un poco ms a la izquierda o a la derecha. La parte que representa las cifras propiamente se denomina mantisa, y en este caso los dos bits separados forman el exponente. El estndar IEEE 754 describe cmo almacenar nmeros en punto flotante de manera un poco ms profesional que todo esto. Para 32 bits se dedican 8 para el exponente, 23 para la mantisa y 1 para el signo. Se trabaja slo con nmeros positivos y bit de signo aparte porque dada la complejidad de las operaciones con nmeros reales, no hay ninguna ventaja importante en usar cualquier otra cosa. En este formato el exponente se calcula de modo que la mantisa quede alineada con un uno a la izquierda de todo, y este primer uno no se almacena. El exponente adems se guarda en "exceso 127", que consiste en restarle 127 al nmero almacenado: si la parte del exponente fuese 11011111b = 223d, al restarle 127 tendramos el exponente que representa, 96. Vamos con un ejemplo: signo exponente mantisa 1 0111 0101 101 0101 0110 1110 1110 0011 El bit de signo es 1, as que tenemos un nmero negativo. La mantisa es 1.10101010110111011100011, porque el primer '1' se sobreentiende siempre, ya que al almacenar el nmero se alter el exponente para alinearlo as; el valor decimal de este nmero es "1.66744649410248". El exponente es 01110101b = 117d, es decir, -10 porque en exceso 127 se le resta esta cantidad. El nmero representado es -1.66744649410248*2^-10 = - 0.0016283657169 ms o menos (suponiendo que no me haya confundido). Las operaciones con nmeros en punto flotante son mucho ms complejas. Exigen comprobar signos, exponentes, alinear las mantisas, operar, normalizar (esto es, desplazar la mantisa / modificar el exponente para que quede alineada con ese primer "1" asomando).. Sin embargo existen circuitos especficos dentro de los procesadores para realizar estos tejemanejes, e incluso para calcular races cuadradas, funciones trigonomtricas... Lo que sucede es que son bastante ms lentos, como era de esperar, que los clculos con enteros, por lo que se separan unas y otras operaciones segn el tipo de datos que vayamos a manejar. El estndar mencionado admite nmeros especiales como +infinito, -infinito y NaN (Not a Number), con los que es posible operar. Por ejemplo, infinito+infinito=infinito, mientras que infinito-infinito es una indeterminacin, y por tanto, NaN. -Codificacin BCD BCD viene de Binary Code Digit, o dgito en cdigo binario, y es una manera alternativa de codificar nmeros. Consiste en algo tan simple como dividir el nmero en sus dgitos decimales, y guardar cada uno en 4 bits. Por ejemplo, el nmero 1492 se almacenara en como mnimo 16 bits, resultando el nmero 1492h, o 0001 0100 1001 0010b (separo las cifras binarias de 4 en 4 para que se vea mejor). As, sin ms, se desperdicia un poco de espacio ya que no tienen cabida los seis nibbles 1010, 1011, 1100, 1101, 1110, y 1111 (el nmero ms grande representable as en 16 bits es 9999), por lo que a veces se emplean estas combinaciones extra para el signo, un punto, una coma, etc. La ventaja de este modo de almacenar nmeros es que la conversin a decimal es inmediata (cada grupo de 4 bits tiene una correspondencia), mientras que si nos limitsemos a guardar el nmero que representa almacenado en binario el procedimiento sera ms costoso. Con la potencia de cmputo de que se dispone ahora, y dado que las conversiones slo son necesarias para representar la informacin final para que la lea un humano, puede parecer de escasa utilidad, pero en dispositivos en los que estas operaciones son tan frecuentes como cualquier otra, compensa especializar determinados circuitos a su manipulacin. Algunas posibles aplicaciones podran ser terminales "tontos" de banca, o calculadoras. Un caso claro de esta ltima podran ser algunas calculadoras HP basadas en el microprocesador Saturn que tiene un modo de funcionamiento completamente en BCD. De hecho los nmeros reales los almacena en BCD en 64 bits, formando 16 dgitos: uno para el signo, 12 para la mantisa, y 3 para el exponente. El BCD no ser, sin embargo, la representacin ms habitual. Existen dos tipos de formatos BCD: el conocido como empaquetado, con 2 dgitos en cada byte (que, recordemos, es con frecuencia la mnima unidad "prctica" en un procesador), y desempaquetado, con un dgito por byte (dejando siempre los 4 bits superiores a cero). -Texto, sonido, imgenes Queda ver cmo se manejan en un sistema digital otros datos de uso frecuente. Generalmente la unidad mnima de almacenamiento es el byte, y por ello la codificacin ms habitual para texto asigna un byte a cada carcter considerado til, hasta formar una tabla de 256 correspondencias byte-carcter. Los que determinaron semejante lista de utilidad fueron, como casi siempre, americanos, en lo que se conocen como cdigos ASCII. Como dejaron fuera del tintero algunos caracteres extranjeros, ees, tildes variopintas, etc, surgieron numerosas variantes. Realmente los primeros 128 caracteres (los formados con los siete bits menos significativos, y el octavo bit a cero) son comunes a todas ellas, mientras que los 128 siguientes forman los caracteres ASCII extendidos, que son los que incluyen las peculiaridades. Si alguien tiene una ligera nocin de lo que hacen los chinos, rabes o japoneses, se dar cuenta de que con 256 caracteres no hacen nada ni por el forro. A fin de hacer un nico cdigo universal surgi el UNICODE, que es con el que deberan almacenarse todos los textos, aunque por desgracia no sea as. Sin embargo tiene una implantacin cada vez mayor, aunque a un paso un poco lento. Si bien tiene unas pequeas reglas que no hacen la correspondencia directa cdigo -> carcter, se podra decir grosso modo que cada carcter se representa con 2 bytes, y no uno, dando lugar a, en principio, 65536 caracteres distintos, dentro de los cuales, por supuesto, se incluye la tablita ASCII. El sonido se produce cuando una tensin variable con el tiempo llega a un altavoz, convirtiendo esas variaciones de tensin en variaciones de presin en el aire que rodea a la membrana. Para almacenar audio se toman muestras peridicas del valor de dicha tensin (cuando se graba sucede al revs; son las variaciones de presin sobre el micrfono las que producen el voltaje mencionado), guardando ese valor. La precisin con que se grabe el sonido depende del nmero de muestras que se tomen por segundo (tpicamente 8000, 22050 44100) y de los bits que se empleen para cada muestra (con frecuencia 8 16). De este modo, para grabar 1 minuto de audio a 44100 muestras por segundo, en estreo (dos canales), y 16 bits, necesitaremos 60*44100*2*16 bits, es decir, 10 megabytes aproximadamente. Existen formatos de audio que toman esas muestras y las comprimen aplicando un determinado algoritmo que, a costa de perjudicar ms o menos la calidad, reducen el espacio ocupado. Un archivo ".wav" corresponde, generalmente, a un simple muestreo del audio, mientras que uno ".mp3" es un formato comprimido. Para las imgenes lo que hacen es muestrear en una cuadrcula (cada cuadrado, un pxel) las componentes de rojo, verde y azul del color, y asignarles un valor. Un archivo ".bmp" por ejemplo puede asignar 3 bytes a cada pxel, 256 niveles para cada color. Se dice entonces que la calidad de la imagen es de 24 bits. Una imagen de 800 pxels de ancho por 600 de alto ocupara 800*600*24 bits, casi 1.4 megas. De nuevo surgen los formatos comprimidos como ".gif",".png",".jpg".. que hace que las imgenes ocupen mucho menos espacio. Bibliografa: http://www.rinconsolidario.org/eps/asm8086/CAP0.html#SISNUM 2.16 OPERACIONES BSICAS SOBRE ARCHIVOS DE DISCO Existen dos formas de trabajar con archivos, la primera es por medio de bloques de control de archivos o "FCB" y la segunda es por medio de canales de comunicacin, tambien conocidos como "handles". La primera forma de manejo de archivos se viene utilizando desde el sistema operativo CPM, antecesor del DOS, por lo mismo asegura cierta compatibilidad con archivos muy antiguos tanto del CMP como de la versin 1.0 del DOS, adems este mtodo nos permite tener un nmero ilimitado de archivos abiertos al mismo tiempo. Si se quiere crear un volumen para el disco la nica forma de lograrlo es utilizando este mtodo. An considerando las ventajas del FCB el uso de los canales de comunicacin es mucho ms sencillo y nos permite un mejor manejo de errores, adems, por ser ms novedoso es muy probable que los archivos as creados se mantengan compatibles a travs de versiones posteriores del sistema operativo. Para una mayor facilidad en las explicaciones posteriores me referir a el mtodo de bloques de control de archivos como FCBs y al mtodo de canales de comunicacin como handles. Introduccin Existen dos tipos de FCB, el normal, cuya longitud es de 37 bytes y el extendido de 44 bytes. En este tutorial unicamente se tratar el primer tipo, as que de ahora en adelante cuando me refiera a un FCB realmente estoy hablando de un FCB de 37 bytes. El FCB se compone de informacin dada por el programador y por informacin que toma directamente del sistema operativo. Cuando se utilizan este tipo de archivos unicamente es posible trabajar en el directorio actual ya que los FCB no proveen apoyo para el uso de la organizacin por directorios del DOS. El FCB est formado por los siguientes campos:
POSICION LONGITUD SIGNIFICADO 00H 1 Byte Drive 01H 8 Bytes Nombre del archivo 09H 3 Bytes Extensin 0CH 2 Bytes Nmero de bloque 0EH 2 Bytes Tamao del registro 10H 4 Bytes Tamao del archivo 14H 2 Bytes Fecha de creacin 16H 2 Bytes Hora de creacin 18H 8 Bytes Reservados 20H 1 Byte Registro actual 21H 4 Bytes Regsitro aleatorio Para seleccionar el drive de trabajo se sigue el siguiente formato: drive A = 1; drive B = 2; etc. Si se utiliza 0 se tomar como opcin el drive que se est utilizando en ese momento. El nombre del archivo debe estar justificado a la izquierda y en caso de ser necesario se debern rellenar los bytes sobrantes con espacios, la extensin del archivo se coloca de la misma forma. El bloque actual y el registro actual le dicen a la computadora que registro ser accesado en operaciones de lectura o escritura. Un bloque es un grupo de 128 registros. El primer bloque del archivo es el bloque 0. El primer registro es el registro 0, por lo tanto el ltimo registro del primer bloque sera 127, ya que la numeracin inici con 0 y el bloque puede contener 128 registros en total. Abrir archivos Para abrir un archivo FCB se utiliza la interrupcin 21H, funcin 0FH. La unidad, el nombre y extensin del archivo deben ser inicializados antes de abrirlo. El registro DX debe apuntar al bloque. Si al llamar a la interrupcin sta regresa valor de FFH en el registro AH es que el archivo no se encontr, si todo sali bien se devolvera un valor de 0. Si se abre el archivo DOS inicializa el bloque actual a 0, el tamao del registro a 128 bytes y el tamao del mismo y su fecha se llenan con los datos encontrados en el directorio. Crear un archivo nuevo Para la creacin de archivos se utiliza la interrupcin 21H funcin 16H . DX debe apuntar a una estructura de control cuyos requisitos son que al menos se encuentre definida la unidad lgica, el nombre y la extensin del archivo. En caso de existir algun problema se devolver el valor FFH en AL, de lo contrario este registro contendr el valor de 0. Escritura secuencial Antes de que podamos realizar escrituras al disco es necesario definir el rea de transferencia de datos utilizando para tal fin la funcin 1AH de la interrupcin 21H. La funcin 1AH no regresa ningn estado del disco ni de la operacin, pero la funcin 15H, que es la que usaremos para escribir al disco, si lo hace en el registro AL, si ste es igual a cero no hubo error y se actualizan los campos del registro actual y bloque. Lectura secuencial Antes que nada debemos definir el rea de transferencia de archivos o DTA. Para leer secuencialmente utilizamos la funcin 14H de la int 21H. El registro a ser leido es el que se encuentra definido por el bloque y el registro actual. El registro AL regresa el estado de la operacin, si AL contiene el valor de 1 o 3 es que hemos llegado al final del archivo. Un resultado de 2 significa que el FCB est mal estructurado. En caso de no existir error AL contendr el valor de 0 y los campos bloque actual y registro actual son actualizados. Lectura y escritura aleatoria La funcin 21H y la funcin 22H de la interrupcin 21H son las encargadas de realizar las lecturas y escrituras aleatorias respectivamente. El nmero de registro aleatorio y el bloque actual son usados para calcular la posicin relativa del registro a leer o escribir. El registro AL regresa la misma informacin que para lectura o escritura secuencial. La informacin que ser leda se regresar en el rea de transferencia de disco, as mismo la informacin que ser escrita reside en el DTA. Cerrar un archivo Para cerrar un archivo utilizamos la funcin 10H de la interrupcin 21H. Si despus de invocarse esta funcin el registro AL contiene el valor de FFH significa que el archivo ha cambiado de posicin, se cambi el disco o hay un error de acceso al disco. Trabajando con handles El uso de handles para manejar los archivos facilita en gran medida la creacin de archivos y el programador puede concentrarse en otros aspectos de la programacin sin preocuparse en detalles que pueden ser manejados por el sistema operativo. La facilidad en el uso de los handles consiste en que para operar sobre un archivo nicamente es necesario definir el nombre del mismo y el nmero del handle a utilizar, toda la dems informacin es manejada internamente por el DOS. Cuando utilizamos este mtodo para trabajar con archivos no existe una distincin entre accesos secuenciales o aleatorios, el archivo es tomado simplemente como una cadena de bytes. Funciones para utilizar handles Las funciones utilizadas para el manejo de archivos por medio de handles son descritas en la unidad 6: Interrupciones, en la seccin dedicada a la interrupcin 21H. Bibliografa: http://www.itescam.edu.mx/principal/webalumnos/sylabus/asignatura.php ?clave_asig=SCC-1014&carrera=ISIC-2010-224&id_d=170