Unidad I Introducción Al Lenguaje Ensamblador

Descargar como pptx, pdf o txt
Descargar como pptx, pdf o txt
Está en la página 1de 125

Instituto Tecnolgico de Culiacn

Ing. en Sistemas
Computacionales
Lenguajes de Interfaz
Unidad I: Introduccin al Lenguaje Ensamblador

Introduccin al Lenguaje
Ensamblador
Importancia de la programacin en lenguaje
ensamblador.
El procesador y sus registros internos
La memoria principal (RAM)
El concepto de interrupciones
Llamadas a servicios del sistema
Modos de direccionamiento
Proceso de ensamblado y ligado
Desplegado de mensajes en el monitor

Introduccin al Lenguaje
Ensamblador

Importancia de la programacin en lenguaje


ensamblador.

Importancia de la Programacin
en Lenguaje Ensamblador
Lenguaje 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
Ensamblador
Muchos
dispositivos
programables
(como
los
microcontroladores) aun
cuentan con el lenguaje
ensamblador como la nica manera de ser manipulados.

Caractersticas
El 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.

Caractersticas
Los 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.

Ensamblador
Un 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 Ensamblador
Un 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 Ensamblador
La 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 Ensamblador
El 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 Ensamblador
A 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 Ensamblador
Los 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 Ensamblador
Cada 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 Ensamblador
Pueden 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 Aplicaciones
La 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 Aplicaciones
En 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 Aplicaciones
Asimismo 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 Aplicaciones
En 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 Ensambladores
Nos 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 fase


Ensambladores de dos fases
Microensambladores
Macroensabladores
Ensambladores residentes
Ensambladores cruzados

Tipos de Ensambladores

Ensambladores 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 Ensambladores

Microensambladores: 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 Ensambladores

Ensambladores 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.

Introduccin al Lenguaje
Ensamblador

El procesador y sus registros internos

El microprocesador
El 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 subprocesadores. 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 microprocesador
La 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 Lgica


Es 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 ejecucin
Es 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 8086


Los 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
general
Los 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
general
AX, 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 ndices


Aunque 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 ndices


SP (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 segmento
Los 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 segmento
CS (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 varios
IP (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 estado
C (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 estado
Z (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 control
T (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

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:
Manuscrita
Equipo de 2 integrantes

Introduccin al Lenguaje
Ensamblador

La memoria principal (RAM)

Memoria Principal
La 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.

Modos de operacin

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).

Administracin de
memoria

Los 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
memoria

En 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 XP

Modo de direccionamiento
real

En 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
real

Modo 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.

Clculo de direcciones lineales de 20


bits

Una 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 segmentodesplazamiento 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


bits

La 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 0
Se suma el desplazamiento:
0 1 0 0
Direccin lineal:0 9 0 1 0

Clculo de direcciones lineales de 20


bits

Un 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.

Calculo 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 cdigo
CS * 10H + IP
Direccin de datos
DS * 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 = 1234H
DS = F32EH
BP = 4125H
SS = 0321H
SI = 68ADH
Desp16 = 2140H
DI = 1F3C
a) Registro indirecto
b) 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]

Modo protegido

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.

Modelo de segmentacin
plano

En 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
plano

Modelo 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 varios
segmentos

En 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
segmentos

Paginacin

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.

Paginacin

Cuando 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.

Introduccin al Lenguaje
Ensamblador

El concepto de interrupciones
Llamadas a servicios del sistema

El concepto de
interrupciones
Las 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
real
La 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
real

Interrupcin.- 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
real

Nmero 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 real
Para que una interrupcin pueda ser servida o atendida por el
procesador, es necesario que se ejecuten una serie de pasos:

1.
Terminar de ejecutar la instruccin actual en proceso.
2.
Meter en el stack el registro de banderas.
3.
Meter en el stack la direccin del segmento de la prxima
instruccin a ejecutar (CS).
4.
Meter en el stack el desplazamiento de la prxima instruccin
a ejecutar (IP).
5.
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.
6.
Iniciar la ejecucin del manejador de interrupciones.

Ejecucin de interrupciones en
modo real
Todos los manejadores de interrupciones terminan con la
instruccin IRET.
Despus de ejecutar la instruccin IRET se ejecutan los
siguientes pasos:

7.
Recuperar el valor del registro IP desde la pila.
8.
Recuperar el valor del registro CS desde la pila.
9.
Recuperar el valor del registro de banderas desde la
pila.
10. Continua la ejecucin de la siguiente instruccin del
programa.

Interrupciones en modo
protegido

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
protegido

Interrupciones 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.

Llamadas a servicios del


sistema

Las 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 esperar

Llamadas a servicios del


sistema

A 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 mediante


interrupciones
Se 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


interrupciones
INT
INT
INT
INT
INT
INT
INT

20H
05H
10H
19H
00H
04H
02H

Termina el programa y regresa al DOS.


Imprime la pantalla (PrintScr).
Ejecuta un BASIC rudimentario.
Inicializa la computadora (Reboot).
Divisin por cero.
Checa por overflow (INTO).
Interrupcin no mascarable.

Llamadas a servicios mediante


interrupciones
INT 21H

Provee funciones para la entrada/salida.

Funcin (AH) Servicio


30H
Accesa la versin del DOS que est instalada.
AL=Parte entera. AH=Parte fraccionaria.
Ej.- V. 5.0 AL = 5 y AH = 0.
2AH

Accesa 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


interrupciones
2BH

01H
02H
05H
09H
0AH

Coloca en el sistema la fecha definida en los


registros:
CX = Define el ao.
DH = Define el mes.
DL = Define el da.
Lee un carcter ASCII y lo almacena en AL.
Despliega el carcter ASCII definido en DL.
Imprime el carcter ASCII definido en DL
(impresora).
Despliega un string terminado en $.
Lee un string del teclado.

Llamadas a servicios mediante


interrupciones
INT 10H

Provee servicios de pantalla.

Funcin
Servicio
AH = 02H y Coloca el cursor en DH (rengln) y DL (columna).
BH = 00H
AH = 06H y Borra la parte de la pantalla definida en CH,
CL
BH = 07H (punto inicial) y DH, DL (punto final)

Modos de
direccionamiento
Los 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
direccionamiento
Direccionamiento 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
direccionamiento
Direccionamiento 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.

Introduccin al Lenguaje
Ensamblador

Proceso de ensamblado y ligado

Desplegado de mensajes en el monitor

Proceso de ensamblado y ligado

Instalar Visual C++ (o Visual Studio, cualquier


versin).

Dentro de
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.

Visual

Studio,

crear

un

nuevo

Proceso de ensamblado y ligado

En 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 ligado

En 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.

Tarea

Escribir
un
programa
en
lenguaje
ensamblador que muestre en la consola los
datos generales de los dos integrantes del
equipo.

Entregar archivo .lst impreso

Fecha:

Programacin de la consola
Win32

En 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 MSDOS 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 MSWindows.

Antecedentes

Un 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.

Conjuntos de caracteres y
funciones de la API de Windows

Al 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.

Acceso de alto y bajo nivel

Hay 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.

Tipos de datos de Windows

Las 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 Windows


Tipo de MSWindows
BOOL,
BOOLEAN
BYTE
CHAR
COLORREF
DWORD
HANDLE
HFILE
INT
LONG
LPARAM

Tipo de
MASM
DWORD

Descripcin

BYTE
BYTE
DWORD
DWORD
DWORD
DWORD
SDWORD
SDWORD
DWORD

LPCSTR

PTR BYTE

LPCVOID
LPSTR

DWORD
PTR BYTE

LPCTSTR

PTR WORD

Un entero de 8 bits sin signo


Un carcter ANSI de Windows de 8 bits
Un valor de 32 bits que se usa como valor de color
Un entero de 32 bits sin signo
Manejador de un objeto
Manejador de un archivo abierto mediante OpenFile
Un entero de 32 bits con signo
Un entero de 32 bits con signo
Parmetro de mensaje, usado por los procedimientos de ventana y las funciones de
devolucin de llamada (callback)
Un apuntador de 32 bits a una cadena constante con terminacin nula de caracteres
Windows (ANSI) de 8 bits
Apuntador a una constante de cualquier tipo
Un apuntador de 32 bits a una cadena con terminacin nula de caracteres Windows
(ANSI) de 8 bits
Un apuntador de 32 bits a una cadena de caracteres constante, que es portable para
Unicode y los conjuntos de caracteres de doble byte

LPTSTR

PTR WORD

Un apuntador de 32 bits a una cadena de caracteres que es portable para Unicode y


los conjuntos de caracteres de doble byte

LPVOID
LRESULT

DWORD
DWORD

SIZE_T

DWORD

Un apuntador de 32 bits a un tipo no especificado


Un valor de 32 bits devuelto de un procedimiento de ventana o funcin de
devolucin de llamada (callback)
El nmero mximo de bytes a los que puede apuntar un apuntador

UINT
WNDPROC
WORD
WPARAM

DWORD
DWORD
WORD
DWORD

Un valor booleano (TRUE o FALSE)

Un entero de 32 bits sin signo


Un apuntador de 32 bits a un procedimiento de ventana
Un entero de 16 bits sin signo
Un valor de 32 bits que se pasa como parmetro a un procedimiento de ventana o
funcin de devolucin de llamada (callback)

Manejadores de consola

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.

Funciones de la consola
Win32

La 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
Win32
Funcin
AllocConsole
CreateConsoleScreenBuffer
ExitProcess
FillConsoleOutputAttribute

Descripcin
Asigna una nueva consola para el proceso que hace la llamada
Crea un bfer de pantalla de consola
Termina un proceso y todos sus subprocesos
Establece los atributos de texto y color de fondo para un nmero especificado de
celdas de caracteres
FillConsoleOutputCharacter Escribe un carcter en el bfer de pantalla, un nmero especificado de veces
FlushConsoleInputBuffer
Vaca el bfer de entrada de la consola
FreeConsole
Desconecta el proceso que hizo la llamada de su consola
GenerateConsoleCtrlEvent
Enva una seal especificada a un grupo de proceso de control que comparte la
consola asociada con el proceso que hizo la llamada
GetConsoleCP
Obtiene la pgina de cdigo de entrada utilizada por la consola asociada con el
proceso que hizo la llamada
GetConsoleCursorInfo
Obtiene informacin acerca del tamao y la visibilidad del cursor para el bfer de
pantalla de consola especificado
GetConsoleMode
Obtiene el modo de entrada actual del bfer de entrada de una consola, o el modo de
salida actual de un bfer de pantalla de consola
GetConsoleOutputCP
Obtiene la pgina de cdigo de salida que utiliza la consola asociada con el proceso
que hizo la llamada
GetConsoleScreenBufferInf Obtiene informacin acerca del bfer de pantalla de consola especificado
o
GetConsoleTitle
Obtiene la cadena de la barra de ttulo para la ventana de consola actual
GetConsoleWindow
Obtiene el manejador de ventana utilizado por la consola asociada con el proceso que
hizo la llamada
GetLargestConsoleWindow Obtiene el tamao de la ventana de consola ms grande posible
Size
GetNumberOfConsoleInputE Obtiene el nmero de registros de entrada no ledos en el bfer de entrada de la
vents
consola
GetNumberOfConsoleMouse Obtiene el nmero de botones en el ratn, utilizados por la consola actual
Buttons
GetStdHandle
Obtiene un manejador para la entrada estndar, la salida estndar o el dispositivo de
error estndar
HandlerRoutine
Una funcin definida por la aplicacin, que se utiliza con la funcin
SetConsoleCtrlHandler
PeekConsoleInput
Lee datos del bfer de entrada de consola especificado, sin eliminarlos del bfer

Funciones de la consola
Win32
Funcin
ReadConsole
ReadConsoleInput
ReadConsoleOutput

Descripcin
Lee la entrada de caracteres del bfer de entrada de la consola y la elimina del bfer
Lee datos de un bfer de entrada de consola y los elimina del bfer
Lee los datos de los caracteres y atributos de color de un bloque rectangular de celdas de
caracteres en un bfer de pantalla de consola
ReadConsoleOutputAttr Copia un nmero especificado de atributos de color de texto y de fondo, de las celdas
ibute
consecutivas de un bfer de pantalla de consola
ReadConsoleOutputCha Copia un nmero de caracteres de las celdas consecutivas de un bfer de pantalla de
racter
consola
ScrollConsoleScreenBu Mueve un bloque de datos en un bfer de pantalla
ffer
SetConsoleActiveScreen Establece el bfer de pantalla especificado para que sea el bfer de pantalla de consola
Buffer
que se muestra actualmente
SetConsoleCP
Establece la pgina de cdigo de entrada utilizada por la consola asociada con el proceso
que hizo la llamada
SetConsoleCtrlHandler Agrega o elimina una funcin HandlerRoutine definida por una aplicacin, de la lista de
funciones manejadoras para el proceso que hizo la llamada
SetConsoleCursorInfo
Establece el tamao y la visibilidad del cursor para el bfer de pantalla de consola
especificado
SetConsoleCursorPositi Establece la posicin del cursor en el bfer de pantalla de consola especificado
on
SetConsoleMode
Establece el modo de entrada del bfer de entrada de una consola, o el modo de salida de
un bfer de pantalla de consola
SetConsoleOutputCP
Establece la pgina de cdigo de salida utilizada por la consola asociada con el proceso
que hizo la llamada
SetConsoleScreenBuffer Modifica el tamao del bfer de pantalla de consola especificado
Size
SetConsoleTextAttribut Establece los atributos de color de texto y de fondo de los caracteres que se escriben en el
e
bfer de pantalla
SetConsoleTitle
Establece la cadena de la barra de ttulo para la ventana de consola actual
SetConsoleWindowInfo Establece el tamao y posicin actuales de la ventana de un bfer de pantalla de consola
SetStdHandle
Establece el manejador para la entrada estndar, la salida estndar o el dispositivo de
error estndar
WriteConsole
Escribe una cadena de caracteres en un bfer de pantalla de consola, empezando en la
posicin actual del cursor
WriteConsoleInput
Escribe datos directamente en el bfer de entrada de consola

Formatos de instruccin
Un 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 instruccin
1.- Instruccin de 1 byte con operandos implcitos.
COD-OP
Ejemplo:

CLC

Formatos de instruccin
1.- Instruccin de 1 byte con operandos implcitos.
COD-OP
Ejemplo:

CLC

11111000

Formatos de instruccin
2.- Instruccin de 1 byte modo registro.
COD-OP
Ejemplo:

DEC CX

REG

Formatos de instruccin
2.- Instruccin de 1 byte modo registro.
COD-OP
Ejemplo:

DEC CX

01001rrr

REG

Formatos de instruccin
2.- Instruccin de 1 byte modo registro.
COD-OP
Ejemplo:

DEC CX

01001rrr
01001001

REG

Formatos de instruccin
3.- Registro a registro.
CODOP
Ejemplo:

d w
MOV AX, CX

m
d

re
g

r/
m

Formatos de instruccin
3.- Registro a registro.
CODOP
Ejemplo:

d w

m
d

MOV AX, CX

100010dw mdregr/m

re
g

r/
m

Capacidad de
Direccionamiento
Cdigo 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
Direccionamiento
Tabla 1.- Bits REG
REG
W=0
000
AL
001
CL
010
DL
011
BL
100
AH
101
CH
110
DH
111
DH

W=1
AX
CX
DX
BX
SP
BP
SI
DI

Tabla 2.- Los bits MD y R/M


MOD

000
001
010
R/M
011
100
101
110
111

00

01

10

11

M[BX + SI]
M[BX + DI]
M[BP + SI]
M[BP + DI]
M[SI]
M[DI]
Direc. Directo
M[BX]

M[BX + SI + DESP8]
M[BX + DI + DESP8]
M[BP + SI + DESP8]
M[BP + DI + DESP8]
M[SI + DESP8]
M[DI + DESP8]
M[BP + DESP8]
M[BX + DESP8]

M[BX + SI + DESP16]
M[BX + DI + DESP16]
M[BP + SI + DESP16]
M[BP + DI + DESP16]
M[SI + DESP16]
M[DI + DESP16]
M[BP + DESP16]
M[BX + DESP16]

AL o AX
CL o CX
DL o DX
BL o BX
AH o SP
CH o BP
DH o SI
BH o DI

Formatos de instruccin
3.- Registro a registro.
CODOP
Ejemplo:

d w

m
d

MOV AX, CX

100010dw mdregr/m
10001001 11001000
10001011 11000001

re
g

r/
m

Formatos de instruccin
4.- Registro a/de memoria sin desplazamiento.
CODOP
Ejemplo:

d w

m
d

re
g

AND DL, [BX + SI]

r/
m

Formatos de instruccin
4.- Registro a/de memoria sin desplazamiento.
CODOP
Ejemplo:

d w

m
d

re
g

AND DL, [BX + SI]

001000dw mdregr/m

r/
m

Formatos de instruccin
4.- Registro a/de memoria sin desplazamiento.
CODOP
Ejemplo:

d w

m
d

re
g

AND DL, [BX + SI]

001000dw mdregr/m
00100010 00010000

r/
m

Formatos de instruccin
5.- Registro a/de memoria con desplazamiento.
CODOP
Ejemplo:

d w

m
d

re
g

r/
m

P.B.
Desp.

SUB AL, [BX + 1234H]

P.A.
Desp.

Formatos de instruccin
5.- Registro a/de memoria con desplazamiento.
CODOP

d w

Ejemplo:

m
d

re
g

r/
m

P.B.
Desp.

SUB AL, [BX + 1234H]

001010dw mdregr/m desp

desp

P.A.
Desp.

Formatos de instruccin
5.- Registro a/de memoria con desplazamiento.
CODOP

d w

Ejemplo:

m
d

re
g

r/
m

P.B.
Desp.

P.A.
Desp.

SUB AL, [BX + 1234H]

001010dw mdregr/m desp

desp

00101010 10000111 00110100 00010010

Formatos de instruccin
6.- Operando inmediato para registro.
CODOP
Ejemplo:

s w

m
d

co
d

r/
m

ADC CX, 0FD81H

P.B.
Dato

P.A. Dato

Formatos de instruccin
6.- Operando inmediato para registro.
CODOP

s w

Ejemplo:

m
d

co
d

r/
m

P.B.
Dato

ADC CX, 0FD81H

100000sw md010r/m dato

dato

P.A. Dato

Formatos de instruccin
6.- Operando inmediato para registro.
CODOP

s w

Ejemplo:

m
d

co
d

r/
m

P.B.
Dato

P.A. Dato

ADC CX, 0FD81H

100000sw md010r/m dato

dato

10000001 11010001 10000001 11111101

Formatos de instruccin
7.- Operando inmediato a memoria con 16 bits de desplazamiento.
CODOP

Ejemplo:

md

co
d

r/
m

P.B.
Desp.

P.A.
Desp.

OR [BX + SI + 2000H], 2345H

P.B.
Dato

P.A.
Dato

Formatos de instruccin
7.- Operando inmediato a memoria con 16 bits de desplazamiento.
CODOP

Ejemplo:

md

co
d

r/
m

P.B.
Desp.

P.A.
Desp.

P.B.
Dato

OR [BX + SI + 2000H], 2345H

100000sw md001r/m desp desp dato

dato

P.A.
Dato

Formatos de instruccin
7.- Operando inmediato a memoria con 16 bits de desplazamiento.
CODOP

Ejemplo:

md

co
d

r/
m

P.B.
Desp.

P.A.
Desp.

P.B.
Dato

P.A.
Dato

OR [BX + SI + 2000H], 2345H

100000sw md001r/m desp desp dato


10000001 10001000
00100011

00000000

dato

00100000 01000101

Ejercicios

Obtener la representacin en bits de las siguientes instrucciones:

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.

AAA
CBW
HLT
INC AX
POP BX
PUSH SI
ADD AL, BL
CMP CX, SI
OR CL, BL
SUB [BX], CL
ADC [DI], DX
CMP DL, [SI]
SBB [SI + 1234H], CL
XOR [DI + 56H], DX
AND BL, [SI + 78H]
CMP AL, 0FFH
MOV CX, 1234H
OR SI, 5678H
ADC [BX + DI + 12H], 0FFEEH
SUB [BP + SI + 9876H], 0AH

También podría gustarte