0% encontró este documento útil (0 votos)
76 vistas19 páginas

Unidad 1

El documento introduce el lenguaje ensamblador, explicando que 1) el microprocesador ejecuta instrucciones a bajo nivel para realizar operaciones lógicas y de acceso a memoria, 2) escribir programas en lenguaje ensamblador requiere conocer la arquitectura del hardware, y 3) los programas en ensamblador requieren menos memoria y tiempo de ejecución que los de alto nivel.

Cargado por

Luis Torres
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
76 vistas19 páginas

Unidad 1

El documento introduce el lenguaje ensamblador, explicando que 1) el microprocesador ejecuta instrucciones a bajo nivel para realizar operaciones lógicas y de acceso a memoria, 2) escribir programas en lenguaje ensamblador requiere conocer la arquitectura del hardware, y 3) los programas en ensamblador requieren menos memoria y tiempo de ejecución que los de alto nivel.

Cargado por

Luis Torres
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

INTRODUCCIÓN AL LENGUAJE ENSAMBLADOR.

El corazón de una computadora es el microprocesador, éste maneja las operaciones áritmeticas y


lógicas de la computadora.

Tiene su origen el los sesenta, cuando se diseño el circuito integrado (IC Integrated Circuit), al combinar
componentes electrónicos en un chip de silício.

El microprocesador está diseñado para ejecutar programas, es decir ejecuta instrucciones (operación
aritmético-lógica, de control y de comunicación con el resto de los componentes integrados que
conforman un PC) que se le dan a las computadoras a muy bajo nivel (0 y 1) haciendo operaciones
lógicas básicas como sumar, restar, multiplicar, dividir, lógicas binarias y acceso a memoria; siguiendo el modelo base de Von
Neumann. La arquitectura de Von Neumann es una familia de arquitecturas que utiliza el mismo dispositivo de almacenamiento
tanto para las instrucciones como para los datos. El Microprocesador funciona como la Unidad Central de Proceso (CPU – Central
Procesing Unit), ella está constituida por registros, la unidad de control y la unidad aritmético-lógica. En el microprocesador se
procesan todas las acciones de la computadora.

Este dispositivo se ubica en un zócalo especial en la placa o tarjeta madre y dispone para su buen funcionamiento de un sistema
de enfriamiento que utiliza ventilador, puesto que pueden disipar hasta 100 vatios de forma contínua.

Su velocidad es medida por la cantidad de operaciones por segundo que puede realizar, también llamada frecuencia de reloj. La
frecuencia de reloj se mide en megahertz (MHz) o gigahertz (GHz). Es decir por la cantidad de operaciones por ciclo de reloj que
puede realizar y en los ciclos por segundo que desarrolla en microprocesador. El ancho de banda (bandwidth) mide el número de
bits procesados en una sola instrucción.

Una computadora puede estar soportada por uno o varios microprocesadores, y un microprocesador puede soportar uno o varios
terminales (redes). Un núcleo suele referirse a una porción del procesador que realiza todas las actividades de una CPU real. La
tendencia en los últimos años ha sido la de integrar más núcleos dentro de un mismo empaque, además de componentes como
memorias cache y controladores de memoria, elementos que antes estaban montados sobre la placa base como dispositivos
individuales.

Algunos datos historicos ...

 A principios de los años setenta Intel introdujo el chip 8008 el cual, instalado en una computadora terminal, acompañó a la
primera generación de microprocesadores.

 En 1974 el 8008 evolucionó en el 8080, un popular microprocesador de la segunda generación para propósitos generales.

 En 1978 Intel produjo la tercera generación de procesadores 8086, para proporcionar alguna compatibilidad con el 8080 y que
representan un avance significativo de diseño.

 Después, Intel desarrolló una variación del 8086 para ofrecer un diseño ligeramente más sencillo y compatibilidad con los
dispositivos de entrada/salida de ese momento. Procesador 8088 / 80188: Estos procesadores tienen registros de 16 bits y
un bus de datos de 8 bits, y pueden direccionar hasta un millón de bytes en memoria interna. Los registros pueden procesar
dos bytes al mismo tiempo, mientras que el bus de datos sólo puede transferir un byte a la vez.
El 80188 es un 8088 con mayor potencia. Ambos procesadores corren en lo que se conoce como modo real, esto es, un
programa a la vez.
Este nuevo procesador, el 8088, fue seleccionado por IBM para su computadora personal en 1981.

 Una versión mejorada del 8088 es el 80188, y versiones mejoradas del 8086 son los 80186, 80286, 80386, 80486 y el
Pentium (también conocido como P5), cada uno de ellos permite operaciones adicionales y más procesamiento.
El Procesador 80186 es similar al 8088/80188, pero tienen un bus de datos de 16 bits y corren más rápido. El 80186 es un
8086 más potente con unas cuantas instrucciones adicionales.

80286. Este procesador puede correr más rápido que los anteriores y direcciona hasta 16 millones de bytes. Puede correr en
modo real o en modo protegido para multitareas.

80386. Este procesador tiene registros de 32 bits y un bus de datos de 32 bits, y puede direccionar hasta cuatro mil millones
de bytes en memoria. Puede correr en modo real o en modo protegido para multitareas.

80486. Este procesador también tiene registros de 32 bits y un bus de datos de 32 bits (aunque algunos clones tienen un bus
de datos de 16 bits) y está diseñado para mejorar el desempeño. Puede correr en modo real o en modo protegido para
multitareas.

Pentium (o P5). Este procesador tiene registros de 32 bits, un bus de datos de 64 bits y puede ejecutar más de una
instrucción por ciclo de reloj. (Intel adoptó el nombre "Pentium" porque, a diferencia de los números, los nombres pueden
tener derechos reservados.
La variedad de microcomputadoras también ocasionó
un renovado interés en el lenguaje ensamblador, cuyo
uso con lleva diferentes ventajas:

 Un programa escrito en lenguaje ensamblador


requiere considerablemente menos memoria y
tiempo de ejecución que un programa escrito
en los conocidos como lenguajes de alto nivel,
como Pascal y C.

 El lenguaje ensamblador da a un programador


la capacidad de realizar tareas muy técnicas
que serían difíciles, si no es que imposibles
de realizar en un lenguaje de alto nivel.

 El conocimiento del lenguaje ensamblador


permite una comprensión de la arquitectura de la máquina que ningún lenguaje de alto nivel puede ofrecer.

 Los programas residentes y rutinas de servicio de interrupción casi siempre son desarrollados en lenguaje ensamblador.

Los lenguajes de alto nivel fueron diseñados para eliminar las particularidades de una computadora específica, mientras que un
lenguaje ensamblador está diseñado para una computadora específica, o, de manera más correcta, para una familia específica de
microprocesadores.

El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la
representación más directa del código máquina específico para cada arquitectura de microprocesador

Requisitos para Aprender Lenguaje Ensamblador de la PC:

 Acceso a una computadora personal de IBM (cualquier modelo) o una compatible.

 Copia del sistema operativo ms-dos o pc-dos (versión reciente) y estar familiarizado con su uso.

 Copia de un programa ensamblador (versión reciente). Las versiones de Microsoft son conocidas como MASM y
QuickAssembler: TASM es de Borland y OPTASM es de System.

 Existen varios programas ensalmador en el mercado, podemos encontrar desde el TASM (Turbo Assembler), el MASM
(Microsoft Assembler), el GAS (GNU Assembler) hasta el NASM (Netwide Assembler) y muchos otros más.

SISTEMAS OPERATIVOS

Propósitos principales de un sistema operativo:

 Permitir a los usuarios instruir a una computadora con respecto a las acciones que debe tomar (como ejecutar un
programa en particular, imprimir un documento, abrir el navegador de internet).

 Gestionar los dispositivos de Entrada y Salida.

 Facilitar los medios de almacenamiento de la información en disco ("catalogar") y de tener acceso a la misma.

 El sistema operativo más común para la PC y sus compatibles es el MS-DOS de Microsoft, conocido como PC-DOS en la
IBM PC. Hoy en día reemplazado por MS Windows.

 Cada una de las versiones del DOS ha proporcionado características adicionales que han extendido las capacidades de
la PC.
 Otros ejemplos de sistemas operativo son UNIX, OS/2, LINUX, OSX para computadoras personales. Android y IOS para
móviles.

1.1 Importancia de la Programación en


Lenguanje Ensamblador.

La importancia del lenguaje ensamblador es principalmente que se trabaja directamente con el microprocesador; por lo cual se
debe de conocer el funcionamiento interno de este, tiene la ventaja de que en el se puede realizar cualquier tipo de programas que
en los lenguajes de alto nivel no pueden realizar y que tienen que ver con control de memoria y registros internos del sistema
operativo, interrupciones en el sistema. Los programas en ensamblador ocupan menos espacio en memoria.

1.2 El Procesador y sus Registros Internos.

Escribir un programa en lenguaje ensamblador requiere de conocimientos acerca del hardware (arquitectura) de la computadora,
su conjunto de instrucciones y sus reglas de uso.

Los bloques fundamentales de información de una computadora son los bits y los bytes. Éstos proporcionan los medios por los
cuales la computadora puede representar datos e instrucciones en la memoria.

Un número binario no está limitado a 8 bits. Un procesador que utiliza una arquitectura de 16 bits (o de 32 bits) maneja

de manera automática números de 16 bits (o de 32 bits).

Para 16 bits: 216 - 1, da valores hasta 65,535


Para 32 bits: 232 - 1, proporciona valores hasta 4,294,967,295.

La paridad requiere que el número de bits encendidos en cada byte siempre sea impar. Puesto que la letra A contiene
dos bits encendidos, para forzar la paridad impar el procesador establece de forma automática su bit de paridad en
encendido (01000001-1). De forma similar, puesto que el asterisco tiene tres bits encendidos, para mantener la paridad
impar el procesador establece el bit de paridad en apagado (00101010-0). Cuando una instrucción hace referencia a un
byte en memoria interna, el procesador verifica su paridad. Si su paridad es par, el sistema supone que un bit está
"perdido" y exhibe un mensaje 0 de error. Un error de paridad puede ser resultado de una falla en el hardware o un
trastorno eléctrico; de cualquier forma, es un acontecimiento raro.

A un grupo de uno o más bytes que definen un valor particular se le conoce comúnmente como campo. La computadora
también emplea ciertos tamaños que le son naturales:

Palabra. Un campo de 2 bytes (16 bits). Los bits en una palabra son numerados desde 0 hasta 15, de derecha a
izquierda
 Palabra doble. Un campo de 4 bytes (32 bits).
 Palabra cuádruple. Un campo de 8 bytes (64 bits).
 Párrafo. Un campo de 16 bytes (128 bits).
 Kilobyte (KB). El número 210 es igual a 1024, el cual pasa a ser el valor de K, por kilobytes. Una computadora con
una memoria de 640K tiene 640 x 1024, o 655,360 bytes.
 Megabyte (MB). El número 220 es igual a 1,048,576, o un megabyte.

Aritmetica Binaria.

La microcomputadora realiza aritmética en formato binario y procesa miles de sumas y restas en micras de segundos.
Como programadores en Lenguaje ensamblador tenemos que estar familiarizados con el formato binario y a suma
binaria.

Los números binarios anteriores son todos positivos, porque en cada


uno el último bit de la izquierda es un cero. Un número binario
negativo tiene un 1 en el bit de la izquierda. Sin embargo, no es tan
simple como cambiar el bit de la izquierda 1, ejemplo:

01000001 (+65) ---> 11000001 (este número no es -65)

Un valor negativo se expresa en notación de complemento a dos; esto es, para representar un número binario como
negativo la regla es: invertir los bits y sumar 1.

Los elementos principales de hardware interno de la computadora son:

 microprocesador
 memoria
 registros
Elementos de hardware externo:
Dispositivos de entrada/ salida (teclado, monitor y el disco)

El software consta de diversos programas y archivos de datos (incluyendo al sistema operativo) almacenados en el disco. Para
ejecutar (o correr) un programa, el sistema lo copia del disco a la memoria interna. El microprocesador ejecuta las instrucciones del
programa, y los registros manejan la aritmética, movimiento de datos y el direccionamiento.

Un programa en lenguaje ensamblador consiste en uno o más segmentos para definir datos y almacenar instrucciones de
máquina y un segmento llamado stack (o pila) que contiene direcciones almacenadas.

El procesador se divide en dos unidades lógicas:


1. Unidad de Ejecución (EU)
2. Unidad de Interfaz del Bus (BIU)

EU su función es ejecutar las instrucciones. contiene:


 Unidad aritmé tico-lógica (ALU).
 Unidad de control (CU).
 Registros.

Estos elementos ejecutan instrucciones y operaciones aritméticas y


lógicas.

BIU envía instrucciones y datos a la EU.

La función más importante de la BIU es manejar la unidad de control


del bus, los registros de segmentos y la cola de instrucciones. La BIU
controla los buses que transfieren los datos a la EU, a la memoria y a
los dispositivos de entrada/salida externos, mientras que los registros
de segmentos controlan el direccionamiento de memoria.
Los registros del procesador se emplean para controlar instrucciones
en ejecución, manejar direccionamiento de memoria y proporcionar
capacidad aritmética.

Los registros del procesador tienen como misión fundamental


almacenar las posiciones de memoria que van a sufrir repetidas manipulaciones, ya que los accesos a memoria son mucho más
lentos que los accesos a los registros. El 8086 dispone de 14 registros de 16 bits que se emplean para controlar la ejecución de
instrucciones, direccionar la memoria y proporcionar capacidad aritmética y lógica. Cada registro puede almacenar datos o
direcciones de memoria. Los registros son direccionables por medio de un nombre. Por convención los bits de un registro se
numeran de derecha a izquierda.

Los registros son direccionables por medio de un nombre.

Registros de segmento.
Un registro de segmento tiene 16 bits de longitud y facilita un área de
memoria para direccionamiento conocida como el segmento actual. Un
segmento se alinea en un límite de párrafo y su dirección en un registro de
segmento supone cuatro bits 0 a su derecha.

Registro CS.
El DOS almacena la dirección inicial del segmento de código de un
programa en el registro CS. Esta dirección de segmento, más un valor de
desplazamiento en el registro de apuntador de instrucción (IP), indica la
dirección de una instrucción que es buscada para su ejecución. Para
propósitos de programación normal, no se necesita referenciar el registro
CS.

Registro DS.
La dirección inicial de un segmento de datos de programa es almacenada
en el registro DS. En términos sencillos, esta dirección, más un valor de
desplazamiento en una instrucción, genera una referencia a la localidad de un byte específico en el segmento de datos.

Registro SS.
El registro SS permite la colocación en memoria de una pila, para almacenamiento temporal de direcciones y datos. El DOS
almacena la dirección de inicio del segmento de pila de un programa en el registro SS. Esta dirección de segmento, más un valor
de desplazamiento en el registro del apuntador de la pila (SP), indica la palabra actual en la pila que está siendo direccionada. Para
propósitos de programación normal, no se necesita referenciar el registro SS.
Registro ES.
Algunas operaciones con cadenas de caracteres (datos de caracteres) utilizan el registro extra de segmento para manejar el
direccionamiento de memoria. En este contexto, el registro ES está asociado con el registro DI (índice). Un programa que requiere
el uso del registro ES puede inicializarlo con una dirección de segmento apropiada.

Registros FS y GS.
Son registros extra de segmento en los procesadores 80386 y posteriores.

Registro de apuntador de instrucciones

El registro apuntador de instrucciones (IP) de 16 bis contiene el desplazamiento de dirección de la siguiente instrucción que se
ejecuta. El IP está asociado con el registro CS en el sentido de que el IP indica la instrucción actual dentro del segmento de código
que se está ejecutando actualmente.

Comuntmente no se refiere el registro IP en un programa, pero, para probar un programa, sí puede cambiar su valor por medio del
programa DEBUG del DOS. Los procesadores 80386 y posteriores tienen un IP ampliado de 32 bits, llamado EIP.

En el ejemplo siguiente, el registro CS contiene 25A4[0]H y el IP contiene 412H. Para encontrar la siguiente instrucción que será
ejecutada, el procesador combina las direcciones en el CS y el IP:

Segmento de dirección en el registro CS: 25A40H

Desplazamiento de dirección en el registro IP: + 412H


Dirección de la siguiente instrucción: 25E52H

Registros apuntadores

Los registros SP (apuntador de la pila) y BP (apuntador base) están asociados con el registro SS y permiten al sistema accesar
datos en el segmento de la pila.

Registro SP. El apuntador de la pila de 16 bits está asociado con el registro SS y proporciona un valor de desplazamiento que se
refiere a la palabra actual que está siendo procesada en la pila. Los procesadores 80386 y posteriores tienen un apuntador de pila
de 32 bits, el registro ESP. El sistema maneja de manera automática estos registros.

En el ejemplo siguiente, el registro SS contiene la dirección de segmento 27B3[0]H y el SP el desplazamiento 312H.


Para encontrar la palabra actual que está siendo procesada en la pila, la computadora combina las direcciones en el SS y el SP:

Dirección de segmento en el registro SS: 27B30H

Desplazamiento en el registro SP: + 312H

Dirección en la pila: 27E42H

Registro BP. El BP de 16 bits facilita la referencia de parámetros, los cuales son datos y direcciones transmitidos vía la pila. Los
procesadores 80386 y posteriores tienen un BP ampliado de 32 bits llamado el registro EBP.

Registros de propósito general

Los registros de propósito general AX, BX, CX y DX son los caballos de batalla del sistema. Son únicos en el sentido de que se
puede direccionarlos como una palabra o como una parte de un byte. El último byte de la izquierda es la parte "alta", y el último
byte de la derecha es la parte "baja".

Los registros de propósito general se usan para suma y resta de cifras de 8, 16 o 32 bits.

Por ejemplo, el registro CX consta de una parte CH (alta) y una parte CL (baja), y se puede referirse a cualquier parte por su
nombre. Las instrucciones siguientes mueven ceros a los registros CX, CH y CL, respectivamente.

MOV CX,00
MOV CH,00
MOV CL,00

Los procesadores 80386 y posteriores permiten el uso de todos los registros de propósito general, más sus versiones ampliadas de
32 bits: EAX, EBX, ECX y EDX.
Registro AX. El registro AX, el acumulador principal, es utilizado para operaciones que implican entrada/salida y la mayor parte de
la aritmética. Por ejemplo, las instrucciones para multiplicar, dividir y suponen el uso del AX. También, algunas operaciones
generan código más eficiente si se refieren al AX en lugar de a los otros registros.

AX: AH AL
EAX

Registro BX. El BX es conocido como el registro base ya que es el único registro de propósito general que puede ser un índice
para direccionamiento indexado. También es común emplear el BX para cálculos.

BX: BH BL
EBX

Registro CX. El CX es conocido como el registro contador. Puede contener un valor para controlar el número de veces que un
ciclo se repite o un valor para corrimiento de bits, hacia la derecha o hacia la izquierda. El CX también es usado para muchos
cálculos.

CX: CH CL
ECX

Registro DX. El DX es conocido como el registro de datos. Algunas operaciones de entrada/salida requieren su uso, y las
operaciones de multiplicación y división con cifras grandes suponen al DX y al AX trabajando juntos.

DX: DH DL
EDX

Los registros de propósito general se usan para suma y resta de cifras de 8, 16 o 32 bits.

Registros índice
Los registros SI y DI están disponibles para direccionamiento indexado y para sumas y restas.

Registro SI. El registro índice fuente de 16 bits es requerido por algunas operaciones con cadenas (de caracteres). En este
contexto, el SI está asociado con el registro DS. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado de
32 bits, el ESI.

Registro DI. El registro índice destino también es requerido por algunas operaciones con cadenas de caracteres. En este contexto,
el DI está asociado con el registro ES. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado de 32 bits, el
EDI.

Registros en Ensamblador

Para comprender la programación en lenguaje ensmblador se debe entender que en el procesador 8086 existen 14 rgistros. Cada uno de 16 Bits de
tamañ[Link] registros se pueden utilizar como propósito general para nombrar locaciones en el CPU, y optimizar la rapidez.
Para accesar estos registros, es posibe usar nombres de 8-bit, 16 y 32, ejemplo: EAX, EBX, ECX y EDX.

Cada registro tiene diferentes usos. El propósito general de un registro puede estar dividido. AH contiene el alto byte de AX y AL contiene el bajo byte.
Otro ejemplo es : BH, BL, CH, CL, DL, DH. DX contiene el valor 1234h DH será el 12h y DL será el 34h.
Sin embargo; los procesadores modernos 386 y posteriores tienen 8 registros de propósito general de 32-bit. EAX es un reg. que es usado en el
contador de las iteracciones en el LOOP (igual que el CX). Aunque la mayoría de los registros han perdido sus usos especiales en el conjunto
moderno de instrucciones, por convención dos son reservados para propósitos especiales - el stack pointer (ESP) y el base pointer (ESB).

Las subsecciones en EAX, EBX, ECX y EDX pueden ser usadas, por ejemplo los dos bytes menos significativos de EAX pueden ser tratados como
registros de 16-bit llamados AX. El byte menos significativo de AX puede ser usado como un registro de 8-bit llamado AL.

Cuando una cantidad de dos bytes es asignada en DX, su actualización afecta el valor de DH, DL y EDX. Estos subregistros son sobrevivientes de
conjuntos de instruciones antiguas de 16-bits y son convenientes en la utilizacoin de datos que son más pequeños que 32-bits.

Los nombres de los registros en el ensamblador, no son case-sensitive, por ejemplo es lo mismo EAX que eax.

Registro de banderas

De los 16 bits del registro de banderas, nueve son comunes a toda la familia de procesadores 8086, y sirven para indicar el estado
actual de la máquina y el resultado del procesamiento. Muchas instrucciones que piden comparaciones y aritmética cambian el
estado de las banderas, algunas de cuyas instrucciones pueden realizar pruebas para determinar la acción subsecuente.
En resumen, los bits de las banderas comunes son como sigue:

OF (overflow, desbordamiento). Indica desbordamiento de un bit de orden alto (más a la izquierda) después de una operación
aritmética.

DF (dirección). Designa la dirección hacia la izquierda o hacia la derecha para mover o comparar cadenas de caracteres.

IF (interrupción). Indica que una interrupción externa, como la entrada desde el teclado, sea procesada o ignorada.

TF (trampa). Permite la operación del procesador en modo de un paso. Los programas depuradores, como DEBUG, activan esta
bandera de manera que usted pueda avanzar en la ejecución de una sola instrucción a un tiempo, para examinar el efecto de esa
instrucción sobre los registros y la memoria.

SF (signo). Contiene el signo resultante de una operación aritmética (0 = positivo y 1 = negativo).

ZF (cero). Indica el resultado de una operación aritmética o de comparación (0 = resultado diferente de cero y 1 = resultado igual a
cero).

AF (acarreo auxiliar). Contiene un acarreo externo del bit 3 en un dato de ocho bits, para aritmética especializada.

PF (paridad). Indica paridad par o impar de una operación en datos de ocho bits de bajo orden (más a la derecha).

CF (acarreo). Contiene el acarreo de orden más alto (más a la izquierda) después de una operación aritmética; también lleva el
contenido del último bit en una operación de corrimiento o de rotación.

Las banderas están en el registro de banderas en las siguientes posiciones:

Las banderas más importantes para la programación en ensamblador son O, S, Z y C, para operaciones de comparación y
aritméticas, y D para operaciones de cadenas de caracteres. Los procesadores 80286 y posteriores tienen algunas banderas
usadas para propósitos internos, en especial las que afectan al modo protegido. Los procesadores 80386 y posteriores tienen un
registro extendido de banderas conocido como Eflags
1.3 La Memoria Principal (RAM).

Otra función de la BIU es permitir el acceso a instrucciones. Ya que las instrucciones de un programa en ejecución se encuentran
en la memoria, la BIU debe accesar instrucciones desde la memoria y colocarlas en la cola de instrucciones (lo que se conoce
como FECH). Puesto que el tamaño de esta cola es de 4 a 32 bytes, dependiendo del procesador, la BIU es capaz de adelantarse
y buscar con anticipación instrucciones de manera que siempre haya una cola de instrucciones listas para ser ejecutadas. Antes no
se podía ejecutar una instrucción hasta que se traía de memoria (Fetch); y no podían traerse instrucciones de memoria mientras
ejecutaba una instrucción, pues el procesador estaba ocupado.

Resumiendo, un alto porcentaje del tiempo, el procesador estaba ocupado haciendo Fetch, cuando su función debiera ser ejecutar
las instrucciones. La capacidad de ejecutar instrucciones sólo se ocupaba en un bajo porcentaje.

Para solucionar esto, Intel desarrolló la arquitectura en


pipeline del Fetch/Execute, en la cual simplemente se
divide la tarea en dos secciones: una encargada del
Fetch (BIU), y otra del Execute (EU). De esta manera,
existen circuitos separados para cada función, los
cuales trabajan en paralelo. Si bien el proceso aún es
secuencial, solamente al principio se requiere
desperdiciar tiempo en el Fetch. A partir de ahí, Fetch va
adelante del Execute, y trae instrucciones al procesador
mientras este ejecuta las anteriores.

La EU y la BIU trabajan en paralelo, si bien la BIU se


mantiene un paso adelante. La EU notifica a la BIU
cuándo necesita acceso a los datos en memoria o a un
dispositivo de E/S. También, la EU solicita instrucciones
de máquina de la cola de instrucciones de la BIU. La
instrucción que se encuentra adelante de la cola es la
actualmente ejecutable, y mientras la EU está ocupada
ejecutando una instrucción, la BIU busca otra en la
memoria. Esta búsqueda se traslapa con la ejecución y
aumenta la velocidad de procesamiento.

Los procesadores hasta el 80486 tienen lo que se conoce como tubería sencilla, la cual los restringe a completar una instrucción
antes de iniciar la siguiente. El Pentium y procesadores posteriores tienen una tubería doble (o dual) que les permite correr varias
operaciones en paralelo.

Los procesadores dominantes antes de la introducción del IBM PC, basado en el 8086, eran todos de 8 bits; con lo que nos
refereimos al bus de datos. Esto quiere decir que se podía accesar un byte de memoria en un solo ciclo de reloj, pues existían 8
cables entre la memoria y el procesador, por donde viajaban a la vez 8 bits de información. Que el procesador sea de 16 bits,
quiere decir que pueden viajar a la vez 16 bits (2 bytes) entre el procesador y la memoria; por tanto, el procesador puede mover
bloques de memoria en la mitad del tiempo, y con la mitad de instrucciones. Esto hace más eficiente el acceso a memoria por parte
del procesador.

Al tamaño del bus de datos también suele llamársele tamaño de palabra.

Mapa físico de memoria de una PC tipo 8086.

Del primer megabyte de memoria, los primeros


640K los ocupa la RAM, la mayor parte de la cual
está disponible para su uso.

Los bytes en memoria se numeran en forma


consecutiva, iniciando con 00, de modo que cada
localidad tiene un número de dirección único.

La memoria principal o primaria, "Memoria


Central", es aquella memoria de un ordenador,
donde se almacenan temporalmente tanto los
datos como los programas que la CPU está
procesando o va a procesar en un determinado
momento. Por su función, es una amiga
inseparable del microprocesador, con el cual se comunica a través de los buses de datos. Por ejemplo, cuando la CPU tiene que
ejecutar un programa, primero lo coloca en la memoria y después lo empieza a ejecutar. Lo mismo ocurre cuando necesita
procesar una serie de datos; antes de poder procesarlos los tiene que llevar a la memoria principal.
Esta clase de memoria es
volátil, es decir que, cuando
se corta la energía eléctrica,
se borra toda la información
que estuviera almacenada en
ella.
Por su función, la cantidad de
memoria RAM de que
disponga una computadora
es una factor muy
importante; hay programas y
juegos que requieren una
gran cantidad de memoria
para poder usarlos. Otros
andarán más rápido si el
sistema
cuenta con más memoria
RAM.

RAM::
Puesto que el
[Link] ocupa una
pequeña parte de RAM,
también existe espacio para otros programas.

Un programa se ejecuta en RAM y por lo común produce salida a la pantalla, a la impresora o a un disco. Cuando termina, se
puede pedir al [Link] cargar otro programa en RAM.

La memoria Caché: dentro de la memoria RAM existe una clase de memoria denominada Memoria Caché que tiene la
característica de ser más rápida que las otras, permitiendo que el intercambio de información entre el procesador y la memoria
principal sea a mayor velocidad.
La estructura de la memoria principal ha cambiado en la historia de las computadoras. Desde los años 1980 es prevalentemente
una unidad dividida en celdas que se identifican mediante una dirección. Está formada por bloques de circuitos integrados o chips
capaces de almacenar, retener o "memorizar" información digital, es decir, valores binarios; a dichos bloques tiene acceso el
microprocesador de la computadora.

La MP se comunica con el microprocesador de la CPU mediante el bus de direcciones. El ancho de este bus determina la
capacidad que posea el microprocesador para el direccionamiento de instrucciones en memoria.

En algunas oportunidades suele llamarse "memoria interna" a la MP, porque a diferencia de los dispositivos de memoria
secundaria, la MP no puede extraerse
tan fácilmente por usuarios no técnicos.

La MP es el núcleo del sub-sistema de memoria de una computadora, y posee una menor capacidad de almacenamiento que la
memoria secundaria, pero una velocidad millones de veces superior. Si tienes más memoria almacenas más datos.

Direccionamiento de localidades de memoria

Dependiendo del modelo, el procesador puede accesar uno o más bytes de memoria a la vez.

Considere el número decimal 1,025. La representación hexadecimal de esta cifra, 0401H, requiere de dos bytes (o una palabra) de
memoria.

Consta de un byte de orden alto (más significativo), 04, y un byte de orden bajo (menos significativo), 01.
El sistema almacena en memoria estos bytes en secuencia inversa de bytes: el byte de orden bajo en la dirección baja de memoria
y el byte de orden alto en la dirección alta de memoria. Por ejemplo, el procesador transferiría 0401H de un registro a las
localidades de memoria 5612 y 5613 como:

El procesador espera que los datos numéricos en la


memoria estén en secuencia inversa de bytes y
los procesa de acuerdo con esto. Cuando el
procesador recupera la palabra de la memoria,
otra vez invierte los bytes, restableciéndolos de
manera correcta en el registro como 04 01 hex.
Aunque esta característica es enteramente
automática, usted tiene que estar alerta cuando
programe y depure programas en lenguaje
ensamblador.
Un programador de lenguaje ensamblador tiene que distinguir claramente entre la dirección y los contenidos de una localidad de
memoria. En el ejemplo anterior, el contenido de la localidad 5612 es 01 y el contenido de la localidad 5613 es 04.

Segmentos y Direccionamiento

Los segmentos son registros de 16 bits dedicados a las funciones de acceso a memoria. Aunque un segmento puede estar
ubicado casi en cualquier lugar de la memoria y, en modo real puede ser de hasta 64K. Se puede tener cualquier número de
segmento tantos como el programa requiera para su ejecución. El ensamblador se encarga de ajustar el tamaño de los segmentos tomando
como base el número de bytes que necesita cada instrucción que va ensamblando, ya que sería un desperdicio de memoria utilizar los segmentos
completos. Por ejemplo, si un programa únicamente necesita 10kb para almacenar los datos, el segmento de datos únicamente sera de 10kb y no de
los 64kb que puede manejar.

Los tres segmentos principales son:

 Segmentos de código
 Segmentos de datos
 Segmentos de la pila

La forma de indicarle al ensamblador con cuales de los segmentos se va a trabajar es por medio de las directivas .CODE, .DATA y .STACK.

Segmento de código

El segmento de código (CS) contiene las instrucciones de máquina que son ejecutadas. Por lo común, la primera
instrucción ejecutable está en el inicio del segmento, y el sistema operativo enlaza a esa localidad para iniciar la
ejecución del programa. Como su nombre indica, el registro del CS direcciona el segmento de código. Si su área de
código requiere más de 64K, su programa puede necesitar definir más de un segmento de código.

Segmento de datos

El segmento de datos (DS) contiene datos, constantes y áreas de trabajo definidos por el programa. El registro del DS
direcciona el segmento de datos. Si su área de datos requiere de más de 64K, su programa puede necesitar definir más
de un segmento de datos.

Segmento de la pila

En términos sencillos, la pila contiene los datos y direcciones que se necesitan guardar temporalmente, la pila es una
estructura de datos, con política LIFO (Last In, First Out), con instrucciones básicas PUSH y POP para su manejo. Esta
estructura es usada por los programas de aplicación, pero también por el procesador para el control de instrucciones que
lo requieren, tales como las llamadas a subrutinas y la atención de interrupciones.

El registro del segmento de la pila (SS) direcciona el segmento de la pila.

ES: Extra Segment (Segmento Extra)

Este registro nos permite seleccionar una sección de 64 Kb., que no está destinada a ningún uso específico; por lo que el
programador puede aplicarla como comodín, generalmente como un segundo segmento de datos; o bien, para el acceso
a regiones de memoria del sistema, tales como la memoria de video o las variables del BIOS.

Límites de los segmentos

Los registros de segmentos contienen la dirección inicial de cada segmento. La figura presenta un esquema de los registros CS,
DS y SS; los registros y segmentos no necesariamente están en el orden mostrado. Otros registros de segmentos son el ES
(segmento extra) y, en los procesadores 80386 y posteriores, los registros FS y GS, que tienen usos especializados.

Como ya dijimos, un segmento inicia en un límite de párrafo, que es una dirección por lo
común divisible entre el 16 decimal, o 10 hex. Suponga que un segmento de datos inicia
en la localidad de memoria 045F0H. Ya que en este y todos los demás casos el último
dígito hexadecimal de la derecha es cero, los diseñadores de computadora decidieron
que sería innecesario almacenar el dígito cero en el registro del segmento. Así, 045F0H
se almacena como 045F, con el cero de la extrema derecha sobrentendido. En donde
sea apropiado, el texto indica al cero de la derecha con corchetes, como en 045F[O].

Desplazamiento de segmentos
En un programa, todas las localidades de memoria están referidas a una dirección inicial
de segmento. La distancia en bytes desde la dirección del segmento se define como el
desplazamiento (offset).
Un desplazamiento de dos bytes (16 bits) puede estar en el rango de 0000H hasta FFFFH, o bien, desde cero hasta 65,535. Así,
el primer byte del segmento de código tiene un desplazamiento 00, el segundo byte tiene un desplazamiento 01, etc., hasta el
desplazamiento 65,535.

Para referir cualquier dirección de memoria en un segmento, el procesador combina la dirección del segmento en un registro de
segmento con un valor de desplazamiento.

En el ejemplo siguiente, el registro DS contiene la dirección de segmento del segmento de datos en 045F[0] hexadecimal y una
instrucción hace referencia a una localidad con un desplazamiento de 0032H bytes dentro del segmento de datos.

Por lo tanto, la localidad real de memoria del byte referido por la instrucción es 04622H;

Dirección del segmento DS: 045F0H


Desplazamiento: +0032H
Dirección real: 04622H

Notese que un programa tiene uno o más segmentos, los cuales pueden iniciar casi en cualquier lugar de memoria, variar en
tamaño y estar en cualquier orden.

Capacidad de direccionamiento

Al estar los procesadores evolucionando estos proporcionan diferentes capacidades de direccionamiento.

Direccionamiento de 8086/8088.

Proporcionan 16 bits. Ya que una dirección de segmento está en el límite de un párrafo, los 4 bits de la extrema derecha
de su dirección son cero.

Como ya se ha visto, una dirección es almacenada en un registro de segmento, y la computadora asume los cuatro
últimos bits de la derecha como ceros (un dígito hexadecimal), como nnnn[0] hex. Ahora, FFFF[0]H permite direccionar
hasta 1,048,560 bytes.

Si tiene duda, decodifique cada F hex como el 1111 binario, considere los cuatro últimos bits de la derecha como ceros y
sume los valores de los bits a 1.

Direccionamiento 80286.

En modo real, el procesador 80286 maneja el direccionamiento de la misma manera que lo hace el 8086. En modo
protegido, el procesador utiliza 24 bits para direccionamiento, de manera que FFFFF[0] permite direccionar hasta 16
millones de bytes. Los registros de segmento actúan como seleccionadores para accesar una dirección de segmento de
24 bits de la memoria y sumar este valor a un desplazamiento de dirección de 16 bits:

Direccionamiento 80386/486/586.

En modo real, estos procesadores manejan el direccionamiento de forma muy parecida a como lo hace un 8086. En
modo protegido, los procesadores utilizan 48 bits para el direccionamiento, lo que permite direcciones de segmento de
hasta cuatro mil millones de bytes. Los registros de segmento de 16 bits actúan como seleccionadores para el acceso a
direcciones de segmento de 32 bits de la memoria y para agregar este valor a un desplazamiento de dirección de 32 bits:
1.4 El Concepto de Interrupciones.
Una interrupción es una operación que suspende la ejecución de un programa de modo que el sistema pueda realizar una acción
especial llamada rutina de servicio (le da el procesador a otra rutina que en ese momento es mas importante). La rutina de
interrupción se ejecuta y por lo regular regresa el control al procedimiento que fue interrumpido, el cual entonces reasume su
ejecución.

Dentro de una computadora existen dos clases de interrupciones:


 Interrupciones por software: Son aquellas programadas por el usuario, es decir, el usuario decide cuando y donde
ejecutarlas, generalmente son usadas para realizar entrada y salida. (por ejemplo impresiones).

Una interrupción interna ocurre como resultado de la ejecución de una instrucción INT o una operación de división que cause
desbordamiento, ejecución en modo de un paso o una petición para una interrupción externa, tal como E/S de disco. Los
programas por lo común utilizan interrupciones internas, que no son enmascarables, para accesar los procedimientos del
BIOS y del DOS.

 Interrupciones por hardware: Son aquellas que son provocadas por dispositivos externos al procesador su característica
principal es que no son programadas, esto es, pueden ocurrir en cualquier momento en el programa.

Cuando un periférico desea acceder a un recurso, envía un pedido de interrupción al procesador para llamar su atención, los
periféricos cuentan con un número de interrupción que se denomina IRQ (Interrupt Request).

Existen dos clases de interrupciones de este tipo:


 Interrupciones por hardware enmascarables: Aquellas en las que el usuario
decide si quiere o no ser interrumpido.

 Interrupciones por hardware no enmascarables (NMI): Aquellas que siempre


interrumpen al programa.

Para utilizar una interrupción en ensamblador se utiliza la instrucción int seguida del número de la interrupción, por ejemplo: int
10h, además se tiene 256 interrupciones: de la 00 a la FF.

Asociado al concepto de interrupción se tiene un área de memoria llamada vector de interrupciones; la cual contiene las
direcciones de las rutinas de servicio de cada interrupción. Esta área se encuentra en el segmento 0000:0000.

EJEMPLO:
.
model small end
.stack 64
.data
.code
;Limpiamos la pantalla
mov t, 02h
int 10h
;imprimimos @
mov dx, 64 Para este ejemplo utilizamos las interrupciones 10h, 21h,
mov ah, 02h
int 21h
que nos sirven para controlar los servicios de pantalla y el
.exit 21h para impresión de símbolos.

Tabla De Servicio De Interrupcion.

Cuando la computadora se enciende, el BIOS y el DOS establecen una tabla de servicios de interrupción en las localidades de
memoria 000H-3FFH. La tabla permite el uso de 256 (100H) interrupciones, cada una con un desplazamiento:segmento relativo de
cuatro bytes en la forma IP:CS.

El operando de una instrucción de interrupción como INT 05H identifica el tipo de solicitud. Como existen 256 entradas, cada una
de cuatro bytes, la tabla
ocupa los primeros 1, 024
bytes de memoria, desde
000H hasta 3FFH. Por lo
tanto los bytes 0-3 contienen
la dirección para la
interrupción 0, los bytes 4-7
para la interrupción 1, y así
sucesivamente:

Eventos De Una Interrupcion.


Una interrupción guarda en la pila el contenido del registro de banderas, el CS, y el IP. por ejemplo, la dirección en la tabla de INT
05H (que imprime lo que se encuentra en la pantalla cuando el usuario presiona Ctrl + PrtSC) es 0014H (05H x 4 = 14H). La
operación extrae la dirección de cuatro bytes de la posición 0014H y almacena dos bytes en el IP y dos en el CS.
La dirección CS:IP entonces apunta al inicio de la rutina en el área del BIOS, que ahora se ejecuta. La interrupción regresa vía una
instrucción IRET (regreso de interrupción), que saca de la pila el IP, CS y las banderas y regresa el control a la instrucción que
sigue al INT.

Interrupcion De Bios.

El BIOS contiene un extenso conjunto de rutinas de entrada/salida y tablas que indican el estado de los dispositivos del sistema. El
dos y los programas usuarios pueden solicitar rutinas del BIOS para la comunicación con los dispositivos conectados al sistema. El
método para realizar la interfaz con el BIOS es el de las interrupciones de software. A continuación se listan algunas interrupciones
del BIOS.

 INT 00H: División entre cero. Llamada por un intento de dividir entre cero. Muestra un mensaje y por lo regular se cae el
sistema.

 INT 01H: Un solo paso. Usado por DEBUG y otros depuradores para permitir avanzar por paso a través de la ejecución
de un programa.

 INT 02H: Interrupción no enmascarable. Usada para condiciones graves de hardware, tal como errores de paridad, que
siempre están habilitados. Por lo tanto un programa que emite una instrucción CLI (limpiar interrupciones) no afecta estas
condiciones.

 INT 03H: Punto de ruptura. Usado por depuración de programas para detener la ejecución.

 INT 04H: Desbordamiento. Puede ser causado por una operación aritmética, aunque por lo regular no realiza acción
alguna.

 INT 05H: Imprime pantalla. Hace que el contenido de la pantalla se imprima. Emita la INT 05H para activar la interrupción
internamente, y presione las teclas Cltr + PrtSC para activarla externamente. La operación permite interrupciones y
guarda la posición del cursor.

 INT 08H: Sistema del cronometro. Una interrupción de hardware que actualiza la hora del sistema y (si es necesario) la
fecha. Un chip temporizador programable genera una interrupción cada 54.9254 milisegundos, casi 18.2 veces por
segundo.

 INT 09H: Interrupción del teclado. Provocada por presionar o soltar una tecla en el teclado.

 INT OBH, INT OCH: Control de dispositivo serial. Controla los puertos COM1 y COM2, respectivamente.

 INT 0DH, INT OFH: Control de dispositivo paralelo. Controla los puertos LPT1 y LPT2, respectivamente.

 INT 0EH: Control de disco flexible. Señala actividad de disco flexible, como la terminación de una operación de E/S.

 INT 10H: Despliegue en vídeo. Acepta el número de funciones en el AH para el modo de pantalla, colocación del cursor,
recorrido y despliegue.

AH = 00h Limpiar pantalla


AH = 0Eh Vídeo Función TeleType (escribir caracteres en la pantalla)
AH = 0Fh Vídeo Obtener el modo de vídeo
AX = 1100h Vídeo Cambiar fuente de vídeo (Modo Texto)
AX = 4F02h SVGA Establecer modo de vídeo SVGA

 INT 11H: Determinación del equipo. Determina los dispositivos opcionales en el sistema y regresa el valor en la localidad
40:10H del BIOS al AX. (A la hora de encender el equipo, el sistema ejecuta esta operación y almacena el AX en la
localidad 40:10H).

 INT 12H: Determinación del tamaño de la memoria. En el AX, regresa el tamaño de la memoria de la tarjeta del sistema,
en términos de kilobytes contiguos.
 INT 13H: Entrada/salida de disco. Acepta varias funciones en el AH para el estado del disco, sectores leídos, sectores
escritos, verificación, formato y obtener diagnóstico.

Interrupción Del Dos.

Los dos módulos del DOS, [Link] y [Link], facilitan el uso del BIOS. Ya que proporcionan muchas de las pruebas
adicionales necesarias, las operaciones del DOS por lo general son más fáciles de usar que sus contrapartes del BIOS y por lo
común son independientes de la máquina.
 [Link] es una interfaz de nivel bajo con el BIOS que facilita la lectura de datos desde la memoria hacia dispositivos
externos.
 [Link] contiene un administrador de archivos y proporciona varios servicios. Por ejemplo, cuando un programa
usuario solicita la INT 21H, la operación envía información al [Link] por medio del contenido de los registros. Para
completar la petición, [Link] puede traducir la información a una o más llamadas a [Link], el cual a su vez llama
al BIOS. Las siguientes son las relaciones implícitas:

Las interrupciones desde la


20H hasta la 3FH están
reservadas para
operaciones del DOS. A
continuación se mencionan
algunas de ellas.

INT 20H: Termina programa. Finaliza la ejecución de un programa .COM, restaura las direcciones para Cltr + Break y errores
críticos, limpia los bufer de registros y regresa el control al DOS. Esta función por lo regular seria colocada en el procedimiento
principal y al salir del, CS contendría la dirección del PSP. La terminación preferida es por medio de la función 4CH de la INT 21H.

INT 21H: Petición de función al DOS. La principal operación del DOS necesita una función en el AH.

INT 21H Esta interrupción proporciona una gran cantidad de funciones, las cuales deben ser invocadas en conjunto con el registro
AH.

0 Terminación de un programa.
1 Entrada de carácter con eco.
2 Salida a pantalla.
3 Entrada por el puerto serie.
4 Salida por el puerto serie.
5 Salida a la impresora.
6 E/S directa por pantalla.
7 Entrada directa de carácter sin eco.
8 Entrada de carácter sin eco.
9 Visualizar cadenas de caracteres.
10 Entrada desde el teclado.
11 Comprobación del estado de entrada.
12 Borrar registro de entrada.
13 Inicializar unidad de disco.

INT 22H: Dirección de terminación. Copia la dirección de esta interrupción en el PSP del programa (en el desplazamiento 0AH)
cuando el DOS carga un programa para ejecución. A la terminación del programa, el DOS transfiere el control a la dirección de la
interrupción. Sus programas no deben de emitir esta interrupción.
INT 23H: Dirección de Cltr + Break. Diseñada para transferir el control a una rutina del DOS (por medio del PSP desplazamiento
0EH) cuando usted presiona Ctlt + Break o Ctlr + c. La rutina finaliza la ejecución de un programa o de un archivo de
procesamiento por lotes. Sus programas no deben de emitir esta interrupción.

INT 24H: Manejador de error crítico. Usada por el dos para transferir el control (por medio del PSP desplazamiento 12H) cuando
reconoce un error critico (a veces una operación de disco o de la impresora).Sus programas no deben de emitir esta interrupción.

INT 25H: Lectura absoluta de disco. Lee el contenido de uno o más sectores de disco.

INT 26H: Escritura absoluta de disco. Escribe información desde la memoria a uno o más sectores de disco.

INT 27H: Termina pero permanece residente (reside en memoria). Hace que un programa .COM al salir permanezca residente en
memoria.
INT 2FH: Interrupción de multiplexion. Implica la comunicación entre programas, como la comunicación del estado de un spooler de
la impresora, la presencia de un controlador de dispositivo o un comando del DOS tal como ASSIGN o APPEND.

INT 33H: Manejador del ratón. Proporciona servicios para el manejo del ratón.
1.5 Llamadas a Servicios del Sistema.

Es el mecanismo usado por una aplicación para solicitar un servicio al sistema operativo.

Las llamadas al sistema comúnmente usan una instrucción especial de


la CPU que causa que el procesador transfiera el control a un código privilegiado. previamente especificado por el mismo código.
Esto permite al código privilegiado especificar donde va a ser conectado así como el estado del procesador.

Cuando una llamada al sistema es invocada, la ejecución del programa que invoca es interrumpida y sus datos son guardados,
normalmente en su PCB (Bloque de Control de Proceso del inglés Process Control Block), para poder continuar ejecutándose
luego. El procesador entonces comienza a ejecutar las instrucciones de código de alto nivel de privilegio, para realizar la tarea
requerida. Cuando esta finaliza, se retorna al proceso original, y continúa su ejecución. El retorno al proceso demandante no
obligatoriamente es inmediato, depende del tiempo de ejecución de la llamada al sistema y del algoritmo de planificación de CPU.
1.6 Modos de Direccionamiento.

Los llamados modos de direccionamiento son las diferentes maneras de especificar en informática un operando dentro de una
instrucción en lenguaje ensamblador.

Un modo de direccionamiento especifica la forma de calcular la dirección de memoria efectiva de un operando mediante el uso de
la información contenida en registros y / o constantes, contenida dentro de una instrucción de la máquina o en otra parte.

Diferentes arquitecturas de computadores varían mucho en cuanto al número de modos de direccionamiento que ofrecen desde el
hardware. Eliminar los modos de direccionamiento más complejos podría presentar una serie de beneficios, aunque podría requerir
de instrucciones adicionales, e incluso de otro registro. Se ha comprobado que el diseño de CPUs segmentadas es mucho más
fácil si los únicos modos de direccionamiento que proporcionan son simples.

La mayoría de las máquinas RISC disponen de apenas cinco modos de direccionamiento simple, mientras que otras máquinas
CISC tales como el DEC VAX tienen más de una docena de modos de direccionamiento, algunos de ellos demasiado complejos. El
mainframe IBM System/360 disponía únicamente de tres
modos de direccionamiento; algunos más fueron añadidos posteriormente para el System/390.

Cuando existen solo unos cuantos modos, estos van codificados directamente dentro de la propia instrucción (Un ejemplo lo
podemos encontrar en el IBM/390, y en la mayoría de los RISC). Sin embargo, cuando hay demasiados modos, a menudo suele
reservarse un campo específico en la propia instrucción, para especificar dicho modo de direccionamiento. El DEC VAX permitía
múltiples operandos en memoria en la mayoría de sus instrucciones, y reservaba los primeros bits de cada operando para indicar el
modo de direccionamiento de ese operando en particular.
Incluso en computadores con muchos modos de direccionamiento, algunas medidas realizadas a programas indican que los modos
más simples representan cerca del 90% o más de todos los modos de direccionamiento utilizados. Dado que la mayoría de estas
medidas son obtenidas a partir de códigos de alto nivel generados a partir de compiladores, nos da una idea de las limitaciones que
presentan los compiladores que se utilizan.

Los modos de direccionamiento son las diferentes formas de definir la ubicación de un operando en memoria, para que de esta
forma el programa sea capaz de encontrarlo durante el tiempo de ejecución. Es necesario mencionar que al realizar una operación,
es posible realizarla entre registros o entre registros y memoria, pero no es posible realizarla entre memoria y memoria.

Los modos de direccionamiento son los siguientes:

Implícito:
Este modo de direccionamiento se utiliza sin declarar ninguna dirección, ya que las operaciones que lo utilizan ya conocen la
dirección en la cual se encuentra el operando que se va a utilizar.

Inmediato:
En este modo de direccionamiento se declara directamente el valor del operando en la instrucción.

Ejemplo:
mov ah,02h -> El valor del operando (02h) se especifica directamente.

Directo:
En el direccionamiento directo, el operando hace referencia a un dato almacenado en la dirección especificada en la instrucción, la
cual puede estar escrita de dos formas, como un registro o como una posición en memoria.

Para utilizar un registro basta con escribir el nombre del registro como operando para la operación, para utilizar una posición en
memoria es necesario escribir el valor de la posición entre corchetes [], de esta forma TASM lo interpretara como una dirección y
no como un valor.

Ejemplos:
mov ax, bx -> Se establece el dato en la dirección de bx como operando.

mov ax, [021BH] -> Se establece el dato en la dirección 021BH como operando.

Indirecto:
Al utilizar direccionamiento indirecto, el operando se utiliza como una referencia a un dato que se encuentra almacenado en una
posición de memoria, para esto el operando debe especificar un registro entre corchetes, el cual contiene la dirección de memoria a
la que se desea acceder.

Ejemplo:

mov bx,[ax] -> ax contiene la dirección a la que se desea acceder y este valor se asigna a bx.

Indexado:
En el direccionamiento indexado el operando hace referencia a una posición en memoria, la cual puede ser expresada utilizando un
numero el cual es sumado a un registro que funciona como un índice respecto a la dirección de memoria.
mov ax, [1324h+12] -> En este caso 1324h es la dirección base y 12 es el registro utilizado como índice.
Relativo:
En el direccionamiento relativo se declara el operando como el valor de un registro entre corchetes, al cual se le aplica un
desplazamiento, es decir, se le suma un valor que indicara el desplazamiento a partir de la dirección indicada por el registro.

Ejemplo:

Mov ax,[bx+2] -> En este ejemplo bx contiene la dirección base y 2 es el


desplazamiento que se utilizará.

Estos son los únicos registros que pueden usarse de modo dual (en 8 o 16 bits) Los registros de la CPU son conocidos por sus
nombres propios, que son:

 AX (ACUMULADOR) se usa para almacenar resultados, lectura o escritura desde o hacia los puertos.

 BX (REGISTRO BASE) se usa para almacenar resultados, lectura o escritura desde o hacia los puertos.
 CX (REGISTRO CONTADOR) se utiliza en operaciones de iteración, como un contador que automáticamente se incrementa o decrementa de acuerdo con
el tipo de instrucción usada.

 DX (REGISTRO DE DATOS) El DX se usa como puente para el acceso de datos.

 DS (REGISTRO DEL SEGMENTO DE DATOS)

 ES (REGISTRO DEL SEGMENTO EXTRA)

 SS (REGISTRO DEL SEGMENTO DE PILA)

 CS (REGISTRO DEL SEGMENTO DE CÓDIGO)

 BP (REGISTRO DE APUNTADORES BASE)

 SI (REGISTRO ÍNDICE FUENTE)

 DI (REGISTRO ÍNDICE DESTINO)

 SP (REGISTRO DEL APUNTADOR DE PILA)

 IP (REGISTRO DEL APUNTADOR DE SIGUIENTE INSTRUCCIÓN)

 F (REGISTRO DE BANDERAS)

1.7 Proceso de Ensamblado y Ligado.


Los archivos fuente de código ensamblador deben estar en formato ASCII standard. Para esto puede usarse cualquier editor que
permita crear archivos sin formato, e.g. Edlin, Edit, Write, El editor del Turbo Pascal, Works, Word, WordStar, etcétera. Las
declaraciones pueden ser introducidas en mayúsculas y/o minúsculas. Una buena práctica de programación es poner todas las
palabras reservadas (directivas e instrucciones) en mayúsculas y todo lo del usuario en minúsculas para fines de facilidad de
lectura del código.

Las sentencias pueden comenzar en cualquier columna, no pueden tener más de 128 caracteres, no se permiten lineas múltiples ni
códigos de control, y cada línea debe ser terminada con una combinación de line-feed y carriage-return. Los comentarios se
declaran con ; y terminan al final de la línea.

ENSAMBLADO
El ensamblado se lleva a cabo invocando al MASM. Este puese ser invocado, usando una línea de comando, de la siguiente
manera:

MASM archivo [,[objeto][,[listado][,[cross]]]]][opciones][;]

Dónde:
 Objeto.- Es el nombre para el archivo objeto.
 Listado.- Nombre del archivo de listado de ensamblado.
 Cross.- Es un archivo de referencias cruzadas.

MASM [Link]

LINKEADO

LINK [Link]
EJECUCION
Para la ejecución del programa simplemente basta teclear su nombre en el prompt de MS-DOS y teclear ENTER. Con esto el
programa será cargado en memoria y el sistema procederá a ejecutarlo.

[Link]

1.8 Desplegado de Mensajes en el Monitor.

En este capítulo escribiremos instrucciones que le indicarán a la computadora que mensaje y como lo va a desplegar. Como
sugerencia se puede comenzar por borrar la pantalla. Esto se puede realizar de muy diversas formas, aquí lo haremos usando el
BIOS, el cual es un microchip que se encuentra dentro de toda PC y controla las funciones básicas de entrada y salida (Basic Input
Output System). Lo que haremos es decirle al chip "¡Hey! dime en que modo está trabajando la tarjeta de video", cuando
obtengamos la respuesta le diremos: "Dile a la tarjeta de video que deje de trabajar en ese modo y que comienze a trabajar en el
modo de video que me diste".

principio:
mov ah, 0fh
int 10h

mov ah, 0
int 10h

Lo primero que vemos es una "etiqueta", con ella le damos nombre a un punto dentro del código, si más tarde dentro del programa
deseamos repetir esta parte del código solo tenemos que decir "salta a 'principio'" y ya está. El primer grupo de instrucciones
después de la etiqueta le dicen al BIOS que obtenga la modalidad en la que está trabajando el video. Aquí vemos por primera vez
una interrupción (int 10h). Las interrupciones son funciones ya incorporadas dentro del BIOS y del sistema operativo MS-DOS que
realizan tareas comunes como leer del disco, mostrar un mensaje en el monitor, o ¡borrar la pantalla!. Enseguida, mediante una
función de la interrupción 10h, le decimos que cambie a la misma modalidad de video.

Bueno, ahora que la pantalla está limpia, podemos mostrar nuestro mensaje en el monitor. Aquí está el código:

lea dx, mensaje_a_mostrar

mov ah, 9h
int 21h

Con la primera instrucción le decimos al procesador "Carga en el registro DX, la dirección de memoria de la variable llamada
'mensaje_a_mostrar'". Enseguida le decimos que la despliegue en pantalla con la función 9h de la interrupción 21h.
Nuestra tarea está terminada, así que digamosle a la computadora que no hay más instrucciones que procesar.
int 20h

Las instrucciones están terminadas, pero todavía tenemos que decirle a la computadora que valor va a tener la variable
'mensaje_a_mostrar'.

mensaje_a_mostrar db "¡Hola Mundo!$",0

El signo de pesos al final de la cadena, es necesario para que el sistema operativo sepa en donde se acaba la cadena (una cadena
es un grupo de caracteres) que va a desplegar.

programa completo:

.model small
.stack 64

.data
mensaje_a_mostrar db 'Hola Mundo!$'

.code
; establecer modo del video
mov ah, 0fh
int 10h

; limpia pantalla
mov ah, 0
int 10h

; guardar en el registro de segmento DS, la posición del segmento de datos


mov ax,@data
mov ds, ax

;imprime el texto
lea dx, mensaje_a_mostrar
mov ah, 09
int 21h
salir:
mov ah,4ch
int 21h
end
nota: con lea dx, mensaje_a_mostrar Carga la dirección del operando fuente este equivale a: mov dx, offset mensaje_a_mostrar

También podría gustarte