Unidad I Introducción Al Lenguaje Ensamblador

download Unidad I Introducción Al Lenguaje Ensamblador

of 125

description

sig

Transcript of Unidad I Introducción Al Lenguaje Ensamblador

Instituto Tecnolgico de Culiacn Ing. en Sistemas Computacionales

Instituto Tecnolgico de CuliacnIng. en Sistemas ComputacionalesLenguajes de Interfaz

Unidad I: Introduccin al Lenguaje EnsambladorImportancia de la programacin en lenguaje ensamblador.El procesador y sus registros internosLa memoria principal (RAM)El concepto de interrupcionesLlamadas a servicios del sistemaModos de direccionamientoProceso de ensamblado y ligadoDesplegado de mensajes en el monitorIntroduccin al Lenguaje EnsambladorImportancia de la programacin en lenguaje ensamblador.Introduccin al Lenguaje EnsambladorImportancia de la Programacin en Lenguaje EnsambladorLenguaje ensamblador es un lenguaje de programacin de computadoras, considerado de bajo nivel, y constituye la representacin ms directa del cdigo mquina especfico para cada arquitectura de computadoras, que es legible para un programador.

Fue usado principalmente en los inicios del desarrollo de software, cuando aun no se contaba con los potentes lenguajes de alto nivel. Actualmente se utiliza con frecuencia en ambientes acadmicos y de investigacin, especialmente cuando se requiere la manipulacin directa de hardware, se pretenden altos rendimientos o un uso de recursos controlado y reducido.Definicin de Lenguaje EnsambladorMuchos dispositivos programables (como los microcontroladores) aun cuentan con el lenguaje ensamblador como la nica manera de ser manipulados.

CaractersticasEl cdigo escrito en lenguaje ensamblador posee una cierta dificultad de ser entendido directamente por un ser humano ya que su estructura se acerca mas bien al lenguaje mquina, es decir, lenguaje de bajo nivel.

El lenguaje ensamblador es difcilmente portable, es decir, un cdigo escrito para un microprocesador en particular necesita ser modificado muchas veces en su totalidad para poder ser usado en otro microprocesador. CaractersticasLos programas hechos en lenguaje ensamblador son generalmente ms rpidos y consumen menos recursos del sistema (memoria RAM y ROM). Al programar cuidadosamente en lenguaje ensamblador se pueden crear programas que se ejecutan ms rpidamente y ocupan menos espacio que con lenguajes de alto nivel.

Con el lenguaje ensamblador se tiene un control muy preciso de las tareas realizadas por un microprocesador por lo que se pueden crear segmentos de cdigo difciles de programar en un lenguaje de alto nivel.

EnsambladorUn ensamblador (assembler en ingls) es un programa que crea cdigo objeto traduciendo instrucciones nemnicas de un programa fuente escrito en lenguaje ensamblador a cdigos ejecutables e interpretando los nombres simblicos para direcciones de memoria y otras entidades (ensamblado).

El uso de referencias simblicas es una caracterstica bsica del lenguaje ensamblador, evitando tediosos clculos y direccionamiento manual despus de cada modificacin del programa. La mayora de los ensambladores tambin incluyen facilidades para crear macros, a fin de generar series de instrucciones cortas que se ejecutan en tiempo real, en lugar de utilizar subrutinas.Ensamblador

Lenguaje EnsambladorUn programa escrito en lenguaje ensamblador consiste en una serie de instrucciones que corresponden al flujo de rdenes ejecutables que pueden ser cargadas en la memoria de un sistema basado en microprocesador.

Por ejemplo, un procesador x86 puede ejecutar la siguiente instruccin binaria como se expresa en cdigo de mquina:

Binario: 10110000 01100001 (Hexadecimal: 0xb061) Lenguaje EnsambladorLa representacin equivalente en lenguaje ensamblador es ms fcil de recordar:

MOV al, 061h

Esta instruccin significa:

Asigna el valor hexadecimal 61 (97 decimal) al registro "al". Lenguaje EnsambladorEl mnemnico "mov" es un cdigo de operacin u opcode", elegido por los diseadores de la coleccin de instrucciones para abreviar "move" (mover, pero en el sentido de copiar valores de un sitio a otro). El opcode es seguido por una lista de argumentos o parmetros, completando una instruccin de ensamblador tpica.

La transformacin del lenguaje ensamblador en cdigo mquina la realiza un programa Ensamblador, y la traduccin inversa la puede efectuar un desensamblador.Lenguaje EnsambladorA diferencia de los lenguajes de alto nivel, aqu hay usualmente una correspondencia 1 a 1 entre las instrucciones simples del ensamblador y el lenguaje de mquina.

Sin embargo, en algunos casos, un ensamblador puede proveer "pseudo instrucciones" que se expanden en un cdigo de mquina ms extenso a fin de proveer la funcionalidad necesaria.

Por ejemplo, para un cdigo mquina condicional como "si X mayor o igual que" , un ensamblador puede utilizar una pseudoinstruccin al grupo "haga si menor que" , y "si = 0" sobre el resultado de la condicin anterior.Lenguaje EnsambladorLos Ensambladores ms completos tambin proveen un rico lenguaje de macros que se utiliza para generar cdigo ms complejo y secuencias de datos.

El uso del ensamblador no resuelve definitivamente el problema de cmo programar un sistema basado en microprocesador de modo sencillo ya que para hacer un uso eficiente del mismo, hay que conocer a fondo el microprocesador, los registros de trabajo de que dispone, la estructura de la memoria, y muchas cosas ms referentes a su estructura bsica de funcionamiento.Lenguaje EnsambladorCada arquitectura de microprocesadores tiene su propio lenguaje de mquina, y en consecuencia su propio lenguaje ensamblador ya que este se encuentra muy ligado al la estructura del hardware para el cual se programa.

Los microprocesadores difieren en el tipo y nmero de operaciones que soportan; tambin pueden tener diferente cantidad de registros, y distinta representacin de los tipos de datos en memoria.

Aunque la mayora de los microprocesadores son capaces de cumplir esencialmente las mismas funciones, la forma en que lo hacen difiere y los respectivos lenguajes ensamblador reflejan tal diferencia.Lenguaje EnsambladorPueden existir mltiples conjuntos de mnemnicos o sintxis de lenguaje ensamblador para un mismo conjunto de instrucciones, instanciados tpicamente en diferentes programas en ensamblador.

En estos casos, la alternativa ms popular es la provista por los fabricantes, y usada en los manuales del programa.Usos y AplicacionesLa mayora de las aplicaciones que se ejecutan en una computadora han sido desarrolladas empleando algn lenguaje de alto nivel, de los cuales hay infinidad, tales como: C, C++, Pascal, COBOL, Java, PHP, C#, Visual Basic, Perl, Python y un largo etctera ms.

En una gran parte de estos desarrollos la eleccin de un lenguaje u otro es casi una preferencia personal, puesto que en general comparten una funcionalidad, e incluso una sintaxis, muy similar.Usos y AplicacionesEn contraposicin, el lenguaje ensamblador se dirige a tipos de proyectos y situaciones muchos ms concretos y especficos. En muchos casos este lenguaje se utiliza no para desarrollar una aplicacin completa, sino para mejorar la velocidad de ciertas partes de un programa o bien realizar operaciones que, desde el lenguaje de alto nivel, no estn accesibles de otra forma.

En dispositivos con poca capacidad de memoria y potencia limitada, como los antes mencionados, s que suele recurrirse al ensamblador como recurso principal para definir su programacin.Usos y AplicacionesAsimismo la programacin en lenguaje ensamblador es un recurso, un medio ms que un fin, utilizado en la mayora de las carreras relacionadas con la informtica para acercar al estudiante a las interioridades de los microprocesadores, facilitndole el conocimiento de su arquitectura as como su funcionamiento.

En este sentido la escritura de programas en ensamblador fortalece el pensamiento analtico del programador, ya que se ve forzado a dividir el problema a resolver en una multitud de operaciones ms sencillas, repitiendo el proceso hasta poder expresar esas operaciones mediante los cdigos de operacin con que cuente el microprocesador.Usos y AplicacionesEn cualquier caso, el aprendizaje de un lenguaje como el ensamblador, tanto si en el futuro se utiliza all donde resulte adecuado como si no, es un proceso que le aportar una gran cantidad de conocimientos tiles que van desde saber cmo se almacenan ciertos tipos de datos en la memoria hasta aprender a utilizar los servicios de la BIOS que incorpora toda computadora.

Tipos de EnsambladoresNos referimos a las caractersticas de los traductores de lenguaje ensamblador a cdigo mquina.

Una clasificacin simple de los tipos de ensambladores sera la siguiente:

Ensambladores de una faseEnsambladores de dos fasesMicroensambladoresMacroensabladoresEnsambladores residentesEnsambladores cruzadosTipos de EnsambladoresEnsambladores de una fase: Estos ensambladores leen una lnea del programa fuente y la traducen directamente para producir una instruccin en lenguaje mquina o la ejecuta si se trata de una pseudoinstruccin.

Ensambladores de dos fases: Los ensambladores de dos fases se denominan as debido a que realizan la traduccin en dos etapas, en la primera fase, leen el programa fuente y construyen una tabla de smbolos y en la segunda fase, vuelven a leer el programa fuente y pueden ir traduciendo totalmente, puesto que conocen la totalidad de los smbolos utilizados y las posiciones que se les ha asignado Tipos de EnsambladoresMicroensambladores: Generalmente, los procesadores utilizados en las computadoras tienen un repertorio fijo de instrucciones, es decir, que el intrprete de las mismas interpretaba de igual forma un determinado cdigo de operacin.

Macroensambladores: Son ensambladores que permiten el uso de macroinstrucciones (macros). Debido a su potencial, normalmente son programas robustos que no permanecen en memoria una vez generado el programa objeto.

Tipos de EnsambladoresEnsambladores Residentes: Son aquellos que permanecen en la memoria principal de la computadora y cargan, para su ejecucin, al programa objeto producido.

Ensambladores Cruzados (Cross-Assembler): Se denominan as los ensambladores que se utilizan en una computadora que posee un procesador diferente al que tendrn las computadoras donde va a ejecutarse el programa objeto producido.

El procesador y sus registros internosIntroduccin al Lenguaje EnsambladorEl microprocesadorEl 8086 es un microprocesador de 16 bits, tanto en lo que se refiere a su estructura como en sus conexiones externas, mientras que el 8088 es un procesador de 8 bits que internamente es casi idntico al 8086.

La nica diferencia entre ambos es el tamao del bus de datos externo. Intel trata esta igualdad interna y desigualdad externa dividiendo cada procesador 8086 y 8088 en dos sub-procesadores. O sea, cada uno consta de una unidad de ejecucin (EU: Execution Unit) y una unidad de interfaz del bus (BIU: Bus Interface Unit).El microprocesadorLa unidad de ejecucin es la encargada de realizar todas las operaciones mientras que la unidad de interfaz del bus es la encargada de acceder a datos e instrucciones del mundo exterior.

Las unidades de ejecucin son idnticas en ambos microprocesadores, pero las unidades de interfaz del bus son diferentes en varias cuestiones, como se desprende del siguiente diagrama en bloques:El microprocesador

Unidad Aritmtica LgicaEs la encargada de realizar las operaciones aritmticas (suma, suma con "arrastre", resta, resta con "prstamo" y comparaciones) y lgicas (AND, OR, XOR y TEST). Las operaciones pueden ser de 16 bits o de 8 bits.Sistema de control de la unidad de ejecucinEs el encargado de decodificar las instrucciones que le enva la cola y enviarle las rdenes a la unidad aritmtica y lgica segn una tabla que tiene almacenada en ROM llamada CROM (Control Read Only Memory).Registros del 8086Los registros de un microprocesador son componentes dentro del microprocesador que nos permiten almacenar datos. Estos datos pueden representar valores sobre los cuales se van a realizar operaciones, resultados de las operaciones, direcciones de localidades de memoria donde se encuentran datos e instrucciones, direcciones de los dispositivos de entrada/salida sobre los que deseamos escribir o leer, o los datos a escribir o ledos de esos dispositivos.

El nmero, tamao y uso de los registros de un microprocesador as como su conjunto de instrucciones determina la eficiencia con que el microprocesador realiza una tarea. A la descripcin del nmero, tamao y uso de los registros de un microprocesador se le conoce como el modelo de programacin del microprocesador.Registros del 8086

Registros de propsito generalLos registros de propsito general, como su nombre lo indica, se utilizan en la forma en que lo desee el programador. Cada uno de estos registros se puede direccionar como un registro de 16 bits (AX, BX, CX, DX) o como un registro de 8 bits (AH, AL, BH, BL, CH, CL, DH, DL). Cada uno de los registros de 16 bits est formado por la concatenacin de dos registros de 8 bits: AX = AH:AL, BX = BH:BL, CX = CH:CL y DX = DH:DL, donde el bit 0 del registro AH es el bit 8 del registro AX, etc.

Adicionalmente, algunas de las instrucciones del microprocesador emplean los registros de propsito general para tareas especficas. Por esta razn, a cada uno se le da su nombre (Acumulador, Base, Contador y Datos). Las funciones primarias de los registros de propsito general incluyen:Registros de propsito generalAX, AH, AL (Acumulador): Se utiliza como registro principal para la realizacin de operaciones aritmticas o lgicas.

BX, BH, BL (Base): Se utiliza para guardar la direccin base de listas de datos en la memoria.

CX, CH, CL (Contador): Contiene el conteo para ciertas instrucciones de corrimientos y rotaciones, de iteraciones en el ciclo LOOP y operaciones repetidas de cadenas.

DX, DH, DL (Datos): Se utiliza como registro de datos en las operaciones de entrada/salida de datos, adems contiene la parte ms significativa de un producto despus de una multiplicacin; la parte ms significativa del dividendo antes de la divisin.Registros apuntadores e ndicesAunque los registros apuntadores y de ndices (a excepcin del registro apuntador de instrucciones) son tambin de uso general, se utilizan principalmente para formar la direccin efectiva o real de una localidad de memoria.

Los registros apuntadores y de ndice contienen el desplazamiento con respecto a un segmento de un dato o una instruccin. Las funciones primarias de los registros apuntadores y de ndice incluyen:Registros apuntadores e ndicesSP (Apuntador de pila): Contiene el desplazamiento con respecto al segmento de pila del tope de la pila del programa.

BP (Apuntador de base): Contiene el desplazamiento con respecto al segmento de pila de datos almacenados en la pila de un programa.

SI (ndice fuente): Contiene el desplazamiento con respecto al segmento de datos de un elemento de un arreglo o cadena.

DI (ndice destino): Contiene el desplazamiento con respecto al segmento extra de un elemento de una cadena o arreglo.Registros de segmentoLos registros de segmentos se utilizan para formar la direccin efectiva o real de una localidad de memoria. Los registros de segmentos contienen la direccin de segmento de un dato o una instruccin. El cdigo y los datos de un programa en ejecucin se encuentran cada uno en uno o ms segmentos de memoria. La pila del programa ocupa otro segmento. Los registros de segmento son:Registros de segmentoCS (Cdigo): Tiene la direccin lgica del segmento en que se encuentra el cdigo de un programa. Si el cdigo ocupa ms de un segmento, contiene la direccin lgica de uno de los segmentos.

DS (Datos): Tiene la direccin lgica del segmento en que se encuentran los datos estticos de un programa. Si los datos ocupan ms de un segmento, contiene la direccin lgica de uno de los segmentos.

ES (Extra): Este registro tambin tiene la direccin lgica de uno de los segmentos en que se encuentran los datos estticos de un programa. Este registro se utiliza en ciertas operaciones del microprocesador para el manejo de cadenas.

SS (Pila): Tiene la direccin lgica del segmento en que se encuentran la pila del sistema. La pila no puede ser mayor a un segmento.Registros variosIP (Apuntador de instrucciones): Contiene siempre el desplazamiento con respecto al segmento de cdigo de la localidad de memoria que contiene la siguiente instruccin que va a ejecutar el microprocesador.

FLAGS (Banderas): Cada bandera es un bit en el registro de banderas, tambin llamado registro de cdigo de condiciones. En la siguiente figurase ilustra el registro de banderas del microprocesador 8086. Aunque el registro de banderas es de 16 bits slo hay nueve banderas: O, D, I, T, S, Z, A, P, C. Los otros 7 bits no son usados.

Banderas de estadoC (Acarreo): Indica un acarreo despus de una suma o un prstamo despus de una resta. La bandera de acarreo tambin indica condiciones de error en ciertos programas y procedimientos.

P (Paridad): Es un cero para una paridad impar y un 1 para una paridad par. La paridad es un conteo de unos expresada como un nmero par e impar.

A (Acarreo auxiliar): Indica un acarreo despus de una suma o un prstamo despus de una resta del bit 3 al bit 4 en el resultado. Esta bandera slo se utiliza en las operaciones DAA y DAS para ajustar el valor de AL despus de una suma o resta BCD.Banderas de estadoZ (Cero): Indica que el resultado de una operacin aritmtica o lgica es cero. Si Z = 1, el resultado es cero y si Z = 0, el resultado no es cero.

S (Signo): Indica el signo aritmtico del resultado despus de una suma o una resta. Si S = 1, el resultado es negativo. Si S = 0, el resultado es positivo. Se debe tener en cuenta que el valor del bit ms significativo aparece en el bit de signo en cualquier instruccin que afecte las banderas.

O (Sobreflujo): Es una condicin que ocurre cuando se suman o se restan nmeros con signo. Un sobreflujo indica que el resultado ha excedido la capacidad de la mquina. Por ejemplo si se suma 7FH + 01H (127 + 1) el resultado es 80H (-128). Este resultado representa una situacin de sobreflujo sealado por la bandera para la suma con signo. Para operaciones sin signo esta bandera se ignora.Banderas de controlT (Trampa): Activa, si se pone a 1, o desactiva, si se pone a 0, el modo de ejecucin paso a paso. Este modo es utilizado por los depuradores para ejecutar las instrucciones una a la vez y permitir observar el efecto de la instruccin sobre los registros y la memoria.

I (Interrupcin): Habilita, si se pone a 1, o deshabilita, si se pone a 0, las interrupciones al microprocesador. El estado de esta bandera se controla con las instrucciones STI (habilitar interrupciones) y CLI (desactivar las interrupciones).

D (Direccin): Controla la seleccin de autoincremento o autodecremento de los registros DI o SI durante las instrucciones de cadenas y arreglos. Si D = 1 hay autodecremento en los registros y si D = 0 hay autoincremento. El estado de esta bandera se controla con las instrucciones STD (habilitar direccin) y CLD (desactivar direccin).Registros de 32 y 64 Bits

Tarea:

Descripcin de los registros de 32 y 64 bits de los procesadores de la familia Intel, incluyendo la descripcin detallada de los nuevos indicadores del registro de banderas.

Requisitos:ManuscritaEquipo de 2 integrantesRegistros de 32 y 64 BitsLa memoria principal (RAM)Introduccin al Lenguaje EnsambladorMemoria PrincipalLa memoria es un conjunto o arreglo de celdas binarias de longitud definida (8, 16, 32 o 64 bits), en las cuales se puede almacenar instrucciones codificadas y datos.

Cada uno de estos celdas se caracteriza por tener una direccin nica, por lo que generalmente cada una de estas localidades se identifica por su direccin la cual es la posicin que le toca a esa celda dentro del arreglo.

Las direcciones se expresan siempre en hexadecimal.Los procesadores actuales tienen diferentes modos de operacin. He aqu las descripciones breves de cada modo:

Modo protegido El modo protegido es el estado nativo del procesador, en el que estn disponibles todas las instrucciones y caractersticas. Los programas reciben reas separadas de memoria llamadas segmentos, y el procesador evita que los programas hagan referencia a la memoria que se encuentra fuera de sus segmentos asignados.

Modo 8086 virtual Mientras se encuentra en modo protegido, el procesador puede ejecutar en forma directa el software para modo de direccionamiento real, como los programas de MS-DOS, en un entorno multitarea seguro. En otras palabras, si un programa de MS-DOS falla o trata de escribir datos en el rea de memoria del sistema, no afectar a los otros programas que se ejecuten al mismo tiempo. Windows XP puede ejecutar varias sesiones separadas en modo 8086 a la vez.

Modo de direccionamiento real Este modo implementa el entorno de programacin del procesador 8086 de Intel, con unas cuantas caractersticas adicionales, como la habilidad de cambiar a otros modos. Este modo est disponible en Windows 98 y puede usarse para ejecutar un programa de MS-DOS que requiera el acceso directo a la memoria del sistema y a los dispositivos de hardware. Los programas que se ejecutan en modo de direccionamiento real pueden hacer que el sistema operativo falle (que deje de responder a los comandos).

Modos de operacinLos procesadores nuevos administran la memoria de acuerdo a los modos bsicos de operacin vistos anteriormente. El modo protegido es el ms simple y poderoso; los dems se utilizan, por lo general, cuando los programas deben acceder directamente al hardware del sistema.

En el modo de direccionamiento real slo puede direccionarse 1MB de memoria, del 00000 al FFFFF hexadecimal.

El procesador slo puede ejecutar un programa a la vez, pero puede interrumpir en forma momentnea ese programa para procesar las solicitudes (conocidas como interrupciones) de los perifricos.

Los programas de aplicacin pueden leer y modificar cualquier rea de la RAM (memoria de acceso aleatorio) y pueden leer pero no modificar cualquier rea de la ROM (memoria de slo lectura). El sistema operativo MS-DOS se ejecuta en modo de direccionamiento real, y Windows 95/98 puede cargarse en este modo.Administracin de memoriaEn el modo protegido, el procesador puede ejecutar varios programas al mismo tiempo. A cada proceso (programa en ejecucin) le asigna un total de 4GB de memoria. A cada programa se le puede asignar su propia rea reservada de memoria, y los programas no pueden acceder de manera accidental al cdigo y los datos de los dems programas. Windows y Linux se ejecutan en modo protegido.

En el modo 8086 virtual, la computadora se ejecuta en modo protegido y crea una mquina 8086 virtual con su propio espacio de direcciones de 1MB, que simula a una computadora 80 86 que se ejecuta en modo de direccionamiento real.

Por ejemplo, Windows NT y 2000 crean una mquina 8086 virtual cuando abrimos una ventana de Comandos. Puede ejecutar muchas de esas ventanas al mismo tiempo, y cada una est protegida contra las acciones de las dems. Algunos programas de MS-DOS que hacen referencias directas al hardware de la computadora no se ejecutarn en este modo bajo Windows NT, 2000 y XPAdministracin de memoriaEn el modo de direccionamiento real, el procesador IA-32 puede acceder a 1,048,576 bytes de memoria (1MB) mediante el uso de direcciones de 20 bits, en el rango de 0 a FFFFF hexadecimal.

Los ingenieros de Intel tuvieron que resolver un problema bsico: los registros de 16 bits en el procesador 8086 no podan almacenar direcciones de 20 bits.

Por ende, idearon un esquema conocido como memoria segmentada. Toda la memoria se divide en unidades de 64 Kilobytes, a las cuales se les llama segmentos, como se muestra en la siguiente figura.Modo de direccionamiento realModo de direccionamiento real

Una analoga es un edificio extenso, en el que los segmentos representan a los pisos del edificio. Una persona puede tomar el elevador hacia un piso especfico, bajarse y empezar a seguir los nmeros de los cuartos para localizar uno. El desplazamiento de un cuarto puede considerarse como la distancia desde el elevador hasta ese cuarto.

En la figura anterior, cada segmento empieza en una direccin que tiene un cero en su ltimo dgito hexadecimal. Como el ltimo dgito siempre es cero, se omite al representar los valores de los segmentos. Por ejemplo, un valor de segmento de C000 hace referencia al segmento en la direccin C0000.

La misma figura muestra una expansin del segmento en la direccin 80000. Para acceder a un byte en este segmento, se suma un desplazamiento de 16 bits (de 0 a FFFF) a la ubicacin base del segmento. Por ejemplo, la direccin 8000:0250 representa un desplazamiento de 250 dentro del segmento que empieza en la direccin 80000. La direccin lineal es 80250h.Modo de direccionamiento realUna direccin se refiere a una ubicacin individual en la memoria, y cada byte de memoria tiene una direccin distinta.

En el modo de direccionamiento real, la direccin lineal (o absoluta) es de 20 bits, y vara de 0 a FFFFF hexadecimal.

Los programas no pueden utilizar las direcciones lineales directamente, por lo que las direcciones se expresan mediante el uso de dos enteros de 16 bits. Una direccin tipo segmento-desplazamiento incluye lo siguiente:

Un valor de segmento de 16 bits, que se coloca en uno de los registros de segmento (CS, DS, ES, SS).Un valor de desplazamiento de 16 bits.

Clculo de direcciones lineales de 20 bitsLa CPU convierte en forma automtica una direccin tipo segmento-desplazamiento en una direccin lineal de 20 bits.

Suponga que la direccin segmento-desplazamiento hexadecimal de una variable es 08F1:0100. La CPU multiplica el valor del segmento por 16 (10 hexadecimal) y suma el producto al desplazamiento de la variable:

08F1h * 10h = 08F10h(valor de segmento ajustado)Valor de segmento ajustado:0 8 F 1 0Se suma el desplazamiento: 0 1 0 0Direccin lineal:0 9 0 1 0Clculo de direcciones lineales de 20 bitsUn programa ordinario tiene tres segmentos: cdigo, datos y pila. Los tres registros de segmento CS, DS y SS contienen las ubicaciones base de los segmentos:

CS contiene la direccin del segmento de cdigo de 16 bits.DS contiene la direccin del segmento de datos de 16 bits.SS contiene la direccin del segmento de pila de 16 bits.ES, FS y GS pueden apuntar a segmentos de datos alternativos.

Clculo de direcciones lineales de 20 bitsCalculo de la direccin efectiva y fsica:La direccin efectiva o desplazamiento se obtiene de sumar una combinacin de los contenidos de los registros BX o BP con los contenidos de los registros SI o DI ms un desplazamiento (valor constante) de 8 o 16 bits.La direccin fsica se obtiene de sumar la direccin efectiva al valor de un registro de segmento multiplicado por 10H.Direccin de cdigoCS * 10H + IPDireccin de datosDS * 10H + Direccin efectiva (cuando se utiliza BX, SI o DI).SS * 10H + Direccin efectiva (cuando se utiliza BP).Calculo de la direccin efectiva y fsica:Ejercicio: Calcular las direcciones efectivas y las direcciones reales usando los siguientes valores para los diversos modos de direccionamiento.BX = 1234HDS = F32EHBP = 4125HSS = 0321HSI = 68ADHDesp16 = 2140HDI = 1F3Ca) Registro indirectob) Registro relativo[BX][BX + Desp16][SI] [BP + Desp16][DI] [SI + Desp16][DI + Desp16]c) Registro base indexado d) Relativo base ms ndice[BX + SI][BX + SI + Desp16][BX + DI] [BX + DI + Desp16][BP + SI][BP + SI + Desp16][BP + DI] [BP + DI + Desp16]El modo protegido es el modo nativo ms poderoso del procesador. Al ejecutarse en modo protegido, un programa puede acceder a 4GB de memoria, con direcciones desde 0 hasta FFFFFFFF hexadecimal.

En el contexto de Microsoft Assembler, el modelo de memoria plano (consulte la directiva .MODEL) es apropiado para la programacin en modo protegido. El modelo plano es fcil de usar, ya que slo requiere un entero de 32bits para guardar la direccin de una instruccin o variable.

La CPU realiza el clculo y la traduccin de las direcciones en segundo plano, todo lo cual es transparente para los programadores de aplicaciones. Los registros de segmento (CS, DS, SS, ES, FS, GS) apuntan a tablas de descriptores de segmentos, que el sistema operativo utiliza para llevar el registro de las ubicaciones de los segmentos individuales de un programa. Un programa ordinario en modo protegido tiene tres segmentos: cdigo, datos y pila, y utiliza los registros de segmento CS,DS y SS:

CS hace referencia a la tabla de descriptores para el segmento de cdigo.DS hace referencia a la tabla de descriptores para el segmento de datos.SS hace referencia a la tabla de descriptores para el segmento de pila.

Modo protegidoEn este modelo, todos los segmentos se asignan al espacio completo de direcciones fsicas de 32 bits de la computadora. Se requieren por lo menos dos segmentos, uno para cdigo y uno para datos.

Cada segmento se define mediante un descriptor de segmento, un entero de 64 bits que se almacena en una tabla conocida como la tabla de descriptores globales (GDT).

La siguiente figura muestra un descriptor de segmento cuyo campo direccin base apunta a la primera ubicacin disponible en la memoria (00000000).

El campo lmite del segmento puede indicar de manera opcional la cantidad de memoria fsica en el sistema. En esta figura, el lmite del segmento es 0040.

El campo acceso contiene bits que determinan cmo puede utilizarse el segmento.Modelo de segmentacin planoModelo de segmentacin plano

NOTA: Suponga que una computadora tiene 256MB de RAM. El campo lmite del segmento contendra el nmero 10000 hex, ya que su valor se multiplica en forma implcita por 1000 hex, produciendo el nmero 10000000 hex (256MB) como resultado.Modelo de segmentacin planoEn el modelo multisegmentos, cada tarea o programa recibe su propia tabla de descriptores de segmento, conocida como tabla de descriptores locales (LDT). Cada descriptor apunta a un segmento, que puede ser distinto de los dems segmentos utilizados por otros procesos. Cada segmento tiene su propio espacio de direcciones.

En la siguiente figura, cada entrada en la LDT apunta a un segmento distinto en la memoria. Cada descriptor de segmento especifica el tamao exacto de su segmento. Por ejemplo, el segmento que empieza en 3000 tiene un tamao de 2000 hexadecimal, que se calcula como (0002 * 1000 hexadecimal). El segmento que empieza en 8000 tiene el tamao de A000 hexadecimal.Modelo de varios segmentosModelo de varios segmentos

Los procesadores tienen soporte para la paginacin, una caracterstica que permite dividir los segmentos en bloques de 4,096 bytes de memoria, conocidos como pginas. La paginacin permite que el total de memoria utilizada por todos los programas que se ejecutan al mismo tiempo sea mucho ms grande que la memoria fsica de la computadora. La coleccin completa de pginas asignadas por el sistema operativo se llama memoria virtual. Los sistemas operativos tienen programas utilitarios llamados administradores de memoria virtual.

La paginacin es una solucin importante para un molesto problema al que se enfrentan los diseadores de software y hardware. Un programa debe cargarse en la memoria principal para poder ejecutarse, pero la memoria es costosa. Los usuarios desean cargar numerosos programas en la memoria y cambiar de uno a otro segn lo deseen. Por otro lado, el almacenamiento en disco es econmico y vasto. La paginacin crea la ilusin de que la memoria es casi ilimitada en tamao. El acceso al disco es mucho ms lento que el acceso a la memoria principal, por lo que entre ms dependa un programa de la paginacin, se ejecutar con ms lentitud.PaginacinCuando una tarea se ejecuta, algunas de sus partes pueden almacenarse en disco si no se encuentran en uso en ese momento.

Las partes de la tarea se paginan (intercambian) en el disco. Otras pginas activas en ejecucin permanecen en la memoria.

Cuando el programa empieza a ejecutar cdigo que se ha paginado fuera de la memoria, produce un fallo de pgina para que la pgina o pginas que contienen el cdigo o datos requeridos se carguen de vuelta en la memoria.

Para ver cmo funciona esto, elija una computadora con memoria algo limitada y ejecute muchas aplicaciones extensas al mismo tiempo. Deber observar un retraso al cambiar de un programa a otro, debido a que el OS debe transferir las porciones paginadas de cada programa, del disco a la memoria. Una computadora funciona a una mayor velocidad cuando hay ms memoria instalada, ya que los archivos y programas de aplicaciones extensas pueden mantenerse por completo en la memoria, con lo que se reduce la cantidad de paginacin.

PaginacinEl concepto de interrupcionesLlamadas a servicios del sistemaIntroduccin al Lenguaje EnsambladorEl concepto de interrupcionesLas interrupciones son un "mecanismo" por medio del cual hacemos que el CPU deje de hacer la tarea que estaba realizando para que atienda otra tarea distinta (la que realiza la interrupcin).

Es decir, es una forma de llamar la atencin del CPU de manera que cuando cada dispositivo necesita ser atendido por el CPU, emite una interrupcin o seal haciendo que el CPU vaya a atenderlo de inmediato.Interrupciones en modo realLa programacin de entrada/salida mediante interrupciones es bsica en los programas para poder accesar los datos desde los diferentes dispositivos perifricos que existen.

A continuacin se dan una serie de definiciones que se utilizan para manejar la programacin de entrada/salida:Interrupciones en modo realInterrupcin.- Es una seal de que ha ocurrido un evento que requiere atencin inmediata.

Manejador de interrupcin.- Es un procedimiento o rutina que se ejecuta cuando una interrupcin ocurre.

Vector de interrupciones.- Es una tabla que contiene las direcciones donde se encuentran las rutinas manejadoras de interrupcin. Este vector se encuentra almacenado en la direccin 0000H a la 03FFH, contiene 1024 bytes y cada interrupcin ocupa 4 bytes para almacenar la direccin del segmento y del desplazamiento, o sea que en total existen 256 interrupciones definidas (del 0 al 255). No todas estn ocupadas, algunos lugares estn reservados para que sean usados por los usuarios.Interrupciones en modo realNmero de interrupcin.- Es el nmero que identifica a la interrupcin y con el cual se accesa el vector de interrupciones.Llamada a funcin.- Servicio que ofrece el DOS para dar servicio bajo la interrupcin 21H.Interrupcin de software.- Es una interrupcin generada por un programa que est en ejecucin.Interrupcin de hardware.- Es una interrupcin que se origina en un dispositivo perifrico.Interrupciones en modo real

Ejecucin de interrupciones en modo realPara que una interrupcin pueda ser servida o atendida por el procesador, es necesario que se ejecuten una serie de pasos:Terminar de ejecutar la instruccin actual en proceso.Meter en el stack el registro de banderas.Meter en el stack la direccin del segmento de la prxima instruccin a ejecutar (CS).Meter en el stack el desplazamiento de la prxima instruccin a ejecutar (IP).Determinar la direccin del manejador de la interrupcin, accesando el vector de interrupciones. Se lee el nmero de la interrupcin, multiplicar por 4, accesar el vector en la posicin correspondiente y cargar los registros CS e IP con los valores.Iniciar la ejecucin del manejador de interrupciones.Ejecucin de interrupciones en modo realTodos los manejadores de interrupciones terminan con la instruccin IRET.

Despus de ejecutar la instruccin IRET se ejecutan los siguientes pasos:Recuperar el valor del registro IP desde la pila.Recuperar el valor del registro CS desde la pila.Recuperar el valor del registro de banderas desde la pila.Continua la ejecucin de la siguiente instruccin del programa.En el modo protegido, las interrupciones tienen exactamente las mismas asignaciones que en el modo real, pero la tabla del vector de interrupciones es diferente. En lugar de vectores de interrupcin, el modo protegido usa un conjunto de 256 descriptores de interrupcin que estn almacenados en una tabla de descriptores de interrupciones (IDT: Interrupt Descriptor Table).

La tabla de descriptores de interrupcin tiene una longitud de 256 x 8 (2048) bytes, con cada descriptor conteniendo 8 bytes. La tabla de descriptores de interrupciones est localizada en cualquier localidad de memoria en el sistema especificada por el registro de direcciones de la tabla de descriptores de interrupciones (IDTR: Interrupt Descriptor Table Address Register).

Cada entrada en la IDT contiene la direccin del procedimiento de servicio de interrupcin en la forma de un selector de segmento y una direccin de desplazamiento de 32 bits. Tambin contiene el bit P (presente) y los bits DPL para describir el nivel de privilegio de la interrupcin. La siguiente figura muestra los contenidos del descriptor de interrupcin.Interrupciones en modo protegidoInterrupciones en modo protegido

Aparte de los descriptores de interrupcin y de la IDT, las interrupciones en modo protegido funcionan igual que las interrupciones en modo real.

Se regresa de ambas interrupciones usando las instrucciones IRET o IRETD. La nica diferencia es que en el modo protegido el microprocesador accesa la IDT en lugar de la tabla de vectores de interrupcin.

En el modo de 64 bits del Pentium 4 y Core 2, una instruccin IRETQ debe ser usada para regresar de una interrupcin. Esta es una de las razones por las que hay diferentes sistemas operativos y controladores para el modo de 64 bits.Interrupciones en modo protegidoLas llamadas al sistema son interfaces de programacin que sirven para poder invocar los servicios que el sistema operativo nos ofrece.

Estas llamadas se encuentran escritas en lenguajes de alto nivel como C y C++.

En general, las llamadas a sistemas son accesadas mediante una API (interfaz de programacin de aplicaciones), en vez de invocarlas directamente, de sta manera se hace ms fcil el trabajo para un programador de aplicaciones.

Esta API especifica un conjunto de funciones que el programador puede utilizar, incluyendo los parmetros que son pasados a cada funcin y que retornan valores que el programador puede esperarLlamadas a servicios del sistemaA un programador le resulta ms fcil utilizar una API que realizar las llamadas al sistema directamente debido a que posee una mayor portabilidad (cuando se desea compilar el programa en cualquier SO que pueda soportar la API utilizada), y a menudo es ms difcil trabajar con las propias llamadas al sistema.

El sistema de soporte en tiempo de ejecucin, nos provee de una interfaz de llamadas al sistema que sirve como enlace con las llamadas al sistema disponibles en el sistema operativo. sta se encarga de interceptar las llamadas a funciones dentro de la API e invoca a la llamada al sistema necesaria. Cada llamada al sistema tiene asociado un nmero y la interfaz mantiene una tabla indexada con dichos nmeros. Esta tabla sirve para invocar las llamadas al ncleo del SO y retorna el estado de ejecucin de la llamada al sistema y los valores posibles de retorno.

Llamadas a servicios del sistemaLlamadas a servicios mediante interrupcionesSe puede considerar al sistema operativo como un proveedor de servicios, el cual puede ser accesado usando las interrupciones de software con la instruccin INT. As, el DOS funciona como una interfaz entre el programa y el hardware.Existen muchas interrupciones dentro del DOS y tambin muchas funciones que estn definidas para ellas.Veamos algunas de las ms usuales:Llamadas a servicios mediante interrupcionesINT 20HTermina el programa y regresa al DOS.INT 05HImprime la pantalla (PrintScr).INT 10HEjecuta un BASIC rudimentario.INT 19HInicializa la computadora (Reboot).INT 00HDivisin por cero.INT 04HCheca por overflow (INTO).INT 02HInterrupcin no mascarable.Llamadas a servicios mediante interrupcionesINT 21HProvee funciones para la entrada/salida.

Funcin (AH)Servicio30HAccesa la versin del DOS que est instalada.AL=Parte entera. AH=Parte fraccionaria.Ej.- V. 5.0 AL = 5 y AH = 0.

2AHAccesa la fecha del sistema.AL = Da sem. ( 0->Dom, 1->Lun, ..., 6->Sb).CX = Ao ( 1980 2099 )DH = Mes (1 -> Ene, 2 -> Feb, ..., 12 -> Dic).DL = Da del mes ( 1 .. 31 ).Llamadas a servicios mediante interrupciones2BHColoca en el sistema la fecha definida en losregistros:CX = Define el ao.DH = Define el mes.DL = Define el da.01HLee un carcter ASCII y lo almacena en AL.02HDespliega el carcter ASCII definido en DL.05HImprime el carcter ASCII definido en DL(impresora).09HDespliega un string terminado en $.0AHLee un string del teclado.Llamadas a servicios mediante interrupcionesINT 10HProvee servicios de pantalla.

FuncinServicioAH = 02H yColoca el cursor en DH (rengln) y DL (columna).BH = 00H

AH = 06H yBorra la parte de la pantalla definida en CH, CLBH = 07H (punto inicial) y DH, DL (punto final)Modos de direccionamientoLos modos de direccionamiento indican la forma en que se obtiene el operando de una instruccin. Los microprocesadores de la familia Intel 8086 tienen los siguientes modos de direccionamiento:Direccionamiento por registro.- El operando se encuentra en uno de los registros del CPU. Ejemplo: MOV AX, BX.Direccionamiento inmediato.- El operando se encuentra inmediatamente despus de la instruccin. Ejemplo: MOV AX, 1234H.Direccionamiento directo.- El operando se encuentra en la direccin de memoria especificada directamente. Ejemplo: MOV AX, [1234H].Modos de direccionamientoDireccionamiento indirecto por registro.- El operando se encuentra en la direccin de memoria especificada en un registro. Ejemplo: MOV AX, [BX].Direccionamiento base ms ndice.- El operando se encuentra en la direccin de memoria especificada por la suma de un registro base (BX, BP) ms un registro ndice (SI, DI). Ejemplo: MOV AX, [BX + SI]Direccionamiento relativo por registro.- El operando se encuentra en la direccin de memoria especificada por la suma de un registro base o un registro ndice ms un desplazamiento. Ejemplo: MOV AX, [BX + 4].Direccionamiento relativo base ms ndice.- El operando se encuentra en la direccin de memoria especificada por la suma de un registro base ms un registro ndice ms un desplazamiento. Ejemplo: MOV AX, [BX + DI + 4].

Modos de direccionamientoDireccionamiento ndice escalado.- Esta disponible en los procesadores 386 y superiores. El segundo registro de un par de ellos, el ndice, se modifica por el factor de escala 2X, 4X u 8X para generar la direccin de memoria del operando. Ejemplo: MOV AL, [EAX + 4 * EBX].Direccionamiento relativo RIP.- Este modo de direccionamiento slo est disponible al direccionamiento de extensin de 64 bits de los procesadores actuales. Este modo permite el acceso a cualquier localidad de memoria al agregar un desplazamiento de 32 bits al contenido de 64 bits del puntero de instrucciones de 64 bits.Proceso de ensamblado y ligado

Desplegado de mensajes en el monitorIntroduccin al Lenguaje EnsambladorInstalar Visual C++ (o Visual Studio, cualquier versin).

Dentro de Visual Studio, crear un nuevo proyecto.

Seleccionar el tipo de proyecto Proyecto Vaco, de la plantilla General de Visual C++.

Poner nombre al proyecto, seleccionar ubicacin del mismo y pulsar el botn Aceptar.Proceso de ensamblado y ligadoEn la ventana del explorador de soluciones, pulsar con el botn derecho el nombre del proyecto recin creado.

Seleccionar la opcin Personalizaciones de compilacin del men contextual mostrado.

Seleccionar la opcin masm y pulsar el botn Aceptar.

Volver a mostrar el men contextual del proyecto y seleccionar la opcin de Propiedades

En la pestaa de Vinculador seleccionar la opcin Sistema. Escoger como Subsistema la opcin Console (/SUBSYSTEM:CONSOLE).

En la pestaa Microsoft MacroAssembler seleccionar la opcin Listing File. Proporcionar un nombre de archivo con extensin .lst en la casilla Assembled Code Listing File.

Pulsar el botn Aceptar.Proceso de ensamblado y ligadoEn la ventana del explorador de soluciones, pulsar con el botn derecho la opcin de Archivos de cdigo fuente.

Seleccionar la opcin de Agregar y Nuevo elemento del men contextual mostrado.

En la ventana de Agregar nuevo elemento seleccionar Archivo C++ (.cpp), e introduzca un nombre de archivo con extensin .asm.

Escribir el cdigo del programa fuente.

Pulsar el botn Depurador local de Windows (Nota: La pantalla de la consola se abre y se cierra porque se inicia y termina el programa de manera casi inmediata).

Ejecutar el archivo .EXE generado desde la ventana de la consola de Windows.Proceso de ensamblado y ligadoEscribir un programa en lenguaje ensamblador que muestre en la consola los datos generales de los dos integrantes del equipo.

Entregar archivo .lst impreso

Fecha:TareaEn la superficie, los programas en modo de consola de 32 bits se ven y se comportan como los programas de MS-DOS de 16 bits que se ejecutan en modo de texto.

No obstante, hay diferencias: los primeros se ejecutan en modo protegido de 32 bits, mientras que los programas de MS-DOS se ejecutan en modo de direccionamiento real.

Utilizan distintas bibliotecas de funciones. Los programas Win32 llaman a las funciones de la misma biblioteca que utilizan las aplicaciones Windows grficas. Los programas de MS-DOS utilizan interrupciones de BIOS y de MS-DOS que han existido desde la introduccin de la IBM-PC.

Una Interfaz de Programacin de Aplicaciones (API) es una coleccin de tipos, constantes y funciones que proporcionan la manera de manipular directamente los objetos a travs de la programacin. Por lo tanto, la API Win32 nos permite utilizar las funciones en la versin de 32 bits de MS-Windows.Programacin de la consola Win32Un programa de consola se ve y se comporta como una ventana de MS-DOS, con algunas mejoras que veremos ms adelante. La consola tiene un solo bfer de entrada y uno o ms bferes de pantalla:

El bfer de entrada contiene una cola de registros de entrada, cada uno de los cuales contiene datos acerca de un evento de entrada. Algunos ejemplos de eventos de entrada son: entrada del teclado, clics del ratn y cuando el usuario cambia el tamao de la ventana de consola.

Un bfer de pantalla es un arreglo bidimensional de datos de caracteres y colores, que afectan la apariencia del texto en la ventana de consola.AntecedentesAl llamar a las funciones en la API Win32, se utilizan dos tipos de conjuntos de caracteres: el conjunto de caracteres ASCII/ANSI de 8 bits y el conjunto Unicode de 16 bits (disponible en Windows NT, 2000 y XP).

Las funciones de Win32 que tienen que ver con texto, por lo general, se proporcionan en dos versiones, una que termina con la letra A (para los caracteres ANSI de 8 bits) y la otra que termina en W (para los conjuntos de caracteres extensos, incluyendo Unicode). Una de estas funciones es WriteConsole:

WriteConsoleA.WriteConsoleW.

Windows 95 o 98 no soporta los nombres de las funciones que terminan en W. Por otro lado, en Windows NT, 2000 y XP, Unicode es el conjunto de caracteres nativo. Por ejemplo, si llamamos a una funcin como WriteConsoleA, el sistema operativo convierte los caracteres de ANSI a Unicode y llama a WriteConsoleW.Conjuntos de caracteres y funciones de la API de WindowsHay dos niveles de acceso a la consola, que permiten concesiones entre simplicidad y un control completo:

Las funciones de consola de alto nivel leen un flujo de caracteres del bfer de entrada de la consola. Escriben datos tipo carcter al bfer de pantalla de la consola. Tanto la entrada como la salida puede redirigirse para leer o escribir en/desde archivos de texto.

Las funciones de consola de bajo nivel obtienen informacin detallada acerca de los eventos de teclado y de ratn, y las interacciones del usuario con la ventana de consola (arrastrar, cambiar tamao, etctera). Estas funciones tambin permiten un control detallado del tamao y la posicin de la ventana, as como los colores del texto.Acceso de alto y bajo nivelLas funciones Win32 se documentan usando las declaraciones de funciones para programadores de C/C++.

En estas declaraciones, los tipos de todos los parmetros de las funciones se basan en los tipos estndar de C o en uno de los tipos predefinidos de MS-Windows (en la siguiente tabla se muestra una lista parcial).

Es importante diferenciar los valores de datos de los apuntadores a los valores. El nombre de un tipo que empieza con las letras LP es un apuntador largo (long) a algn otro objeto.Tipos de datos de WindowsTipos de datos de WindowsTipo de MS-WindowsTipo de MASMDescripcinBOOL, BOOLEANDWORDUn valor booleano (TRUE o FALSE)BYTEBYTEUn entero de 8 bits sin signoCHARBYTEUn carcter ANSI de Windows de 8 bitsCOLORREFDWORDUn valor de 32 bits que se usa como valor de colorDWORDDWORDUn entero de 32 bits sin signoHANDLEDWORDManejador de un objetoHFILEDWORDManejador de un archivo abierto mediante OpenFileINTSDWORDUn entero de 32 bits con signoLONGSDWORDUn entero de 32 bits con signoLPARAMDWORDParmetro de mensaje, usado por los procedimientos de ventana y las funciones de devolucin de llamada (callback)LPCSTRPTR BYTEUn apuntador de 32 bits a una cadena constante con terminacin nula de caracteres Windows (ANSI) de 8 bitsLPCVOIDDWORDApuntador a una constante de cualquier tipoLPSTRPTR BYTEUn apuntador de 32 bits a una cadena con terminacin nula de caracteres Windows (ANSI) de 8 bitsLPCTSTRPTR WORDUn apuntador de 32 bits a una cadena de caracteres constante, que es portable para Unicode y los conjuntos de caracteres de doble byteLPTSTRPTR WORDUn apuntador de 32 bits a una cadena de caracteres que es portable para Unicode y los conjuntos de caracteres de doble byteLPVOIDDWORDUn apuntador de 32 bits a un tipo no especificadoLRESULTDWORDUn valor de 32 bits devuelto de un procedimiento de ventana o funcin de devolucin de llamada (callback)SIZE_TDWORDEl nmero mximo de bytes a los que puede apuntar un apuntadorUINTDWORDUn entero de 32 bits sin signoWNDPROCDWORDUn apuntador de 32 bits a un procedimiento de ventanaWORDWORDUn entero de 16 bits sin signoWPARAMDWORDUn valor de 32 bits que se pasa como parmetro a un procedimiento de ventana o funcin de devolucin de llamada (callback)Casi todas las funciones de consola de Win32 requieren recibir un manejador como primer argumento. Un manejador es un entero de 32 bits sin signo que identifica en forma nica a un objeto, como un mapa de bits, una pluma de dibujo o cualquier otro dispositivo de entrada/salida:

STD_INPUT_HANDLE entrada estndar (valor -10)STD_OUTPUT_HANDLE salida estndar (valor -11)STD_ERROR_HANDLE salida de error estndar (valor -12)

Los ltimos dos manejadores se utilizan al escribir en el bfer de pantalla activo de la consola.

La funcin GetStdHandle devuelve un manejador para un flujo de la consola: entrada, salida o salida de error. Necesitamos un manejador para poder realizar operaciones de entrada/salida en un programa basado en la consola.

La funcin devuelve el manejador en EAX, que debe copiarse a una variable por proteccin.Manejadores de consolaLa siguiente tabla contiene una referencia rpida al conjunto completo de funciones de consola Win32.

Las funciones de la API Win32 no preservan EAX, EBX, ECX y EDX, por lo que debemos resguardar estos registros por nuestra cuenta.Funciones de la consola Win32Funciones de la consola Win32FuncinDescripcinAllocConsoleAsigna una nueva consola para el proceso que hace la llamadaCreateConsoleScreenBufferCrea un bfer de pantalla de consolaExitProcessTermina un proceso y todos sus subprocesosFillConsoleOutputAttributeEstablece los atributos de texto y color de fondo para un nmero especificado de celdas de caracteresFillConsoleOutputCharacterEscribe un carcter en el bfer de pantalla, un nmero especificado de vecesFlushConsoleInputBufferVaca el bfer de entrada de la consolaFreeConsoleDesconecta el proceso que hizo la llamada de su consolaGenerateConsoleCtrlEventEnva una seal especificada a un grupo de proceso de control que comparte la consola asociada con el proceso que hizo la llamadaGetConsoleCPObtiene la pgina de cdigo de entrada utilizada por la consola asociada con el proceso que hizo la llamadaGetConsoleCursorInfoObtiene informacin acerca del tamao y la visibilidad del cursor para el bfer de pantalla de consola especificadoGetConsoleModeObtiene el modo de entrada actual del bfer de entrada de una consola, o el modo de salida actual de un bfer de pantalla de consolaGetConsoleOutputCPObtiene la pgina de cdigo de salida que utiliza la consola asociada con el proceso que hizo la llamadaGetConsoleScreenBufferInfoObtiene informacin acerca del bfer de pantalla de consola especificadoGetConsoleTitleObtiene la cadena de la barra de ttulo para la ventana de consola actualGetConsoleWindowObtiene el manejador de ventana utilizado por la consola asociada con el proceso que hizo la llamadaGetLargestConsoleWindowSizeObtiene el tamao de la ventana de consola ms grande posibleGetNumberOfConsoleInputEventsObtiene el nmero de registros de entrada no ledos en el bfer de entrada de la consolaGetNumberOfConsoleMouseButtonsObtiene el nmero de botones en el ratn, utilizados por la consola actualGetStdHandleObtiene un manejador para la entrada estndar, la salida estndar o el dispositivo de error estndarHandlerRoutineUna funcin definida por la aplicacin, que se utiliza con la funcin SetConsoleCtrlHandlerPeekConsoleInputLee datos del bfer de entrada de consola especificado, sin eliminarlos del bferFunciones de la consola Win32FuncinDescripcinReadConsoleLee la entrada de caracteres del bfer de entrada de la consola y la elimina del bferReadConsoleInputLee datos de un bfer de entrada de consola y los elimina del bferReadConsoleOutputLee los datos de los caracteres y atributos de color de un bloque rectangular de celdas de caracteres en un bfer de pantalla de consolaReadConsoleOutputAttributeCopia un nmero especificado de atributos de color de texto y de fondo, de las celdas consecutivas de un bfer de pantalla de consolaReadConsoleOutputCharacterCopia un nmero de caracteres de las celdas consecutivas de un bfer de pantalla de consolaScrollConsoleScreenBufferMueve un bloque de datos en un bfer de pantallaSetConsoleActiveScreenBufferEstablece el bfer de pantalla especificado para que sea el bfer de pantalla de consola que se muestra actualmenteSetConsoleCPEstablece la pgina de cdigo de entrada utilizada por la consola asociada con el proceso que hizo la llamadaSetConsoleCtrlHandlerAgrega o elimina una funcin HandlerRoutine definida por una aplicacin, de la lista de funciones manejadoras para el proceso que hizo la llamadaSetConsoleCursorInfoEstablece el tamao y la visibilidad del cursor para el bfer de pantalla de consola especificadoSetConsoleCursorPositionEstablece la posicin del cursor en el bfer de pantalla de consola especificadoSetConsoleModeEstablece el modo de entrada del bfer de entrada de una consola, o el modo de salida de un bfer de pantalla de consolaSetConsoleOutputCPEstablece la pgina de cdigo de salida utilizada por la consola asociada con el proceso que hizo la llamadaSetConsoleScreenBufferSizeModifica el tamao del bfer de pantalla de consola especificadoSetConsoleTextAttributeEstablece los atributos de color de texto y de fondo de los caracteres que se escriben en el bfer de pantallaSetConsoleTitleEstablece la cadena de la barra de ttulo para la ventana de consola actualSetConsoleWindowInfoEstablece el tamao y posicin actuales de la ventana de un bfer de pantalla de consolaSetStdHandleEstablece el manejador para la entrada estndar, la salida estndar o el dispositivo de error estndarWriteConsoleEscribe una cadena de caracteres en un bfer de pantalla de consola, empezando en la posicin actual del cursorWriteConsoleInputEscribe datos directamente en el bfer de entrada de consolaWriteConsoleOutputEscribe los datos de los caracteres y atributos de color en un bloque rectangular especificado de celdas de caracteres de un bfer de pantalla de consolaWriteConsoleOutputAttributeCopia un nmero de atributos de color de texto y de fondo en las celdas consecutivas de un bfer de pantalla de consolaWriteConsoleOutputCharacterCopia un nmero de caracteres en las celdas consecutivas de un bfer de pantalla de consolaFormatos de instruccinUn formato de instruccin define la descripcin en bits de una instruccin, en trminos de las distintas partes que la componen.

Un formato de instruccin debe contener un cdigo de operacin (cod-op) e implcita o explcitamente, ningn o algunos operandos.

Existen diversos tipos de formatos de instruccin en el 8086, que varan en longitud desde 1 hasta 6 bytes.Formatos de instruccin1.- Instruccin de 1 byte con operandos implcitos.COD-OPEjemplo:CLCFormatos de instruccin1.- Instruccin de 1 byte con operandos implcitos.COD-OPEjemplo:CLC11111000Formatos de instruccin2.- Instruccin de 1 byte modo registro.COD-OPREGEjemplo:DEC CXFormatos de instruccin2.- Instruccin de 1 byte modo registro.COD-OPREGEjemplo:DEC CX01001rrrFormatos de instruccin2.- Instruccin de 1 byte modo registro.COD-OPREGEjemplo:DEC CX01001rrr01001001Formatos de instruccin3.- Registro a registro.COD-OPdwmdregr/mEjemplo:MOV AX, CXFormatos de instruccin3.- Registro a registro.COD-OPdwmdregr/mEjemplo:MOV AX, CX100010dw mdregr/mCapacidad de DireccionamientoCdigo de Operacin.- El primer byte esta formado por tres campos:Codop.- Los primeros 6 bits forman el verdadero cdigo de la instruccin.D.- El bit D significa direccin. Cuando D = 1, el campo REG contiene el primer operando y el campo R/M contiene el segundo operando. Cuando D = 0, el campo REG contiene el segundo operando y el campo R/M contiene el primer operando.W.- El bit W significa el tamao o el ancho del operando (width). Si W = 1 el operando el de 16 o 32 bits. Si W = 0 el operando es de 8 bits.Mod r/m.- El segundo byte tambin esta formado por tres campos:Mod.- Los primeros dos bits son el campo MOD. Este campo selecciona el modo de direccionamiento y si hay desplazamiento en el modo seleccionado.REG.- Una referencia, de tres bits, a un registro.R/M.- Una referencia, de tres bits, a un registro o a memoria.Capacidad de DireccionamientoTabla 1.- Bits REGREGW = 0W = 1000ALAX001CLCX010DLDX011BLBX100AHSP101CHBP110DHSI111DHDITabla 2.- Los bits MD y R/MMODR/M00011011000M[BX + SI]M[BX + SI + DESP8]M[BX + SI + DESP16]AL o AX001M[BX + DI]M[BX + DI + DESP8]M[BX + DI + DESP16]CL o CX010M[BP + SI]M[BP + SI + DESP8]M[BP + SI + DESP16]DL o DX011M[BP + DI]M[BP + DI + DESP8]M[BP + DI + DESP16]BL o BX100M[SI]M[SI + DESP8]M[SI + DESP16]AH o SP101M[DI]M[DI + DESP8]M[DI + DESP16]CH o BP110Direc. DirectoM[BP + DESP8]M[BP + DESP16]DH o SI111M[BX]M[BX + DESP8]M[BX + DESP16]BH o DIFormatos de instruccin3.- Registro a registro.COD-OPdwmdregr/mEjemplo:MOV AX, CX100010dw mdregr/m10001001 1100100010001011 11000001Formatos de instruccin4.- Registro a/de memoria sin desplazamiento.COD-OPdwmdregr/mEjemplo:AND DL, [BX + SI]Formatos de instruccin4.- Registro a/de memoria sin desplazamiento.COD-OPdwmdregr/mEjemplo:AND DL, [BX + SI]001000dw mdregr/mFormatos de instruccin4.- Registro a/de memoria sin desplazamiento.COD-OPdwmdregr/mEjemplo:AND DL, [BX + SI]001000dw mdregr/m00100010 00010000Formatos de instruccin5.- Registro a/de memoria con desplazamiento.COD-OPdwmdregr/mP.B. Desp.P.A. Desp.Ejemplo:SUB AL, [BX + 1234H]Formatos de instruccin5.- Registro a/de memoria con desplazamiento.COD-OPdwmdregr/mP.B. Desp.P.A. Desp.Ejemplo:SUB AL, [BX + 1234H]001010dw mdregr/m desp despFormatos de instruccin5.- Registro a/de memoria con desplazamiento.COD-OPdwmdregr/mP.B. Desp.P.A. Desp.Ejemplo:SUB AL, [BX + 1234H]001010dw mdregr/m desp desp00101010 10000111 00110100 00010010Formatos de instruccin6.- Operando inmediato para registro.COD-OPswmdcodr/mP.B. DatoP.A. DatoEjemplo:ADC CX, 0FD81HFormatos de instruccin6.- Operando inmediato para registro.COD-OPswmdcodr/mP.B. DatoP.A. DatoEjemplo:ADC CX, 0FD81H100000sw md010r/m dato datoFormatos de instruccin6.- Operando inmediato para registro.COD-OPswmdcodr/mP.B. DatoP.A. DatoEjemplo:ADC CX, 0FD81H100000sw md010r/m dato dato10000001 11010001 10000001 11111101Formatos de instruccin7.- Operando inmediato a memoria con 16 bits de desplazamiento.COD-OPswmdcodr/mP.B. Desp.P.A. Desp.P.B. DatoP.A. DatoEjemplo:OR [BX + SI + 2000H], 2345HFormatos de instruccin7.- Operando inmediato a memoria con 16 bits de desplazamiento.COD-OPswmdcodr/mP.B. Desp.P.A. Desp.P.B. DatoP.A. DatoEjemplo:OR [BX + SI + 2000H], 2345H100000sw md001r/m desp desp dato datoFormatos de instruccin7.- Operando inmediato a memoria con 16 bits de desplazamiento.COD-OPswmdcodr/mP.B. Desp.P.A. Desp.P.B. DatoP.A. DatoEjemplo:OR [BX + SI + 2000H], 2345H100000sw md001r/m desp desp dato dato10000001 10001000 00000000 00100000 01000101 00100011Obtener la representacin en bits de las siguientes instrucciones:

AAACBWHLTINC AXPOPBXPUSHSIADDAL, BLCMPCX, SIORCL, BLSUB[BX], CLADC[DI], DXCMPDL, [SI]SBB[SI + 1234H], CLXOR[DI + 56H], DXANDBL, [SI + 78H]CMPAL, 0FFHMOVCX, 1234HORSI, 5678HADC[BX + DI + 12H], 0FFEEHSUB[BP + SI + 9876H], 0AHEjercicios