Latest Entries »

Sistemas Numéricos

Binario: El sistema de numeración más simple que usa la notación posicional es el sistema de numeración binario. Este sistema, como su nombre lo indica, usa solamente dos dígitos (0,1).

Por su simplicidad y por poseer únicamente dos dígitos diferentes, el sistema de numeración binario se usa en computación para el manejo de datos e información. Normalmente al dígito cero se le asocia con cero voltios, apagado, desenergizado, inhibido (de la computadora) y el dígito 1 se asocia con +5, +12 volts, encendido, energizado (de la computadora) con el cual se forma la lógica positiva. Si la asociación es inversa, o sea el número cero se asocia con +5 volts o encendido y al número 1 se asocia con cero volts o apagado, entonces se genera la lógica negativa.

A la representación de un dígito binario se le llama bit (de la contracción binary digit) y al conjunto de 8 bits se le llama byte, así por ejemplo: 110 contiene 3 bits, 1001 contiene 4 y 1 contiene 1 bit. Como el sistema binario usa la notación posicional entonces el valor de cada dígito depende de la posición que tiene en el número, así por ejemplo el número 110101b es:

1*(20) + 0*(21) + 1*(22) + 0*(23) + 1*(24) + 1*(25) = 1 + 4 + 16 + 32 = 53d

La computadora está diseñada sobre la base de numeración binaria (base 2). Por eso este caso particular merece mención aparte. Siguiendo las reglas generales para cualquier base expuestas antes, tendremos que:

Existen dos dígitos (0 o 1) en cada posición del número.

Numerando de derecha a izquierda los dígitos de un número, empezando por cero, el valor decimal de la posición es 2n.

Por ejemplo,11012 (en base 2) quiere decir:

1*(23) + 1*(22) + 0*(21) + 1*(20) = 8 + 4 + 0 + 1 = 1310

Octal: El sistema de numeración octal es también muy usado en la computación por tener una base que es potencia exacta de 2 o de la numeración binaria. Esta característica hace que la conversión a binario o viceversa sea bastante simple. El sistema octal usa 8 dígitos (0,1,2,3,4,5,6,7) y tienen el mismo valor que en el sistema de numeración decimal. Como el sistema de numeración octal usa la notación posicional entonces para el número 3452.32q tenemos:

2*(80) + 5*(81) + 4*(82) + 3*(83) + 3*(8-1) + 2*(8-2) = 2 + 40 + 4*64 + 64 + 3*512 + 3*0.125 + 2*0.015625 = 2 + 40 + 256 + 1536 + 0.375 + 0.03125 = 1834 + 40625d entonces, 3452.32q = 1834.40625d

El subíndice que indica número octal, se usa la letra q para evitar confusión entre la letra o y el número 0.

Decimal: El sistema de numeración decimal es el más usado, tiene como base el número 10, o sea que posee 10 dígitos (o símbolos  diferentes (0, 1, 2, 3, 4, 5, 6, 7, 8, 9). El sistema de numeración decimal fue desarrollado por los hindúes, posteriormente lo introducen los árabes en Europa, donde recibe el nombre de sistema de numeración decimal o arábigo. Si se aplica la notación posicional al sistema de numeración decimal entonces el dígito número n tiene el valor: (10n)* A

Este valor es positivo y es mayor o igual que uno si el dígito se localiza a la izquierda del punto decimal y depende del dígito A, en cambio el valor es menor que uno si el dígito se localiza a la derecha del punto decimal.

Hexadecimal:  Un gran problema con el sistema binario es la verbosidad. Para representar el valor 20210 se requieren ocho dígitos binarios, la versión decimal sólo requiere de tres dígitos y por lo tanto los números se representan en forma mucho más compacta con respecto al sistema numérico binario. Desafortunadamente las computadoras trabajan en sistema binario y aunque es posible hacer la conversión entre decimal y binario, ya vimos que no es precisamente una tarea cómoda. El sistema de numeración Hexadecimal  o sea de base 16, resuelve este problema (es común abreviar Hexadecimal como hex aunque hex significa base seis y no base dieciséis). El sistema Hexadecimal es compacto y nos proporciona un mecanismo sencillo de conversión hacia el formato binario, debido a esto, la mayoría del equipo de cómputo actual utiliza el sistema numérico Hexadecimal  Como la base del sistema Hexadecimal es 16, cada dígito a la izquierda del punto Hexadecimal representa tantas veces un valor sucesivo potencia de 16, por ejemplo, el número 123416 es igual a:

1*163 + 2*162 + 3*161 + 4*160

lo que da como resultado:

4096 + 512 + 48 + 4 = 466010

Cada dígito Hexadecimal puede representar uno de dieciséis valores entre 0 y 1510. Como sólo tenemos diez dígitos decimales, necesitamos inventar seis dígitos adicionales para representar los valores entre 1010 y 1510. En lugar de crear nuevos símbolos para estos dígitos, utilizamos las letras A a la F.

Conversiones entre Bases Numéricas 

Conversión de Decimal a Binario
Para la conversión de decimal a binario se emplean dos métodos. El primero es divisiones sucesivas y el segundo es suma de potencias de 2:

POR DIVISIONES SUCESIVAS:
Se va dividiendo la cantidad decimal por 2, apuntando los residuos, hasta obtener un cociente cero. El último residuo obtenido es el bit más significativo (MSB) y el primero es el bit menos significativo (LSB).

POR SUMAS DE POTENCIAS DE 2:
Este método consiste en determinar el conjunto de pesos binarios cuya suma equivalga al número decimal.
Conversión de Fracciones Decimales a Binario

POR SUMA DE POTENCIA DE 2:
Emplea la misma metodología de la suma de potencias de 2 pero se trabaja con potencias negativas.

POR MULTIPLICACIONES SUCESIVAS:
La conversión de números decimales fraccionarios a binario se realiza con multiplicaciones sucesivas por 2. El número decimal se multiplica por 2, de éste se extrae su parte entera, el cual va a ser el MSB y su parte fraccional se emplea para la siguiente multiplicación y seguimos sucesivamente hasta que la parte fraccional se vuelva cero o maneje un error moderado. El último residuo o parte entera va a constituir el LSB.

Registros de propósito general

Los registros de propósito general se utilizan para almacenar datos temporalmente. Debido a que estos registros han evolucionado desde una máquina de 8 bits (el 8080) un grupo de registros aún se puede utilizar con un tamaño de 8 bits para mantener compatibilidad con toda la línea de procesadores.

Aún cuando estos registros pueden mantener cualquier tipo de datos, algunos tienen cierta funcionalidad específica o son usados de manera especial por algunas instrucciones.

2.1 Signo y magnitud

Normalmente utilizamos el símbolo “-” precediendo a un número para indicar que ´este es menor que cero. Esta es una notación muy practica en la vida cotidiana pero no puede ser utilizada en la representación que se hace de los números en una computadora, recordemos que solo se pueden utilizar los dígitos binarios para representar cualquier cosa en ellas y el “-” no es ningún bit. Pero podemos utilizar la misma idea, preceder el número de un bit que indique su signo, después de todo solo hay dos posibles signos, a saber: “+”y “-”. Todo lo que tenemos que hacer es asignar arbitrariamente un bit a cada signo. Convencionalmente se hace: “+” = 0, “-” = 1. A este método de representación de números negativos se le denomina signo y magnitud porque, análogamente a lo que solemos hacer, se coloca un símbolo que precede al número y que indica su signo y luego se pone la magnitud del número. En esta notación por ejemplo:

1 010102 = −1010

De esta manera es muy fácil distinguir los números positivos de los negativos, si utilizamos un número ojo de bits para representarlos y decidimos que siempre el primer bit es para el signo del número, entonces basta con observar el primer bit de la izquierda (al que en este caso no podemos decirle formalmente “el más significativo”, dado que no tiene asociada ninguna potencia de 2) para determinar si se trata de un número negativo o positivo. En este caso la “multiplicación por -1” de un número equivale a negar o invertir el bit de la extrema izquierda, esto es, convertirlo en cero si vale 1 y viceversa. De hecho la idea fundamental detrás de la representación de signo y magnitud es que ocurra: − (−a) = a. Lo que nos parece evidente por estar acostumbrados a nuestra representación de números negativos convencional.

Un inconveniente del sistema de signo y magnitud es que existen dos representaciones distintas para el cero, es decir, el neutro aditivo no es ´único formalmente hablando, tanto el 10. . .0 como el 00. . .0 son cero, el primero con signo “-”y el segundo con signo “+”, lo que tampoco es correcto desde el punto de vista maten ático, dado que el cero no es ni positivo ni negativo.

Esta dualidad del cero tiene implicaciones importantes en una computadora digital.

Los procesadores tienen generalmente instrucciones para cambiar al lujo de los programas llamadas saltos, hay saltos incondicionales (siempre que el procesador ejecuta la instrucción de salto la siguiente instrucción es aquella indicada por el salto) y hay saltos condicionales (la instrucción siguiente es a veces la que está bajo la del salto y a veces la indicada por el salto dependiendo de alguna condición). Y generalmente la condición de salto es establecida comparando algún dato con cero. Si hay dos representaciones del cero hay que hacer dos comparaciones y eso lleva más tiempo que hacer solo una.

2.2 Complemento a 1

Otra manera de representar números negativos es la conocida como complemento a 1. Para hablar de ella primero trataremos con una generalización.

Definición 1 El complemento a b − 1 de un número r, representado en k dígitos en base b se define como:

Cb−1 (rb) = (b − 1k . . . b − 11) – rb

Una alternativa de representación de números negativos en la computadora es utilizando el complemento a 1, es decir, el negativo de un número es su complemento a 1.

Al igual que en el caso de signo y magnitud se adopta la convención de que todos los números cuyo bit del extremo izquierdo sea cero son positivos y por ende, todos aquellos cuyo bit del extremo izquierdo es 1 son negativos.

2.3 Complemento a 2

Ya mencionamos el inconveniente que haya dos representaciones diferentes del cero en el contexto de nuestras computadoras digitales. Para evitar esto (que sin embargo se puede sobrellevar), se inventó otro mecanismo para representar números negativos, se denomina complemento a 2, eso nos lleva a considerar, en general, el complemento a la base.

Definición 2 El complemento a b de un número r, representado en k dígitos en base b se define como:

Cb (rb) = (1 0k . . .01) – rb

En el caso particular de base 2, el complemento a 2 de un número x2 es el resultado de sumar 1 al complemento a 1 de x2 que, como vimos, no es otro que el número negado bit a bit.

2.4 Exceso

Otro mecanismo para representar números negativos es el conocido como exceso a x.

Si el número de bits usados para representar enteros es k entonces generalmente x = 2k−1 o x = 2k−1 − 1. Por ejemplo, si se utilizan 8 bits para representar enteros entonces el sistema utilizado podría ser exceso a 128 o bien exceso a 127. La idea del sistema es que, para representar el número n en k bits se le suma a n, el valor del exceso (esto es 2 k−1 o 2k−1 − 1), obteniéndose n + e entonces n se escribe como n + e en binario (ya sin consideraciones de signo por supuesto). Por ejemplo, para escribir en 8 bits el número −10010 en exceso a 28−1 = 27 = 128 hacemos: −100+ 128 = 2810, esto en binario se escribe: 000111002 (16+8+4), por lo que, en exceso a 128 en 8 bits −10010 = 000111002. En cambio, usando las mismas condiciones (8 bits, exceso a 128): 100 + 128 = 22810 = 111001002, es decir: 10010 = 111001002. Nuevamente hay un solo cero (en exceso a 128 en 8 bits seria 100000002), lo que significa, dado que la cantidad de números representables en k bits es par, que hay un negativo o un positivo “de más”, en nuestro ejemplo es el −128 (porque su inverso aditivo seria 128 y 128 + 128 = 256, que no se puede escribir en 8 bits), el único cero es 100000002 y el rango de representatividad es: {−128, . . . ,127}, cabe señalar que los números en exceso a 2k−1 y en complemento a 2 se escriben igual salvo el bit más significativo.

INSTRUCCIONES ARITMÉTICAS 

SUMA SIN ACARREO: Consiste en sumar al contenido del registro «A» un número y obtener el resultado en el registro «A». El indicador de acarreo no se tiene en cuenta para esta operación. Su esquema sería:

suma
SUMA CON ACARREO: Exactamente igual que la anterior, pero se suma también el indicador de acarreo del registro «F». De esta forma, se puede incluir en la suma el acarreo procedente de una suma anterior. Su esquema sería:

sumaca

RESTA SIN ACARREO: Consiste en restar un número del contenido del registro «A», y obtener el resultado en este mismo registro. El indicador de acarreo no interviene en la operación. Se consideran números negativos los superiores a 127 (7Fh) es decir, el número 255 (FFh) se considera «-1», el 254 (FEh) se considera «-2» y así sucesivamente, hasta 128 (80h) que se considera «-128». El paso de 127 a 128 o viceversa se indica poniendo a «1» el flag de «overflow» (P/V) del registro «F». Su esquema sería:

 resta

RESTA CON ACARREO: Igual que el anterior, salvo que también se resta el indicador de acarreo (CF) del registro «F». Su esquema sería:

restaca

INCREMENTO: Consiste en sumar uno al contenido de un registro que se especifica en la instrucción. Su esquema es:

incremento

Donde «R» representa un registro cualquiera de 8 a 16 bits. Si se trata de un registro doble (de 16 bits) se incrementa el registro de orden bajo (por ejemplo, en el «BC» se incrementa «C»), y si ello hace que este pase a valer «0», se incrementa también el de orden alto.

DECREMENTO: Es la inversa de la anterior, consiste en restar uno al contenido de un registro. Su esquema es:

decremento

Si se trata de un registro doble, se decrementa el de orden bajo y, si esto hace que pase a valer 255 (FFh), se decrementa también el de orden alto.
Si el registro incrementado o decrementado es de 8 bits, resultan afectados los indicadores del registro «F».

COMPLEMENTO: Consiste en realizar un «complemento a 1» del acumulador, es decir, cambiar los «unos» por «ceros» y los «ceros» por «unos».

complemento

NEGACIÓN: Consiste en realizar un «complemento a 2» del acumulador, es decir, realizar un «complemento a 1» y, luego, sumarle «1». Lo que se obtiene es el «negativo» del número que teníamos en el acumulador. El efecto es el mismo que si restáramos el acumulador de «cero», es decir:

 negacion

INSTRUCCIONES LÓGICAS 

Las instrucciones lógicas realizan operaciones lógicas bit a bit con sus operandos.

Enumeración y descripción

  • AND (producto lógico)

(s) and {R|M}, {R|M|I

               (e) and al, bl ; al ← al AND bl

  • OR (suma lógica)

(s) or {R|M}, {R|M|I}

(e) or al, bl ; al ← al OR bl

  • XOR (O-exclusiva)

(s) xor {R|M}, {R|M|I}

(e) xor al, bl ; al ← al XOR bl

NOTA: Esta instrucción lógica consiste en negar cualquier otra instrucción invirtiendo sus valores.

instrucciones

Las instrucciones lógicas de dos operandos (and, or y xor) ponen siempre a ‘0’ los bits CF y OF de registro de estado después de ejecutarse (debe tenerse en cuenta que el estado de estos bits sólo tiene significado tras la ejecución de las instrucciones aritméticas). Los bits SF y ZF se modifican siguiendo los mismos criterios que en las instrucciones aritméticas.
La instrucción lógica de un operando (not) no modifica ningún bit del registro de estado tras su ejecución.

INSTRUCCIONES DE DESPLAZAMIENTOS 

Las instrucciones de desplazamiento son cuatro: shl, shr, sar y sal; y su objetivo es desplazar los bits de un operando un determinado número de posiciones a la izquierda o a la derecha.La estructura de los operandos manejados por estas instrucciones y su significado es idéntico para las cuatro instrucciones. Todas ellas trabajan sobre un operando fuente y un operando destino.

El Operando Destino contiene el dato que va a ser objeto del desplazamiento y debe ser del tipo, registro o memoria.
El Operando Fuente determina la cantidad de posiciones que va a ser desplazado el operando destino. El operando fuente sólo puede ser un dato inmediato de 8 bits (I8) o bien el registro CL.

SHL (Shift Left = desplazamiento a la izquierda)

Se desplazan a la izquierda los bits del operando destino tantas posiciones como indique el operando fuente. El desplazamiento de una posición se realiza de la siguiente forma: el bit de mayor peso del operando se desplaza al bit CF del registro de estado, el resto de los bits se desplazan una posición hacia la izquierda, y la posición de menor peso se rellena con un 0. Este proceso se representa en la figura siguiente.

shl

SHR (Shift Right = desplazamiento a la derecha)

La instrucción shr funciona de la misma forma que shl, pero desplazando los bits a la derecha en lugar de a la izquierda, tal y como se muestra en la figura siguiente.

shr

SAR (Shift Arithmetic Right = desplazamiento aritmético a la derecha)

Esta instrucción desplaza los bits del operando destino a la derecha tantos bits como indique el operando fuente. Esta forma de funcionamiento es similar a la de la instrucción shr; sin embargo, ambas instrucciones se diferencian en que sar, en vez introducir ceros por la izquierda del operando, replica el bit de mayor peso (bit de signo) en cada desplazamiento. esquemáticamente, la instrucción sar trabaja de la siguiente forma:

 sar

El desplazamiento a la derecha realizado por la instrucción sar recibe el nombre de aritmético porque sirve para dividir un operando entre una potencia entera de 2.

El desplazamiento aritmético a la derecha de un operando (considerado con signo) n posiciones equivale a la división entera del operando entre 2n.

 SAL (Shift Arithmetic Left = desplazamiento aritmético a la izquierda)

El objetivo de un desplazamiento aritmético a la izquierda es multiplicar un operando, interpretado con signo, por una potencia de 2.

sal

Para llevar a cabo este tipo de desplazamiento, hay que desplazar los bits del operando hacia la izquierda introduciendo ceros por su derecha. En realidad, este tipo de desplazamiento es idéntico al llevado a cabo por la instrucción shl; por tanto, sal y shl son, de hecho, la misma instrucción y se codifican con el mismo código máquina.

INSTRUCCIÓN DE ROTACIÓN DE BITS (Con o Sin Acarreos)

RCL     DESTINO, CONTADOR     ; Rota destino a través de carry a la izquierda contador veces

RCR     DESTINO, CONTADOR     ; Rota destino a través de carry a la derecha contador veces

ROL     DESTINO, CONTADOR     ; Rota destino a la izquierda contador veces

ROR     DESTINO, CONTADOR     ; Rota destino a la derecha contador veces

SAL     DESTINO, CONTADOR     ; Desplaza destino a la izquierda contador veces y rellena con ceros

SAR     DESTINO, CONTADOR     ; Desplaza destino a la derecha contador veces y rellena con bit SF

SHR     DESTINO, CONTADOR     ; Desplaza destino a la derecha contador veces y rellena con ceros

NOTA: El DESTINO va a ser la dirección y el CONTADOR es el número de veces que se retira la instrucción.

rotacion

INSTRUCCIONES PARA MANEJO DE PILAS 

POP (Extraer de la Pila)

Sintaxis:    POP Destino

Indicadores:   OF   DF   IF   TF   SF   ZF   AF   PF   CF

Transfiere el elemento palabra que se encuentra en lo alto de la pila (apuntado por SP) al operando destino que a de ser tipo palabra, e incrementa en dos el registro SP. La instrucción POP CS, poco útil, no funciona correctamente en los 286 y superiores.

Ejemplos:

pop    ax

pop    pepe

PUSH (Introduce en la Pila)

Sintaxis:    PUSH Origen

Indicadores: OF DF IF TF SF ZF AF PF CF

Decrementa el puntero de pila (SP) en 2 y luego transfiere la palabra especificada en el operando origen a la cima de la pila. El registro CS aquí sí se puede especificar como origen, al contrario de lo que afirman algunas publicaciones.

Ejemplo:

push cs

POPF (Extrae los Indicadores de la Pila)

Sintaxis:    POPF

Indicadores:    OF   DF   IF   TF   SF   ZF   AF   PF   CF

x      x      x      x      x     x       x      x       x

Traslada al registro de los indicadores la palabra almacenada en la cima de la pila; a continuación el puntero de pila SP se incrementa en dos.

PUSHF (Introduce los Indicadores en la Pila)

Sintaxis:   PUSHF Indicadores:   OF DF IF TF SF ZF AF PF CF

Decrementa en dos el puntero de pila y traslada a la cima de la pila el contenido de los indicadores.

DIFERENCIA ENTRE PROGRAMAS .COM Y .EXE

La principal diferencia es que el formato EXE no restringe el tamaño del ejecutable, en cambio el COM está restringido como máximo a ocupar un solo segmento de memoria (un espacio de memoria de 64 kB); además hay que incluir los 256 bytes que ocupa el PSP. Este límite fue dado en una época en la que esta cantidad de espacio era más que suficiente para poder realizar cualquier clase de tarea, pero con el paso del tiempo este límite termino siendo absurdo (hoy en día gran parte de los programas de computadoras ocupan miles de veces más espacio). De todas formas es posible hacer que un programa COM pueda extender este límite usando el enunciado SEGMENT AT.

Un programa COM es prácticamente una imagen en memoria del archivo en disco, menos por el PSP que es creado durante el proceso de inicialización, y es por esta razón que el programa se inicia a partir del offset 0x100 (en assembler se utiliza el operador ORG). En cambio el formato EXE reorganiza sus segmentos en la memoria dando un tamaño adecuado (que es posible y necesario que el programador lo determine, dependiendo del lenguaje en el cual fue escrito), es por esta razón que dentro de la cabecera de un archivo EXE hay cierto código que realiza esta tarea.

El utilitario EXE2COM cambiaba de un formato a otro.

INTERRUPCIONES 

Las interrupciones son un método del que disponen los dispositivos e incluso los procesos para hacer notar a la CPU la aparición de alguna circunstancia que requiera su intervención. De este modo, los dispositivos pueden provocar que la CPU deje por el momento la tarea que estaba realizando y atienda la interrupción. Una vez atendida, seguirá con su labor anterior.

TIPOS DE INTERRUPCIONES 

a)- Interrupciones de Programa: son aquellas que se producen cuando la CPU detecta una condición extraordinaria durante la ejecución de una instrucción e programa.

La mayoría de las interrupciones de programa, por naturaleza de la misma obliga a la cancelación de programa que las produjo, lo que se denomina finalización anormal de un programa; mientras en algunos casos es posible recuperar la condición presentada y continuar la ejecución del programa una vez que se termine la interrupción.

b)- Interrupciones de Llamada al Supervisor: Las Interrupciones de Llamada al Supervisor (SVC: Supervisor Call) es una forma de permitir la comunicación entre los programas y el sistema operativo, para que este cierta acciones que por naturaleza están reservadas, debido a que implican el manejo de recursos y operaciones cuyo acceso no está permitido a los programas de usuarios.

La mayoría de las interrupciones SVC, implica que una o más instrucciones especiales serán ejecutadas por el SO  Generalmente, se puede continuar ejecutando el programa que produjo.

c)- Interrupciones de Falla de Maquina: este tipo de interrupciones ocurre cuando, los circuitos especiales (incorporados en la mayoría de las computadoras actuales) detectan condiciones de error de los componentes de hardware.

d)- Interrupciones de Entrada/Salida: los dispositivos periféricos pueden operar de forma independiente del procesador central que controlan las operaciones de los mismos. Esto permite que un dispositivo particular controle la operación que está realizando por completo. Al concluir esta operación   en forma satisfactoria o  no, es necesario notificar al sistema operativo, para que este pueda tomar las acciones correspondiente e iniciar, siempre que sea posible, nuevas operaciones en dicho dispositivos. Esta notificación se realiza a través de una interrupción.

En todos los casos cuando se introduce una interrupción de E/S, debe suspenderse la ejecución del programa que estaba en la CPU, para atender la interrupción producida, y posteriormente reiniciar la ejecución del programa que fue interrumpido.

e)- Interrupciones Externas: son interrupciones provocadas por condiciones externas al programa que se está ejecutando, y no son provocadas por culminación de operaciones en dispositivos de E/S.

DIFERENCIAS ENTRE COMPILADORES Y ENSAMBLADORES

Los COMPILADORES: como los desarrollados para Fortran, Clipper, COBOL, Pascal o C, que en vez de llamar y ejecutar una rutina en lenguaje de máquina, éstos juntan esas rutinas para formar el código objeto que, después de enlazar las rutinas de run-time y llamadas a otros programas y servicios del sistema operativo, se transformará en el programa ejecutable.

Los ENSAMBLADORES: son como una versión reducida y elemental de un compilador (pero que de ninguna manera deben considerarse como tales), ya que lo único que tienen que hacer es cambiar toda referencia simbólica por la dirección correspondiente, calcular los saltos, resolver referencias y llamadas a otros programas, y realizar el proceso de enlace. Los ensambladores son programas destinados a realizar el ensamblado de un determinado código.

REQUERIMIENTO DEL LENGUAJE ENSAMBLADOR

  1. Software Necesario
  2. Utilización del MASM
  3. Uso del Enlazador (LINKER)
  • SOFTWARE NECESARIO 

Para poder crear un programa se requieren varias herramientas:

Un editor para crear el programa fuente.

Un compilador que no es más que un programa que «traduce» el programa fuente a un programa objeto.

Un enlazador o linker, que genere el programa ejecutable a partir del programa objeto.

El editor puede ser cualquier editor de textos que se tenga a la mano, como compilador utilizaremos el MASM (macro ensamblador de Microsoft) ya que es el más común, y como enlazador utilizaremos el programa link.

La extensión usada para que MASM reconozca los programas fuente en ensamblador es .ASM; una vez traducido el programa fuente, el MASM crea un archivo con la extensión .OBJ , este archivo contiene un «formato intermedio» del programa, llamado así porque aún no es ejecutable pero tampoco es ya un programa en lenguaje fuente. El enlazador genera, a partir de un archivo .OBJ o la combinación de varios de estos archivos, un programa ejecutable  cuya extensión es usualmente .EXE aunque también puede ser .COM, dependiendo de la forma en que se ensambló.

  • UTILIZACIÓN DEL MASM

Una vez que se creó el programa objeto se debe pasar al MASM para crear el código intermedio, el cual queda guardado en un archivo con extensión .OBJ. El comando para realizar esto es:

MASM Nombre_Archivo; [Enter]

Donde Nombre Archivo es el nombre del programa fuente con extensión .ASM que se va a traducir. El punto y coma utilizados después del nombre del archivo le indican al macro ensamblador que genere directamente el código intermedio, de omitirse este carácter el MASM pedirá el nombre del archivo a traducir, el nombre del archivo que se generará así como opciones de listado de información que puede proporcionar el traductor.

Todo parámetro va después del símbolo » /”. Es posible utilizar varios parámetros a la vez. Una vez tecleados todos los parámetros se escribe el nombre del archivo a ensamblar.

Por ejemplo, si queremos que el MASM ensamble un programa llamado prueba, y además deseamos que despliegue el número de líneas fuente y símbolos procesados (eso lo realiza con el parámetro /v), y si ocurre un error que nos diga en que línea ocurrió ( con el parámetro /z ), entonces tecleamos:

MASM /v /z prueba;

  • USO DEL ENLAZADOR (LINKER)

El MASM únicamente puede crear programas en formato .OBJ, los cuales no son ejecutables por si solos, es necesario un enlazador que genere el código ejecutable.

La utilización del enlazador es muy parecida a la del MASM, únicamente se teclea en el indicador del DOS:

LINK Nombre… Archivo;

Donde Nombre… Archivo es el nombre del programa intermedio (OBJ). Esto generara directamente un archivo con el nombre del programa intermedio y la extensión .EXE

SEGMENTO DE UN PROGRAMA EN LENGUAJE ENSAMBLADOR

Definición de Segmentos

Para realizar esta acción se utilizan las denominadas directivas de segmento. Se pueden utilizar las directivas largas o las simplificadas.

Directivas Largas Directivas de Segmento:    SEGMENT, ENDS y END

SEGMENT: Directiva para definir un segmento, el tamaño máximo de un segmento es de 64kb

ENDS: Directiva para finalizar un segmento

Formato:

Nombre    Directiva    alineación    [combinación]    [clase]

Alineación: Indica el límite en el que inicia el segmento, por omisión alinea el segmento al límite de un párrafo, de manera que la dirección inicial es divisible entre 16 0 10h, el requerimiento típico es PARA.

Combinación: Indica si el segmento se combina con otros segmentos cuando son enlazados después de ensamblar, los tipos son STACK, COMMON, PUBLIC y la expresión AT.

Para la pila es:

Nombre SEGMENT PARA STACK

Se puede utilizar PUBLIC y COMMON en donde tenga el propósito de combinar de forma separada programas ensamblados cuando los enlaza.

Clase: Es encerrada entre apóstrofes, es utilizada para agrupar segmentos cuando se enlazan.

Se utilizan ´code´ con CS, ‘data’ para DS, ‘stack’ para SS.

END: : Directiva para definir el fin del programa.

DIRECTIVAS Y DIRECTIVAS SIMPLIFICADAS DEL LENGUAJE ENSAMBLADOR

Directivas: Son órdenes para el ensamblador y no tienen traducción a código máquina. y utilizaremos:

ORG: Inicializa el contador de programa con el valor del operando. Si no se utiliza una directiva ORG, se asume que el PC vale 0.

Sintaxis:   ORG valor

EQU: Asigna al símbolo contenido en el campo etiqueta el valor de la expresión en el campo operando.

Sintaxis:   etiqueta EQU valor

DC: Define constantes en memoria. Permite asignar valores numéricos  tablas, caracteres a variables de memoria. y se pueden asignar hasta 256 bytes de datos en una única directiva.

Sintaxis:   etiqueta DC.t const1, const2…

Directivas simplificadas: Son formas abreviadas para definir segmentos, para usarlas primero se debe definir el modelo de memoria antes de definir algún segmento

La directiva simplificada .MODEL crea por omisión a los segmentos y los enunciados ASSUME y GROUP necesarios. Formato de definición de memoria:

.MODEL modelo de mem

directiva

Los formatos generales para las directivas de segmento son:

.STACK [tamaño]

.DATA

.CODE [nombre]

Cada una de estas directivas hace que el ensamblador genere el enunciado SEGMENT necesario y su correspondiente ENDS. El tamaño de la pila es de 1024 bytes, el cual puede pasarse por alto. Los nombres de los segmentos (que no se tienen que definir) por omisión son STACK, DATA y TEXT (código)

ESTRUCTURA GENERAL DE UN PROGRAMA EN LENGUAJE ENSAMBLADOR 

Un programa en el lenguaje ensamblador consiste de una secuencia de proposiciones, una en cada línea del código fuente.

La sintaxis de una proposición es la siguiente:

[Etiqueta] [instrucción| directiva [operandos]] [; Comentario]

Donde etiqueta, instrucción| directiva, operandos, comentario son los campos de la proposición. Los campos se separan por caracteres blancos: caracteres de espacio y/o de tabulación. Todos los campos son opcionales, pero el campo operandos sólo pueden estar presente si existe el campo instrucción| directiva.

Etiqueta: es un nombre simbólico empleado para referirse a números, cadenas de caracteres o localidades de memoria dentro de un programa. Las etiquetas permiten darle nombre a las variables, constantes y localidades de una instrucción particular.

Las etiquetas pueden contener los siguientes caracteres: A-Z a-z _ @ $ ? 0-9. Los dígitos 0-9 no pueden usarse como el primer carácter de una etiqueta. Un sólo carácter $ o ? no puede usarse como etiqueta ya que tienen un significado especial.

Las etiquetas deben ser únicas. Con excepción de las definidas con la directiva =, y las etiquetas locales de macros y subrutinas. Las etiquetas pueden usarse como operandos tantas veces como se desee.

Una etiqueta puede aparecer por sí sola en una línea. En este caso el valor asociado a la etiqueta es la dirección de la operación en la siguiente línea en el programa.

Las palabras reservadas no pueden usarse como etiquetas.

Las etiquetas que aparecen solas en una línea y las que van seguidas de una instrucción deben terminar en dos puntos (:). Las demás etiquetas por lo general no terminan en dos puntos.

Instrucción: es un mnemónico de una instrucción del procesador. Cada instrucción se traduce directamente a una instrucción del lenguaje máquina del microprocesador.

Directiva: es una instrucción para el ensamblador. No produce código ejecutable, sino que controla varios de los aspectos de cómo opera el ensamblador: el tipo de código generado (8086, 80286, 80386, etc.), los segmentos a usar, etc.

Operandos: consiste de cero, uno o más operandos. Un operando le especifica al ensamblador qué valor, registro, localidad de memoria, etc., asociar con cada instrucción.

Hay varias clases de operandos: registros, constantes, etiquetas, variables y cadenas.

El tipo y número de operandos depende de la instrucción o directiva.

Si hay dos o más, van separados por comas (,)

Comentario: es cualquier secuencia de caracteres precedidos por un punto y coma (;) y que termina con el fin de la línea.

Los comentarios son ignorados por el ensamblador

Las líneas en blanco se tratan como comentarios.

estruct        estruc

PROCESO DE EDICIÓN, ENSAMBLANDO, LIGADO DE INSTRUCCIONES EN LENGUAJE ENSAMBLADOR

EDICIÓN

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 líneas 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

LINK

De la misma forma que el ensamblado, la fase de liga se lleva a cabo con el LINK. Este puede ser invocado de la misma forma que el MASM. Los parámetros que este requiere son:

LINK objeto [,[ejecutable][,[mapa][,[librería]]]]][opciones][;]

Dónde:

Objeto.- Es el nombre para el archivo .OBJ

Ejecutable.- Nombre del archivo .EXE

Mapa.- Nombre del archivo mapa

Librería.- Nombre del archivo biblioteca de rutinas

EJECUCIÓN

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. El proceso completo para poder crear un programa ejecutable con el Microsoft Macro Assembler se muestra abajo.

PROCEDIMIENTOS EN LENGUAJE ENSAMBLADOR

El ensamblador asigna direcciones a las instrucciones. Cada vez que hacemos un cambio al programa, debemos ensamblar nuevamente dicho programa.

1.- Entramos al MS-DOS
INICIO—ACCESORIOS—MS-DOS

msdos

2.- Entramos a TASM

cd..
cd..
cd tasm

tasm

3.- Creamos nuestros ARCHIVO
edit nombre del archivo con la extencion .CPP

edit

INSTRUCCIONES DE SALTO CONDICIONAL E INCONDICIONAL

Instrucciones de salto condicional: Las instrucciones de salto condicional hacen que el control de flujo del programa salte a la instrucción cuya dirección está especificada por su operando si se cumple una condición dada.

jcond dirección

Cambian la dirección de la siguiente instrucción a ser ejecutada dependiendo del valor de ciertas banderas.

Sintaxis:

jcond etiqueta

Todas las instrucciones de salto condicional operan en forma similar. jcond es el mnemónico de la instrucción y etiqueta es la etiqueta de la dirección donde está la instrucción a la que va a saltar el programa. Los mnemónicos de las instrucciones de salto condicional pueden clasificarse en tres grupos: En la tabla 5-1a están los saltos cuya condición de salto es el resultado de una comparación de dos números no signados; en la tabla 5-1b se muestran los saltos cuya condición de salto es el resultado de una comparación de dos números signados; mientras que en la tabla 5-1c están los saltos cuya condición de salto es el resultado de una bandera o el registro CX. Aunque en las instrucciones de salto de las tablas 5-1a y 5-1b se dice que la condición de salto es el resultado de una comparación, la instrucción utiliza el valor de una o dos banderas para ejecutar o no el salto.

Instrucciones de salto incondicional: La instrucción de salto incondicional hace que el control de flujo del programa salte a la instrucción cuya dirección está especificada por su operando.

jmp dirección

La instrucción jmp hace que la ejecución del programa continué en la dirección especificada por el operando.

Sintaxis:

jmp        etiqueta

jmp        regW|memW

jmp        memDW

La dirección puede ser una etiqueta o estar en un registro o localidad de memoria. En el caso de usar un registro o localidad de memoria de una palabra, el salto es a una instrucción que se encuentra en el mismo segmento y el valor representa el desplazamiento de la instrucción con respecto al segmento. En el caso de que la dirección esté en una localidad de memoria de tipo palabra doble, el salto es a otro segmento y el valor es el segmento: desplazamiento de la instrucción.

La instrucción jmp no afecta a las banderas.

 

CIBERGRAFIA:

http://www.fismat.umich.mx/~elizalde/curso/node110.html

http://www.dav.sceu.frba.utn.edu.ar/homovidens/juri/Bits/…/repres.htm

tecnologiayinformatica.bligoo.com.ar/unidad-logica-aritmetica-alu

mmc.geofisica.unam.mx/…/…

computadoras.about.com › … › Conoce tu PC › Procesadores

usuarios.multimania.es/tutoinformatica/memoria.html

locombia.galeon.com/bus.htm

equiposmicroinformaticos.wikispaces.com/FUNCIONAMIENTO+DE…

http://www.itson.mx/die/eromero/biblioelec/bsistdig2/Transf_reg.pd

learnassembler.com/registro.html

http://www.uclm.es/profesorado/…/13_CBas-EstructuraComputador_itis.pd…

http://www.infor.uva.es/~bastida/OC/modos.pdf

http://www.dte.us.es/tec_inf/itis/estr_comp/docweb/…/tema4ec-2.pdf

http://www.reocities.com/collegepark/hall/7317/arqcomp/micro.htm

atc2.aut.uah.es/~avicente/asignaturas/ec/pdf/ec_t4.pdf

ciceron.galeon.com/diferenciascom.html

mimosa.pntic.mec.es/~flarrosa/raton.pdf

http://www.ciens.ucv.ve:8080/genasig/sites/…del…II/…/Interrupciones.pd

tutorialensamblador.galeon.com/unidad5.html

http://www.itson.mx/…/Programacion_Lenguaje_Ensamblador8086/Tema0…

http://www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r36913.PDF

ocw.usal.es/…/Tema_7_-_Lenguajes_de_Programacion.PDF
 

 

Se presenta a continuación un esquema en bloques de un sistema básico de un computador y sus funciones esenciales, ALU ( Arithmetic Logic Unit), unidad de control, unidad de I/O y memoria central. Todos los demás componentes agregados al sistema se denominan periféricos , y vinculan al sistema con el mundo exterior, para intercambiar y visualizar datos.

micro

Los datos introducidos en el computador se utilizan como base para operaciones de todo tipo, aritméticas, lógicas, Son funciones realizadas por la ALU que además contiene registros especiales y de uso general donde procesa la información antes y después de su uso. Luego será almacenada en la memoria central , que es la zona de almacenamiento de gran capacidad, se guardan aquí tanto datos como programas ejecutables.

Todo el sistema es controlado por la unidad de control que genera las señales temporización y sincronización de todo el sistema. A partir de esta breve descripción se pueden apreciar en la arquitectura del sistema dos elementos diferentes en cuanto a sus características; los circuitos eléctricos / electrónicos que constituyen al procesador y lo que se ha dado en llamar el programa ( conjunto de operaciones denominadas instrucciones. Los programas a utilizar suelen estar en la memoria central del sistema. Cada una de las celdas que componen la memoria central debe ser seleccionada por la unidad central para poder ordenar la información allí guardada y de esta manera poder transformar los datos en una secuencia determinada para obtener el resultado deseado de la operación de los mismos.

Esta selección se denomina direccionamiento y lo realiza la unidad de control por medio del registro de direccionamiento, y su función es almacenar la dirección a ejecutar del sistema.

UC1

La descripción anterior presenta un tratamiento secuencial de instrucciones que es sincronizado por un reloj ( CLOCK). La comunicación entre la unidad central y el resto del sistema puede realizarse a través de una estructura como la de arriba representada, donde se muestran conjuntos de líneas denominadas bus. Generalmente pueden distinguirse tres indispensables en cualquier tipo de estructura de datos, ellos son datos (data), direcciones(address) y control(control).

FUNCIONAMIENTO DEL MICROPROCESADOR

El microprocesador ejecuta instrucciones almacenadas como números binarios en la memoria principal . La ejecución se puede realizar en varias fases:

PreFetch, Pre lectura de la instrucción desde la memoria principal.

Fetch, envió de la instrucción al decodificador (una parte de la CPU).

Decodificación de instrucción, es decir determinar que instrucción es y por tanto que se debe hacer.

Lectura de operandos (si los hay).

Ejecución de la micro-instrucción.

Escritura de los resultados, primero en el registro acumulador y después en la memoria RAM si fuera necesario.

Cada una de estas fases se realiza en uno o varios ciclos de CPU, dependiendo de la estructura del procesador, y concretamente de su grado de segmentación. La duración de estos ciclos viene determinada por la frecuencia de reloj, y nunca podrá ser inferior al tiempo requerido para realizar la tarea individual (en un solo ciclo) de mayor tiempo. El microprocesador se conecta a un oscilador que genera varios ciclos en un segundo.

Las instrucciones que lee, interpreta y ejecuta el procesador están escritas en su propio lenguaje, el lenguaje-máquina. También se utiliza un lenguaje de más alto nivel el ensamblador. Cada modelo de procesador tiene su propio lenguaje-máquina y necesita su propio ensamblador, es decir, las instrucciones de los AMD e Intel serán distintas.

FAMILIAS DE MICROPROCESADORES INTEL

 evolucion-de-los-microprocesadores-segunda-parte_22680_4_1

ALU: una unidad aritmética lógica (alu) es un circuito digital que realiza operaciones aritméticas y lógicas operaciones. La alu es un componente fundamental de la unidad central de procesamiento (CPU) de un ordenador, e incluso el más simple microprocesadores contienen una para fines tales como el mantenimiento de los temporizadores. Los procesadores se encuentran dentro de las modernas CPU y unidades de procesamiento gráfico (gpu) acomodar alu muy potente y muy complejo, de un solo componente puede contener un número de alus.

La unidad de punto flotante: realizan las operaciones sobre los números decimales. Estas unidades suelen ser más complejas y por lo tanto necesitan de más área dentro del micro. Esto es lo que ha llevado a AMD a integrar solo una cada dos núcleos en su arquitectura CMT.

Funciones de la UC

–Lectura de las instrucciones (fetching).

–Decodificación de las instrucciones.

–Ejecución de las instrucciones.

–Resolución de situaciones particulares (interrupciones, trampas).

Para ejecutar un programa, la UC va leyendo y ejecutando las instrucciones una por una.

–La ejecución de un programa se compone de una secuencia de ciclos de instrucción.

Unidad de interfaz en el Bus

Es la parte con la cual el microprocesador se comunica con el mundo exterior a través de sus buses y líneas de control, algunas de las operaciones que realiza esta unidad son las siguientes:

·        Carga las instrucciones

·        Lee las operaciones

·        Escribe los resultados

MEMORIA

Los circuitos que permiten almacenar y recuperar la información. En un sentido más amplio, puede referirse también a sistemas externos de almacenamiento, como las unidades de disco o de cinta. Por lo general se refiere sólo al semiconductor rápido de almacenaje (RAM) conectado directamente al procesador.

MEMORIA DE ACCESO ALEATORIO O RAM 

En informática, memoria basada en semiconductores que puede ser leída y escrita por el microprocesador u otros dispositivos de hardware. Es un acrónimo del inglés Random Access Memory. Se puede acceder a las posiciones de almacenamiento en cualquier orden.

CACHÉ DE DISCO

En informática, una parte de la memoria de acceso aleatorio de un ordenador o computadora que se reserva para contener, de manera temporal, información leída o escrita recientemente en el disco. La memoria caché de disco realiza distintas funciones: en unos casos, almacena direcciones concretas de sectores; en otros, almacena una copia del directorio y en otros, almacena porciones o extensiones del programa o programas en ejecución

MEMORIA PROGRAMABLE O BORRABLE O DE SÓLO LECTURA O EPROM

En informática, tipo de memoria, también denominada reprogramable de sólo lectura (RPROM, acrónimo inglés de Reprogrammable Read Only Memory). Las EPROM (acrónimo inglés de Erasable Programmable Read Only Memory) son chips de memoria que se programan después de su fabricación. Son un buen método para que los fabricantes de hardware inserten códigos variables o que cambian constantemente en un prototipo, en aquellos casos en los que producir gran cantidad de chips PROM resultaría prohibitivo. Los chips EPROM se diferencian de los PROM por el hecho de que pueden borrarse por lo general, retirando una cubierta protectora de la parte superior del chip y exponiendo el material semiconductor a radiación ultravioleta, después de lo cual pueden reprogramarse.

MEMORIA PROGRAMABLE DE SOLO LECTURA O PROM

En informática, tipo de memoria de sólo lectura (ROM) que permite ser grabada con datos mediante un hardware llamado programador de PROM. Una vez que la PROM ha sido programada, los datos permanecen fijos y no pueden reprogramarse. Dado que las ROM son rentables sólo cuando se producen en grandes cantidades, se utilizan memorias programables de sólo lectura durante las fases de creación del prototipo de los diseños. Nuevas PROM pueden grabarse y desecharse durante el proceso de perfeccionamiento del diseño.

MEMORIA DE SOLO LECTURA O ROM

En informática, memoria basada en semiconductores que contiene instrucciones o datos que se pueden leer pero no modificar. Para crear un chip ROM, el diseñador facilita a un fabricante de semiconductores la información o las instrucciones que se van a almacenar. El fabricante produce entonces uno o más chips que contienen esas instrucciones o datos. Como crear chips ROM implica un proceso de fabricación, esta creación es viable económicamente sólo si se producen grandes cantidades de chips. Los diseños experimentales o los pequeños volúmenes son más asequibles usando PROM o EPROM. El término ROM se suele referir a cualquier dispositivo de sólo lectura, incluyendo PROM y EPROM.

MEMORIA EXPANDIDA

En informática, en los PC de IBM y en los compatibles, organización lógica de memoria, de hasta 8 megabytes (MB) que puede utilizarse en las máquinas que ejecutan MS-DOS en modo real (emulación de 8086). El uso de la memoria expandida está definido en la EMS (Especificación de Memoria Expandida). Como representa la memoria a la que normalmente no acceden los programas que ejecutan MS-DOS, la memoria expandida requiere una interfaz denominada EMM (Gestor de Memoria Expandida), que asigna páginas (bloques) de bytes de la memoria expandida según se necesiten. Sólo el software compatible con EMS puede utilizar la memoria expandida.

MEMORIA EXTENDIDA

En informática, la parte de memoria del sistema que supera 1 megabyte (MB) en las computadoras basadas en procesadores Intel 80286/386/486. Sólo se puede tener acceso a esta memoria cuando el procesador trabaja en modo protegido o en modo virtual real en los equipos 386/486. Normalmente MS-DOS no puede utilizar la memoria extendida. Puede permitirse el acceso a esta memoria mediante la utilización de un determinado software que hace que el microprocesador quede en modo protegido, o mediante el uso de las posibilidades que los procesadores 386 y 486 tienen para asignar determinadas porciones de la memoria expandida como memoria convencional. Para ello se utilizan las convenciones EMS.

BUFFER DE MEMORIA INTERMEDIA

En informática, depósito de datos intermedio, es decir, una parte reservada de la memoria en la que los datos son mantenidos temporalmente hasta tener una oportunidad de completar su transferencia hacia o desde un dispositivo de almacenamiento u otra ubicación en la memoria. Algunos dispositivos, como las impresoras o como los adaptadores que las soportan, suelen tener sus propios buffers.

MEMORIA CACHÉ L2 (Segundo nivel)

Almacena los datos transferidos más recientemente entre la memoria RAM y el microprocesador.

Así, si el microprocesador necesita algo de esta información accede directamente a la caché sin acudir a la RAM. De esta forma acelera la ejecución de las instrucciones del microprocesador ya que la caché trabaja más rápido que la RAM.

REGISTROS 

Los registros del procesador se emplean para controlar las instrucciones en ejecución, manejar direccionamiento, y proporcionar capacidad aritmética.

Son direccionables por medio de un nombre, los bits se numeran de derecha a izquierda

Los registros se pueden clasificar como:

Registros de propósito general. Almacenan datos y están disponibles para ser usados por el programador.

Registros de segmento. Estos registros permiten direccionar la memoria.

Apuntador de instrucción. Este es un registro especial que apunta a la siguiente instrucción a ejecutar.

Registros de punto flotante. Como su nombre lo indica estos registros se utilizan para realizar operaciones de punto flotante.

BUSES DE DATOS

El bus es la vía de comunicación para los datos y señales de control en la estructura de un computador, entre la CPU y los diferentes órganos que se le deben poner si se tratan de las pistas o cintas de cobre impresas en la placa principal se llama bus del sistema.

El bus esta formado básicamente por tres: bus de datos ,bus de direcciones y bus de control.

BUS DE DATOS: Es el encargado de transmitir los caracteres.

BUS DE DIRECCIÓN: Es el encargado de direccionar los datos a su origen o destino.

BUS DE CONTROL: Es el encargado de conducir las señales IRQ de solicitud de interrupción que hacen los dispositivos al microprocesador.

BUS DE ESPANCIÓN: Se le llama al conjunto de líneas eléctricas y circuitos electrónicos de control encargados de conectar el bus del sistema de la tarjeta madre con los buses de dispositivos accesorios, tal como una tarjeta controladora de disco, una tarjeta de video  y MODEM.

INTERRUPCIONES

Se entiende por interrupciones a los servicios que se ejecutan por medio de una pedido de intervención al funcionamiento del microprocesador y provienen del exterior del sistema. Podemos definir dos tipos fundamentales de interrupciones, de hardware, y de software. Entre las primeras podemos además distinguir, mascarables, no mascarables y del sistema. Todas las interrupciones que pueden intervenir poseen una jerarquía unívoca, ya que dadas las circunstancias pueden producirse dos simultáneamente. Procesadores más popularizados de la línea Intel son:

iAPX 8088/8086
iAPX 80286
iAPX 80386
iAPX 80486
Pentium

UNIDAD DE PUNTO FLOTANTE

Una Unidad de Punto Flotante (Floating Point Unit en inglés) es un componente de la CPU especializado en el cálculo de operaciones en coma flotante. Las operaciones básicas que toda FPU puede realizar son las aritméticas (suma y multiplicación), si bien algunos sistemas más complejos son capaces también de realizar cálculos trigonométricos y/o exponenciales.

No todas las CPUs tienen una FPU dedicada. En ausencia de FPU, la CPU puede utilizar programas en micro código para emular una función en coma flotante a través de la unidad aritmético-lógica (ALU), la cual reduce el coste del hardware a cambio de una sensible pérdida de velocidad.
En algunas arquitecturas, las operaciones en coma flotante se tratan de forma completamente distinta a las operaciones enteras, con registros dedicados y tiempo de ciclo diferentes. Incluso para operaciones complejas, como la división, podrían tener un circuito dedicado a dicha operación.
Hasta mediados de la década de los 90 del siglo pasado, era común que las CPU no incorporasen una FPU en los ordenadores domésticos, sino que eran un elemento opcional conocido como coprocesador. Ejemplos podrían ser las FPUs 387 y 487 que se utilizaban en las CPUs 386 y 486SX (el modelo 486DX ya incluía el coprocesador de serie) en máquinas Pentium, o la FPU 68881 utilizada en las CPUs 680×0 en ordenadores Macintosh. Sin embargo, a partir de dichas CPUs, la FPU se convirtió en un elemento común presente en la mayoría de procesadores domésticos (series Pentium y PowerPC en adelante.

UNIDAD DE INTERFAZ EN EL BUS

La unidad de interfaz del bus o unidad E/S, es la parte del procesador que se une con el resto de la PC. Debe su nombre al hecho de que realiza los movimientos de datos hacia el bus de datos del procesador, el primer conducto en la transferencia de información hacia y desde el CPU. La BIU es la responsable de responder a todas las señales que van al procesador, y de generar todas las señales que van del procesador a las demás partes del sistema. También sirve de paso a las instrucciones de programa y los datos para que éstos puedan alcanzar los registros de la unidad de control y de la ALU. La BIU sincroniza los niveles de las señales de la circuitería interna del microprocesador con los de los otros componentes dentro de la PC. Los circuitos internos de un microprocesador, por ejemplo, se diseñan para consumir poca electricidad de modo que puedan funcionar más rápidamente y evitar el calentamiento excesivo. Estos circuitos internos delicados no pueden manejar los voltajes más altos necesarios para los componentes externos. Por lo tanto, cada señal que sale del microprocesador pasa a través de un buffer de señal intermedio en la BIU que incrementa su voltaje.

UNIDADES FUNCIONALES BASICAS DE UN MICROPROCESADOR

En la terminología de microprocesadores, a cada grupo de circuitos que desempeñan diferentes tareas importantes se les denomina «unidad funcional», y el conjunto de unidades funcionales y la forma como están interconectadas se denomina «arquitectura» del microprocesador.

Las unidades básicas de un microprocesador son:

  1. Unidad Aritmético/Lógica: Conocida también como ALU (Arithmetic/Logic Unit.). La ALU es la parte del microprocesador que lleva a cabo las operaciones aritméticas y lógicas en los datos binarios. Algunas de ellas se aplican sobre dos operandos, otras solamente en uno.
  2. Unidad de Control: Es la unidad funcional primaria dentro del microprocesador. Utiliza señales de reloj para mantener la secuencia de eventos apropiada para llevar a cabo cualquier tarea de procesamiento.
  3. Registros Internos: Son unidades de almacenamiento temporal dentro de la CPU. Algunos tienen usos específicos, otros son de uso general.
  4. Memoria del Programa: Es una ROM o EPROM que contiene el programa del microprocesador. En algunos casos, la memoria del programa también almacena parámetros o tablas de datos que no sufren modificaciones.

Hay otras unidades funcionales que también pueden existir en el microprocesador; como son la «memoria de datos» y los «puertos de entrada/salida». La unidad de procesamiento central (CPU) es un microprocesador que posee únicamente las tres unidades básicas: unidad de control, unidad aritmético/lógica y algunos registros.

UNIDAD DE INTERFAZ EN EL BUS

El Bus de Datos: Es un conjunto de líneas bidireccionales, que transportan información del microprocesador hacia la memoria o puertos y de estos al microprocesador.
El Bus de Direcciones: Es unidireccional, por el solamente circula información proveniente del microprocesador.
Bus de Control: Lo conforman la sincronización y el sentido de transferencia de información en el bus de datos, y el tipo de transferencia indicada por medio de señales de control originadas en el CPU.
Bus Internos: Son buses que existen dentro del microprocesador que sirven para comunicar entre sí a la ALU, los registros internos y la unidad de control.

INSTRUCCIONES DEL PROCESADOR

Aritméticas: es  la encargada de realizar los cálculos. Los datos sobre los que se realizan la operaciones se denominan operandos. Al elemento encargado de ejecutar las operaciones se le denomina operador, y está formado por una serie de circuitos electrónicos que son capaces de sumar dos números binarios o hacer las operaciones lógicas elementales: disyunción, conjunción y negación; incluso algunos operadores son también capaces de multiplicar, dividir y realizar otras operaciones más complejas.

Lógica: es el cerebro de una computadora. Su función e ejecutar programas almacenados en la memoria central tomando sus instrucciones, examinándolas y luego ejecutándolas una tras otra. La CPU se compone de varias partes. La unidad de control se encarga de traer las instrucciones de las memoria principal y de determinar su tipo. La unidad aritmética y lógica realiza operaciones como la suma o la función booleana AND, necesarias para llevar a cabo las instrucciones.

Booleanas: Estas instrucciones corresponden a- contactos de cierre: el contacto se establece cuando el objeto bit que controla el contacto está en el estado 1, – contactos de apertura: el contacto se establece cuando el objeto bit que controla el contacto está en el estado 0,- contactos de flanco ascendente: detección del paso de 0 a 1 del objeto bit que lo controla,- contactos de flanco descendente: detección del paso de 1 a 0 del objeto bit que lo controla.

 CPU

UC2

UAL

PIPELINING

La segmentación de instrucciones es similar al uso de una cadena de montaje en una fábrica de manufacturación. En las cadenas de montaje, el producto pasa a través de varias etapas de producción antes de tener el producto terminado. Cada etapa o segmento de la cadena está especializada en un área específica de la línea de producción y lleva a cabo siempre la misma actividad. Esta tecnología es aplicada en el diseño de procesadores eficientes. A estos procesadores se les conoce como pipeline processors.

Un pipeline processor está compuesto por una lista de segmentos lineales y secuenciales en donde cada segmento lleva a cabo una tarea o un grupo de tareas computacionales. Puede ser representado gráficamente en dos dimensiones, en donde en el eje vertical encontramos los segmentos que componen el pipeline y en el segmento horizontal representamos el tiempo.

Pi

Hay tres aspectos importantes que deben ser considerados en pipeline . Lo primero que debemos observar es que el trabajo es dividido en piezas que más o menos ajustan dentro de los segmentos que componen el pipeline . Segundo, para que el pipeline trabaje de forma eficiente es necesario que las particiones de trabajo tomen aproximadamente la misma cantidad de tiempo. De no ser así, el segmento que requiera más tiempo ( T ) hará que el pipeline se retrase y cada segmento requerirá T unidades de tiempo para completar su trabajo. Esto quiere decir que los segmentos rápidos estarán mucho tiempo ociosos. Tercero, para que el pipeline funcione adecuadamente, deben ocurrir pocas excepciones o hazards (riesgos) que puedan causar retardos o errores en el pipeline . En caso de ocurrir errores, la instrucción tiene que ser cargada nuevamente en el pipeline y se debe reiniciar la misma instrucción que ocasionó la excepción.

PI1

PI2

Riesgos en el pipeline Los procesadores con pipeline presentan una serie de problemas conocidos como hazards, y que pueden ser de tres tipos:

  • Riesgos Estructurales: Ocurren cuando diversas instrucciones presentan conflictos cuando tratan de acceder a la misma pieza de hardware. Este tipo de problema puede ser aliviado teniendo hardware redundante que evitan estas colisiones. También se pueden agregar ciertas paradas ( stall ) en el pipeline o aplicar reordenamiento de instrucciones para evitar este tipo de riesgo.
  • Riesgos de Datos: ocurren cuando una instrucción depende del resultado de una instrucción previa que aún está en el pipeline y cuyo resultado aún no ha sido calculado. La solución más fácil es introducir paradas en la secuencia de ejecución pero esto reduce la eficiencia del pipeline.
  • Riesgos de Control: Son resultado de las instrucciones de salto que necesitan tomar una decisión basada en un resultado de una instrucción mientras se están ejecutando otras.

RAM Y ROM
La memoria de acceso aleatorio (en inglés: random-access memory cuyo acrónimo es RAM) es la memoria desde donde el procesador recibe las instrucciones y guarda los resultados. Es el área de trabajo para la mayor parte del software de un computador.1 Existe una memoria intermedia entre el procesador y la RAM, llamada caché, pero ésta sólo es una copia (de acceso rápido) de la memoria principal (típicamente discos duros) almacenada en los módulos de RAM.1 Por ejemplo, en el sistema operativo Windows Vista, gracias al servicio ReadyBoost, es posible asignar memoria flash de un dispositivo externo USB como memoria caché y así mejorar la velocidad del equipo informático, debido a la mayor velocidad de las Flash respecto al disco duro.

ram

Se trata de una memoria de estado sólido tipo DRAM en la que se puede tanto leer como escribir información. Se utiliza como memoria de trabajo para el sistema operativo, los programas y la mayoría del software. Es allí donde se cargan todas las instrucciones que ejecutan el procesador y otras unidades de cómputo. Se dicen «de acceso aleatorio» porque se puede leer o escribir en una posición de memoria con un tiempo de espera igual para cualquier posición, no siendo necesario seguir un orden para acceder a la información de la manera más rápida posible.

ram1

La Memoria ROM nace por esta necesidad, con la característica principal de ser una memoria de sólo lectura, y por lo tanto, permanente que sólo permite la lectura del usuario y no puede ser reescrita.
Por esta característica, la Memoria ROM se utiliza para la gestión del proceso de arranque, el chequeo inicial del sistema, carga del sistema operativo y diversas rutinas de control de dispositivos de entrada/salida que suelen ser las tareas encargadas a los programas grabados en la Memoria ROM. Estos programas (utilidades) forman la llamada Bios del Sistema.

ROM

MODOS DE DIRECCIONAMIENTOS 

Especifica la forma de interpretar la información contenida en cada campo de operando para localizar, en base a esta información, el operando.

Entonces los modos de direccionamiento de un procesador son las diferentes formas de transformación del campo operando de la instrucción en la dirección del operando.

Las técnicas de direccionamiento se utilizan con la siguiente finalidad:

Dar versatilidad
Reducir el número de bits del campo del operando
Los modos de direccionamiento también pueden clasificarse en propios e impropios
Propios es cuando el operando está en una dirección concreta
Impropio es cuando puede estar en registros del procesador
Podemos dividir los modos de direccionamiento en 5 grupos:

● Directo de registro: el operando es el dato contenido en un registro de datos o de direcciones.

Incluye: directo de registro de datos y directo de registro de direcciones.

●Indirecto de registro: El operando se encuentra en memoria y es necesario obtener su dirección a partir de un registro de direcciones. Incluye: Indirecto de registro, indirecto de registro con post incremento, indirecto de registro con pre decremento, indirecto de registro con desplazamiento e indirecto de registro indexado con desplazamiento.

●Absoluto: el operando está en memoria y se da su dirección explícitamente.

Incluye: absoluto largo y absoluto corto.

●Relativo al contador del programa: La dirección del operando es relativa al contenido del PC. Incluye: relativo al PC con desplazamiento y relativo al PC indexado con desplazamiento.

¿CUÁNTOS MODOS DE DIRECCIONAMIENTOS EXISTEN?

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.

TIPOS DE DIRECCIONAMIENTO

Implícito: En este modo de direccionamiento no es necesario poner ninguna dirección de forma explícita, ya que en el propio codigo de operación se conoce la dirección del (de los) operando(s) al (a los) que se desea acceder o con el (los) que se quiere operar.

Supongamos una arquitectura de pila, las operaciones aritmeticas no requieren direccionamiento explícito por lo que se ponen como:

add

sub

Un ejemplo de este tipo de direccionamiento lo podemos encontrar en la arquitectura de acumulador (AC) donde siempre hay un parámetro implícito y este es el AC. Para finalizar y dejar este modo de direccionamiento generalizado para las arquitecturas más usuales, remarcamos que también podemos encontrarlo en la arquitectura con registros de próposito general, por ejemplo con ordenes como setc, que pone a 1 el registro c (acarreo).

Inmediato: En la instrucción está incluido directamente el operando.

En este modo el operando es especificado en la instrucción misma. En otras palabras, una instrucción de modo inmediato tiene un campo de operando en vez de un campo de dirección. El campo del operando contiene el operando actual que se debe utilizar en conjunto con la operación especificada en la instrucción. Las instrucciones de modo inmediato son útiles para inicializar los registros en un valor constante.

Directo:El campo de operando en la instrucción contiene la dirección en memoria donde se encuentra el operando.

En este modo la dirección efectiva es igual a la parte de dirección de la instrucción. El operando reside en la memoria y su dirección es dada directamente por el campo de dirección de la instrucción. En una instrucción de tipo ramificación el campo de dirección especifica la dirección de la rama actual.

Con este tipo de direccionamiento, la dirección efectiva es contenida en la misma instrucción, tal como los valores de datos inmediatos que son contenidos en la instrucción. Un procesador de 16 bits suma la dirección efectiva al contenido del segmento de datos previamente desplazado en 4 bits para producir la dirección física del operando.

Indirecto: El campo de operando contiene una dirección de memoria, en la que se encuentra la dirección efectiva del operando.

Absoluto: El campo de operando contiene una dirección en memoria, en la que se encuentra la instrucción.

De registro: Sirve para especificar operandos que están en registros.

Indirecto mediante registros: El campo de operando de la instrucción contiene un identificador de registro en el que se encuentra la dirección efectiva del operando. En este modo el campo de la dirección de la instrucción da la dirección en donde la dirección efectiva se almacena en la memoria. El control localiza la instrucción de la memoria y utiliza su parte de dirección para accesar la memoria de nuevo para leer una dirección efectiva. Unos pocos modos de direccionamiento requieren que el campo de dirección de la instrucción sea sumado al control de un registro especificado en el procesador. La dirección efectiva en este modo se obtiene del siguiente cálculo:

Dir. efectiva = Dir. de la parte de la instrucción + Contenido del registro del procesador

De desplazamiento: Combina el modo directo e indirecto mediante registros

De pila: Se utiliza cuando el operando está en memoria y en la cabecera de la pila. Este direccionamiento se basa en las estructuras denominadas Pila(tipo LIFO), las cuales estan marcados por el fondo de la pila y el puntero de pila (*SP), El puntero de pila apunta a la última posición ocupada. Asi, como puntero de direccionamiento usaremos el SP. El desplazamiento más el valor del SP nos dará la dirección del objeto al que queramos hacer referencia. En ocasiones, si no existe C. de desplazamiento solo se trabajara con la cima de la pila. Este tipo de direccionamiento nos aporta flexibilidad pero por contra, es mucho mas complejo que otros tipos estudiados más arriba.

Respecto a un registro base: Este modo de direccionamiento es muy usado por los ensambladores cuando se llaman a las funciones (para acceder a los parametros apilados en la pila, valga la redundancia). Consiste, al igual que el indirecto a través de registro, en calcular la EA (Effective Address) como la suma del contenido del registro base y un cierto desplazamiento (u offset) que siempre será positivo. Esta técnica permite códigos reentrantes y acceder de forma fácil y rápida a posiciones cercanas de memoria.

EA = RB+offset

RB = registro base

offset = desplazamiento

-> RB se comporta como una dirección de memoria a la que se le sumará el desplazamiento

Respecto a un registro indice: Es similar al anterior, lo único que es el contenido del registro indice el que indica el desplazamiento que se produce a partir de una dirección de memoria que se pasa también como argumento a la orden que utiliza este modo de direccionamiento. Aunque en esencia son dos modos equivalentes. La EA se calcula como la suma del contenido del registro indice y una dirección de memoria:

EA = RI+DM

RI = registro indice

DM = direccion de memoria

-> RI se comporta como un offset

Indexado respecto a una base: Se trata de una combinación de los dos anteriores y consiste en calcular la dirección efectiva como:

EA = RI+RB+DM

-> Las siglas significan lo mismo que en el caso anterior

Respecto al contador de programa: Consiste en dirección una posición de memoria usando como registro base al contador de programa (PC), el funcionamiento es análogo al direccionamiento respecto a registro base con la salvedad de que, en este caso, el offset puede ser también negativo.

Indexado con autoincremento/autodecremento: Es un modo de direccionamiento análogo al indexado, explicado anteriormente. La única diferencia es que permite un incremento o decremento de la dirección final o el registro indice según los siguientes casos:

-> Indexado con autopreincremento: Incrementa el registro indice primero (se incrementa un valor, según el tamaño del objeto direccionado) y luego calcula la EA al igual que el direccionamiento indexado.

-> Indexado con autoposincremento: Calcula la dirección efectiva y después incrementa esta.

-> Indexado con autopredecremento: Decrementa el registro indice y después calcula la dirección efectiva.

-> Indexado con autoposdecremento: Calcula la dirección efectica y después decrementa esta.

Instrucción de salto con direccionamiento absoluto: Consiste en cargar en el PC el valor que se especifica en la orden de salto, p.e:

jmp 0xAB —-> Carga 0xAB en PC

Instrucción de salto con direccionamiento relativo: Es parecida a la especificada anteriormente la diferencia es que el salto es relativo al PC, pongamos un ejemplo: Supongamos que PC vale = 0x0A, si nosotros interpretamos la instrucción jr +03, saltaremos tres posiciones posteriores a PC (también podría ser -03 y serían posiciones anteriores). Pero, ¡cuidado! si esa instrucción estaba en la posición 0x0A la dirección de PC a incrementar será la inmediatamente posterior (ya que PC se incrementa automáticamente después de leer la instrucción), por lo que quedaría:

PC = 0x0B —> nuevo PC = 0x0B+0x03 = 0x0E, con lo que el PC quedaría como 0x0E.

TRANSFERENCIA ENTRE REGISTROS

La transferencia de datos entre registros se logra por medio de una micro-operación de transferencia entre registros. Estas micro-operaciones realizan una transferencia directa de información binaria de un registro a otro. El registro destino que recibe la información toma el valor previo del registro fuente. El valor del registro fuente no cambia debido a la transferencia.

MODALIDADES DE DIRECCIONAMIENTO

Direccionamiento directo por registro: Se mencionó anteriormente que el campo de dirección de una instrucción puede especificar una palabra de memoria o un registro M procesador. Cuando se da este último caso se dice que el operando está especificado con direccionamiento directo por registro, en tal caso, el operando reside en uno de los registros del procesador que es seleccionado por un campo de registro de k bits en la instrucción. Un campo de k bits puede especificar uno de 2k registros. Este modo es típico de los ordenadores con organización de registros de uso general.
Las ventajas de este modo son:
El acceso a los registros es muy rápido, por tanto el direccionamiento por registro debe usarse en las variables que se usen con más frecuencia para evitar accesos a memoria que son más lentos, un ejemplo muy típico del uso de este direccionamiento son los índices de los bucles.
El número de bits necesarios para especificar un registro es mucho más pequeño que el necesario para especificar una dirección de memoria, esto es debido a que el número de registros del procesador es muy pequeño comparado con el número de direcciones de memoria. Sin embargo, hay que tener en cuenta que en los ordenadores modernos el número de registros ha aumentado considerablemente.
Direccionamiento inmediato (o literal): En este modo es el operando el que figura en la instrucción no su dirección. En otras palabras el campo de operando contiene él mismo, sin transformación alguna, la información sobre la que hay que operar. Este modo es útil para inicializar registros o palabras de memoria con un valor constante.
Direccionamiento directo (o absoluto): Este es el modo de direccionamiento más sencillo. El campo de dirección no necesita transformación alguna para dar la dirección efectiva, es decir la función que transforma el campo de operando en la dirección efectiva es la identidad. Esto significa que el campo de operando es ya la dirección efectiva.
Este direccionamiento sólo se usa en ordenadores pequeños en que el programa siempre se sitúa en la misma zona de memoria ya que dificulta la relocalización de los programas, es decir que el código de los programas no dependa de su situación en memoria. Ordinariamente este modo sólo se usa para acceder a direcciones del sistema que normalmente se refieren a operaciones de entrada y salida ya que estas direcciones no dependen del programa.
Direccionamiento indirecto: En este modo el campo de operando de la instrucción indica la localización de la dirección efectiva del operando. El modo de direccionamiento indirecto puede adquirir diferentes formas según cuál sea el lugar donde se encuentre la dirección del operando. En general, todos los modos de direccionamiento tienen su versión indirecta que añade un eslabón más a la cadena del direccionamiento. Por ejemplo existe el direccionamiento indirecto por registro, en el que el registro especificado contiene la dirección del operando, no el operando mismo.
Este direccionamiento es útil cuando se trabaja con punteros ya que los punteros son variables que contienen las direcciones de los operandos, no los operandos mismos.
Direccionamiento relativo: Hay algunos modos de direccionamiento en que se hace uso de una propiedad muy generalizada de los programas denominada localidad de referencia, esta propiedad consiste en que las direcciones referenciadas por los programas no suelen alejarse mucho unas de otras y, por tanto, suelen estar concentradas en una parte de la memoria. Estas consideraciones nos llevan a la conclusión de que no es necesario utilizar todos los bits de la dirección de memoria en el campo de operando, basta utilizar los bits precisos para cubrir la parte de memoria donde estén incluidas las direcciones a las que el programa hace referencia. Esto puede hacerse tomando corno referencia un punto de la memoria y tomando como campo de operando la diferencia entre ese punto y la dirección efectiva del operando. La dirección que se toma como punto de referencia puede residir en un registro de la CPU y, por tanto, sumando el contenido de ese registro con el campo de operando obtendremos la dirección efectiva. Hay varios direccionamientos basados en esta técnica que reciben diferentes nombres dependiendo de cuál sea el registro en el que radica la dirección tomada como referencia. Todos ellos podrían catalogarse como direccionamientos relativos a un registro.
El direccionamiento denominado habitualmente relativo toma como valor de referencia el registro contador de programa. Cuando se usa este modo de direccionamiento, el campo de operando consiste en un número (normalmente con signo) que expresa la diferencia entre la dirección del dato y la dirección siguiente a la instrucción en curso (contenida en el contador de programa). Si el campo de operando, llamado en este caso desplazamiento u offset, es positivo el operando residirá en una dirección posterior a la de la instrucción y si es negativo, en una dirección anterior.
Este modo de direccionamiento es usado muy frecuentemente en programas cuyo código deba ser independiente de la posición de memoria donde estén situados (programas relocalizables) ya que el desplazamiento es independiente de la localización del programa. También se usa con mucha frecuencia en instrucciones de bifurcación.
Los apartados siguientes se refieren a diferentes versiones de direccionamientos relativos a registros.

SEGMENTO

Un segmento es un área especial en un programa que inicia en un límite de una localidad regularmente divisible entre 16 o 10 hex.

Un segmento, puede estar  ubicado casi en cualquier lugar y puede ser hasta de 64 bit.

Se puede tener cualquier número de segmentos, para direccionar un segmento en particular basta cambiar la dirección en el registro del segmento apropiado.

Los tres segmentos principales son:

Segmentos de código: Contiene instrucciones de máquina que son ejecutadas. Comúnmente la primera instrucción ejecutable está en el inicio del segmento, el SO enlaza  a esa localidad para iniciar la ejecución del programa.

Segmentos de datos: Contiene datos, constantes y áreas de trabajo definidos por el programa. El registro del DS direcciona al segmento de datos.

Segmentos de pila: La pila contiene los datos y direcciones que se necesitan guardar temporalmente o para el uso de sus llamadas subrutinas. El registro del segmento de la pila (SS) direcciona el segmento de la pila. Los registros de segmentos contienen la dirección inicial de cada segmento.

CALCULANDO DIRECCIONES DE MEMORIAS 

Depende de cómo el procesador visualiza u organiza, la memoria. Dos de las formas en las que el microprocesador visualiza u organiza la memoria en una computadora son las llamadas memoria lineal y memoria segmentada.

PILA

Aparte de los componentes de la arquitectura presentados en las secciones anteriores, la mayor parte de procesadores ofrecen la infraestructura necesaria para manipular una estructura de datos organizada y almacenada en memoria que se denomina “la pila”.
La pila es una zona de la memoria sobre la que se pueden escribir y leer datos de forma convencional. Esta zona tiene una posición especial que se denomina “la cima de la pila”. El procesador contiene dos instrucciones de su lenguaje máquina para realizar las operaciones de “apilar” y “desapilar” datos de la pila. Los datos que se pueden apilar y desapilar, en el caso del Intel Pentium son siempre de tamaño 4 bytes.

EJECUCIÓN DE INSTRUCCIONES DE PILA

El que la dirección de la pila esté contenida en un registro de propósito general permite que su contenido sea manipulado como cualquier otro registro. Un programa, por tanto, puede leer y escribir cualquier valor de %esp, tan sólo se debe tener en cuenta que el procesador obtiene de ese registro la dirección de memoria necesaria para ejecutar las instrucciones push y pop.
Supóngase que se ha depositado un cierto dato en la pila mediante la instrucción push y que se encuentra, por tanto en la cima. La instrucción pop deposita ese valor en el lugar especificado pero, ¿es posible ejecutar la instrucción pop sin ningún operando?. En otras palabras, la operación que se quiere ejecutar no es la de copiar el dato de la cima, sino simplemente corregir el valor de la cima al igual que haría pop pero sin depositar el dato en ningún lugar. La instrucción pop, por definición, debe incluir un único operando, con lo que no se puede utilizar para hacer esta operación.
La solución se deriva del hecho de que esp. La instrucción ADD $4, esp su valor incrementado en cuatro unidades. El efecto que esta instrucción tiene sobre la pila es el deseado. La siguiente instrucción asume que la cima está en la nueva posición contenida en %esp.

INSTRUCCIONES DE PILA

La pila es un segmento que es de suma utilidad en estos microprocesadores En él se almacenan valores temporales como las variables locales de las funciones, o las direcciones de retorno de éstas. Una función no es más que una subrutina, o un fragmento de código al que se le llama generalmente varias veces desde el programa principal, o desde una función jerárquicamente superior. Cuando se llama a una función se hace un mero salto al punto donde empieza ese código. Sin embargo esa subrutina puede ser llamada desde distintos puntos del programa principal, por lo que hay que almacenar en algún sitio la dirección desde donde se hace la llamada, cada vez que esa llamada tiene lugar, para que al finalizar la ejecución de la función se retome el programa donde se dejó. Esta dirección puede almacenarse en un sitio fijo (como hacen algunos microcontroladores), pero eso tiene el inconveniente de que si esa función a su vez llama a otra función (¡o a sí misma!) podemos sobreescribir la dirección de retorno anterior, y al regresar de la segunda llamada, no podríamos volver desde la primera. Además, es deseable que la función
guarde los valores de todos los registros que vaya a usar en algún sitio, para que el que la llame no tenga que preocuparse de ello (pues si sabe que los registros van a ser modificados, pero no sabe cuáles, los guardará todos por si acaso). Todas estas cosas, y algunas más, se hacen con la pila.
El segmento de pila está indicado por SS, y el desplazamiento dentro del segmento, por SP. Cuando arranca el programa, SP apunta al final del segmento de pila. Para almacenar información en la pila se decrementa SP para que apunte un poco más arriba y se copia a esa posición de memoria, SS:SP. Para sacarlo, copiamos lo que haya en SS:SP a nuestro destino, e incrementamos el puntero.
Como con todo lo que se hace con frecuencia, hay dispuestas instrucciones propias para el manejo de la pila. Las dos básicas son PUSH origen (empujar) y POP destino (sacar). La primera decrementa el puntero de pila y copia a la dirección apuntada por él (SS:SP) el operando origen (de tamaño múltiplo de 16 bits), mientras que la segunda almacena el contenido de la pila (elemento apuntado por SS:SP) en destino y altera el puntero en consecuencia. Si el operando es de 16 bits se modifica en 2 unidades, de 32 en 4, etc. Lo que se incrementa/decrementa es siempre SP, claro, porque SS nos indica dónde está ubicado el segmento de pila. La instrucción ret size se utiliza para recuperar de la pila los valores de IP o de CS e IP dependiendo del caso. Al salir de un procedimiento es necesario dejar la pila como estaba; para ello podemos utilizar la instrucción pop, o bien ejecutar la instrucción ret size donde size es el número de posiciones que deben descartarse de la pila.