Академический Документы
Профессиональный Документы
Культура Документы
Anuncios
REGISTROS
Enviado por borjaoscar
Indice
1. Concepto general
2. Registros de segmento.
2. Registros de segmento.
Un registro de segmento se utiliza para alinear en un limite de párrafo o dicho de otra
forma codifica la dirección de inicio de cada segmento y su dirección en un registro de
segmento supone cuatro bits 0 a su derecha.
Un registro de segmento tiene 16 bits de longitud y facilita un área de memoria para
direccionamientos conocidos como el segmento actual. Los registros de segmento son:
Registro CS
Registro DS
Registro SS
Registro ES
Registro FS y GS
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, mas un valor de desplazamiento en el registro de apuntado
de instrucción (IP), indica la dirección de una instrucción que es buscada para sí ejecución.
Para propósito de programación normal, no e 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, mas un valor de desplazamiento en una instrucción,
genera una referencia a la localidad de un bytes especifico 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 esta
de segmento para manejar el direccionamiento de memoria. En este contexto, el registro ES
esta asociado con el registro DI (índice) .un programa que requiere el uso del registro ES
puede inicializarlo con una dirección apropiada.
Registros FS y GS.
Son registros extra de segmento en los procesadores 80386y posteriores a estos
procesadores.
3. Registro Apuntador de instrucciones.(IP)
El registro apuntador de instrucciones (IP) de 16 bits contiene el desplazamiento de
dirección de la siguiente instrucción que se ejecuta.
El registro IP esta 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 esta ejecutando actualmente.
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 procesados combina las direcciones
en el CS y el IP así:
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 apuntadores están asociados con el registro SS y permiten al procesador
accesar datos en el segmento de pila los registros apuntadores son dos:
El registro SP
El registro BP
Registro SP.
El apuntador de pila IP de 16 bits esta asociado con el registro SS y proporciona un valor de
desplazamiento que se refiere a la palabra actual que esta siendo procesada en la pila.
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 esta siendo procesada en la pila
el microprocesador combina las direcciones en el SS y el PP:
Dirección de segmento en el registro SS: 27B30H
Desplazamiento en el registro SP: + 312H
Dirección en la Pila: 27E42H
…….
27B3[0]H 312H
Dirección del segmento SS Desplazamiento del SP
Registro BP.
El registro BP de 16 bits facilita la referencia de parámetros, los cuales son datos y
direcciones transmitidos vía lapida.
4. Registros de propósitos generales.
Los registros de propósitos generales AX, BX, CX y DX son los caballos de batalla o
las herramientas del sistema. Son los únicos en el sentido de que se puede direccionarlos
como una palabra o como una parte de un byte. El ultimo byte de la izquierda es la parte
"alta", y el ultimo byte de la derecha es la parte "baja" por ejemplo, el registro CX consta de
una parte CH (alta) y una parte CL (baja), y usted puede referirse a cualquier parte por si
nombre. Ñas 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 registros de propósito
general, mas versiones de 32 bits; EAX, EBX y EDCX.
Registros 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 traducir suponen el uso del AX. También, algunas operaciones
generan código más eficientes si se refiere al AX en lugar de los otros registros.
Registro BX.
El BX es conocido como el registro base ya que es el único registro de propósitos generales
que pueden ser unos índices para direccionamiento indexado. También es común emplear
al BX para cálculos.
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.
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. Puede usar los registros de propósitos para suma y resta de
cifras de 8, 16, 32 bits.
5. Registro índice.
Los registros SI y DI están disponibles para direccionamientos indexados y para sumas y
restas. Que son la operaciones de punta.
Registro SI.
El registro índice 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 a 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 a 32 bits, el EDI.
Registro de bandera.
Los registros de banderas sirven parar indicar el estado actual de la maquina y el resultado
del procesamiento, Cuando algunas instrucciones piden comparaciones o cálculos
aritméticos cambian el estado de las banderas.
Las banderas están en el registro de banderas en las siguientes posiciones:
bits 15 14 13 12 11 10 9 8 7 6 5
4321
O D I T S Z A P C
Bandera
Las banderas mas comunes son las siguientes:
OF (Overflowflag, desbordamiento).
Indica el desbordamiento de un bit de orden alto (mas a la izquierda) después de una
operación aritmética.
DF (Directionflag, Direccion).
Designa la dirección hacia la izquierda o hacia la derecha para mover o comparar cadenas
de caracteres.
IF (Interruptionflag, Interrupcion).
Indica que una interrupción externa, como la entrada desde el teclado sea procesada o
ignorada.
TF (Trapflag, Trampa).
Examina el efecto de una instrucción sobre los registros y la memoria.
Los programas depuradores como DEBUG, activan esta bandera de manera que pueda
avanzar en la ejecución de una sola interrupción a un tiempo.
SF (Signflag, Signo).
Contiene el signo resultante de una operación aritmética (0=positivo y 1= negativo).
ZF (Zero flag, Zero).
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 (Auxiliarycarryflag, Acarreo auxiliar).
Contiene un acarreo externo del bit 3 en un dato de 8 bits, para aritmética especializada
PF (Parityflag, Paridad).
Indica paridad par o impar de una operación en datos de ocho bits de bajo orden (mas a la
derecha).
CF (Carryflag, Acarreo).
Contiene el acarreo de orden mas alto (mas a la izquierda) después de una operación
aritmética; también lleva el contenido del ultimo bit en una operación de corrimiento o
rotación.
Cuadro Comparativo
Registros de Segmento Un registro de segmento tiene 16 bits de longitud y facilita un área de memoria
para el direccionamiento conocida como el segmento actual
Registros de Apuntador de Este registro esta compuesto por 16 bits y contiene el desplazamiento de la
Instrucciones siguiente instrucción que se va a ejecutar. Los procesadores 80386 y
posteriores tiene un IP ampliado de 32 bits llamado EIP.
Registros Apuntadores Permiten al sistema accesar datos al segmento de la pila. Los procesadores
80386 tiene un apuntador de pila de 32 bits llamado ESP. El sistema maneja de
manera automática estos registros.
Registros de Propósito General Son los caballos de batalla del sistema y pueden ser direccionados como una
palabra o como una parte de un bytes. Los procesadores 80386 y posteriores
permiten el uso de todos los registros de propósitos general mas sus versiones
ampliadas de 32 bits llamados EAX, EBX,ECX y EDX.
Registros Indices Sirven para el direccionamiento de indexado y para las operaciones de sumas y
restas.
Registros de Banderas Sirven para indicar el estado actual de la maquina y el resultado del
procesamiento. De los 16 bits de registro de bandera 9 son comunes a toda
la familia de los procesadores 8086.
Autor:
Oscar borja
La arquitectura del conjunto de instrucciones (ISA) se emplea a veces para distinguir este
conjunto de características de la microarquitectura, que son los elementos y técnicas que se
emplean para implementar el conjunto de instrucciones. Entre estos elementos se encuentran
las microinstrucciones y los sistemas de caché.
Procesadores con diferentes diseños internos pueden compartir un conjunto de instrucciones;
por ejemplo, el Intel Pentium y AMD Athlon implementan versiones casi idénticas del conjunto
de instrucciones x86, aunque tienen diseños diferentes.
Índice
[ocultar]
1 El lenguaje máquina
6 Véase también
El lenguaje máquina[editar · editar código]
El lenguaje máquina está construido a partir de los estados discretos o instrucciones. En la
arquitectura de procesamiento, una instrucción dada puede especificar:
Desplazamiento
Establecer un registro a un valor constante
Mover datos desde una posición de memoria a un registro y viceversa. Esto se realiza
para obtener datos para operaciones matemáticas y su almacenamiento.
Leer y escribir datos desde dispositivos de hardware
Operaciones matemáticas
Sumar, restar, multiplicar o dividir dos registros y colocar el resultado en alguno de
ellos.
Realizar operaciones bit a bit, teniendo el AND y el OR de cada bit en un par de
registros, o el NOT de cada bit en un registro.
Comparar dos valores que se encuentren en registros(por ejemplo, si son iguales o si
uno es mayor que otro)
Afectan al flujo de programa
Saltar a otra posición del programa y ejecutar instrucciones allí.
Saltar a otra posición si se cumple cierta condición
Saltar a otra posición, pero salvando la posición actual para poder volver (realizar una
llamada, por ejemplo callprintf)
Algunos ordenadores incluyen instrucciones "complejas". Dichas instrucciones pueden tomar
muchas instrucciones en otros equipos. Estas se caracterizan por instrucciones que necesitan
varios pasos, como el control de múltiples unidades funcionales. Algunos ejemplos son:
El diseño de sistemas de instrucción es una edición compleja. Había dos etapas en la historia
para el microprocesador. El primer era el CISC (ComplexInstruction Set Computer) que tenía
muchas instrucciones diferentes. En los años 70 IBM hicieron la investigación y encontraron
que muchas instrucciones en el sistema podrían ser eliminadas. El resultado era el RISC
(ReducedInstruction Set Computer), una arquitectura que utiliza un sistema más pequeño de
instrucciones. Un conjunto de instrucción más simple puede ofrecer el potencial para
velocidades más altas, tamaño reducido del procesador, y consumo de energía reducido. Sin
embargo, un conjunto más complejo puede optimizar operaciones comunes, mejorar
memoria/eficiencia de cache, o simplificar la programación.
Hay también algunos nuevos diseños de CPU que compilan el conjunto de instrucción a una
RAM escribible o FLASH dentro de la CPU (tal como el procesador Recursiv y el ImsysCjip), o
FPGA (computación reconfigurable). Western Digital MCP-1600 es un ejemplo antiguo, usando
una ROM dedicada, separada del microcódigo..
Los detalles de la implementación tienen una influencia fuerte en las instrucciones particulares
seleccionadas para el conjunto de instrucción. Por ejemplo, muchas implementaciones de la
instrucción “pipline” permiten solamente una carga de memoria (load) o almacén en memoria
(store) por instrucción, llevando a carga-almacena arquitectura (RISC). Por otro ejemplo,
algunas maneras de implementar la instrucción “pipline” llevaron a una ranura de retardo.
En computadoras antiguas, la memoria del programa era costosa, así que minimizar el tamaño
de un programa para asegurar que va a caber en la memoria limitada era a menudo central.
Así el tamaño combinado de todas las instrucciones necesitó realizar una tarea particular, la
densidad del código, era una característica importante de cualquier sistema de instrucción. Las
computadoras con alta densidad del código también tenían a menudo instrucciones complejas
para la entrada del procedimiento, los retornos parametrizados, los lazos etc. Sin embargo, "
instrucciones CISC" combinan simplemente una operación básica de la ALU, tal como " add",
con el acceso de uno o más operandos en memoria (usando modos de dirección tales como
directo, indirecto, indexado). Ciertas arquitecturas pueden permitir dos o tres operandos
(incluido el resultado) directamente en memoria o pueden permitir realizar funciones tales como
el incremento automático del puntero.
RISC, fueron los primeros implementados con profundidad en el período de rápido crecimiento
de las memorias de subsistemas, se reduce el código con el fin de simplificar el circuito de
aplicación y con ello tratar de aumentar el rendimiento a través de las frecuencias de reloj más
elevadas y el uso de más registros. Las instrucciones RISC suelen realizar sólo una operación,
como una "suma" de registros o una "carga" de una posición de memoria en un registro,
también suelen utilizar una longitud de instrucciones fijas, mientras que un conjunto de
instrucciones típicas CISC tiene instrucciones muchos más cortas que esta longitud fija. Las
instrucciones de longitud fija son menos complicadas de manejar que las instrucciones de
ancho variable, por varias razones (por ejemplo: no tener que comprobar si una instrucción se
extiende a ambos lados de una línea de caché o el límite de memoria virtual de la página), y
por lo tanto algo más fácil de optimizar la velocidad . Sin embargo, como los equipos RISC
normalmente requieren más y más para implementar las instrucciones que ejecutan una
determinada tarea, hacen menos óptimo el uso del ancho de banda y de la memoria caché.
Las computadoras mínimas del conjunto de instrucciones (MISC) son una forma de máquina
apilada, donde hay pocas instrucciones separadas (16-64), para poder caber instrucciones
múltiples en una sola palabra de máquina. Éstos tipo de núcleos llevan a menudo poco silicio
para implementarse, así que pueden ser observadas fácilmente en un FPGA o en una forma
multinucleo. La densidad del código es similar al RISC; la densidad creciente de la instrucción
es compensada requiriendo más de las instrucciones primitivas de hacer una tarea.
Número de operandos
0-operando, también llamada máquina de pila: todas las operaciones aritméticas se ejecutan
en la parte superior de una o dos posiciones de la pila, push y pop son las instrucciones
utilizadas para acceder a la memoria: push a, push b, add, pop c.
2-operando – la mayoría de las máquinas CISC y RISC entran en esta categoría: CISC – load
a, reg1, add reg1, b; store reg1, c RISC - cargas que requieren la memoria explícita, las
instrucciones serían: load a,reg1; load b,reg2; add reg1,reg2; store reg2,c
3-operando, permite una mejor reutilización de los datos: CISC - bien una sola instrucción: add
a, b, c, o más generalmente: move a,reg1; add reg1,b,c como la mayoría de las máquinas se
limitan a dos operandos de memoria. RISC - Debido a la gran cantidad de bits necesarios para
codificar los tres registros, este esquema no suele estar disponible en los procesadores RISC
con pequeñas instrucciones de 16 bits: load a,reg1; load b,reg2; add reg1+reg2->reg3; store
reg3,c;
Completo: Que se pueda realizar en un tiempo finito cualquier tarea ejecutable con un
ordenador (computable o decidible).
Eficiente: Que permita alta velocidad de cálculo sin exigir una elevada complejidad en su
UC y ALU y sin consumir excesivos recursos (memoria), es decir, debe cumplir su tarea en
un tiempo razonable minimizando el uso de los recursos.
Autocontenidas: Esto es, que contengan en sí mismas toda la información necesaria para
ejecutarse.
-> escritura
-> mover a la izquierda una posición y leer
-> parar
En esta idea se basan las arquitecturas RISC, no obstante, con este conjunto no se puede
conseguir la eficiencia del repertorio de instrucciones por lo que en la práctica el conjunto suele
ser más amplio en aras de conseguir un mejor rendimiento, tanto en uso de recursos como en
consumo de tiempo.
Instrucciones aritméticas: Son efectuadas por la ALU y suelen cambiar los flags o
indicadores de condición.
Nemotécnicos más frecuentes:
add: Suma.
add with carry: Suma con acarreo.
subtract: Resta.
multiply: multiplica.
divide: divide.
fabsolute
compare: Resta los dos operandos pero no almacena el resultado, solo modifica los flags.
Instrucciones lógicas: Realizan operaciones booleanas "bit a bit" entre dos operandos.
Como las aritméticas también modifican los flags.
Nemotécnicos más frecuentes:
halt: Detiene la ejecución del programa hasta que una interrupción arranca otro programa.
wait: Sirve para deterner la ejecución de un programa hasta que sucede un determinado
evento que no es una interrupción (otra condición externa al primer programa).
test and set: Se utiliza para la implementación de la exclusión mutua, esto es, que un
procesador no pueda acceder a un determinado recurso que está siendo usado por otro
procesador en ese mismo momento.
Se usan como semáforos, esto es, se declara una variable entera que tendrá el valor 0 si el
recurso esta libre y 1 si está siendo utilizado, de manera que si un procesador comprueba y el
semáforo está en 1 tendrá que esperar hasta que este cambie a 0. (1 = s.rojo y 0 = s.verde)
aritmética
Rama de las matemáticas que se ocupa del estudio de los números, sus
propiedades y las habilidades necesarias para trabajar con ellos.
Add a comment
Índice
[ocultar]
1 Tipos de operaciones
o 2.1 NOT
o 2.2 AND
o 2.3 OR
o 2.4 XOR
o 2.5 En resumen
n
3.1.1.2 Multiplicación y división por 2 , de enteros sin signo
3.2.1 Rotación
4 Véase también
Tipos de operaciones[editar · editar código]
1. Operaciones bit a bit: Ejecutan las operaciones lógicas AND, OR, XOR, NOT, etc,
sobre los bits individuales de los operandos.
2. Operaciones de Desplazamiento: Desplazan los bits de los operandos hacia la derecha
o hacia la izquierda una o más posiciones.
3. Operaciones de Rotación: Rotan los bits del operando hacia la derecha o hacia la
izquierda una o más posiciones. Pueden usar o no el flag del acarreo como un bit
adicional en la rotación.
Operadores bit a bit[editar · editar código]
En las explicaciones de abajo, cualquier indicación de una posición de un bit es contada de
derecha a izquierda a partir del bit menos significativo. Por ejemplo, el valor binario 0001 (el
decimal 1) tiene ceros en cada posición excepto en la primera.
El NOT bit a bit, o bitwise, o complemento, es una operación unaria que realiza
la negación lógica en cada bit, invirtiendo los bits del número, de tal manera que 0 1
los ceros se convierten en 1 y viceversa. Por ejemplo:
1 0
NOT 10011
= 01100
= 0001
1 1 1
El AND puede ser usado para filtrar determinados bits, permitiendo que unos
bits pasen y los otros no.
0011
AND 0010 (máscara)
= 0010
Puesto que el resultado 0010 es diferente de cero, se sabe que el segundo bit en el patrón
original está encendido. Esto es a menudo llamado enmascaramiento del bit (bit masking). (Por
analogía, al uso de las cintas de enmascarar, que cubren o enmascaran porciones que no
deben ser alteradas o porciones que no son de interés. En este caso, los valores 0 enmascaran
los bits que no son de interés).
Una operación OR de bit a bit, o bitwise, toma dos números enteros y realiza la
operación OR inclusivo en cada par correspondiente de bits. El resultado en 0 0 0
cada posición es 1 si el bit correspondiente de cualquiera de los dos
operandos es 1, y 0 si ambos bits son 0, por ejemplo: 0 1 1
1 0 1
0101
OR 0011
1 1 1
= 0111
0101
OR 0010 (máscara)
= 0111
Signo: 00000000000000000000000000000001
Exponente: 00000000000000000000000010000011
Parte significativa: 00000000011100000111000000001110
Todos ellos tienen los valores correctos y tenemos que mover cada uno de ellos a su posición
para poder armar el punto flotante.
Ahora que tenemos cada parte del número en su lugar, las combinamos para empaquetarlas y
formar el número en su representación de punto flotante de 32 bits. Para ello usamos el OR:
(Resultado final) = (Signo) OR (Exponente) OR (Parte significativa):
Signo: 10000000000000000000000000000000
Exponente: 01000001100000000000000000000000
Parte significativa: 00000000011100000111000000001110
Resultado final: 11000001111100000111000000001110
Queremos copiar los cuatro bits menos significativos del registro A en el registro B.
Para ello, primero aclaramos los 4 bits menos significativos de B con una operación AND, y así
tener un espacio libre:
Luego, aclaramos los bits de A que no queremos copiar, dejando solo los bits que queremos
copiar:
Ahora estamos listos para hacer el OR de A sobre B y combinar los 4 bits menos significativos
de A sobre B:
Ahora, el registro B tiene copiado los 4 bits menos significativos de A. El resto de los bits de B
quedaron intactos.
1 0 1
0101
XOR 0011
1 1 0
= 0110
0011
XOR 1010 (máscara)
= 1001
0 0 0 0
0 1 1 1
1 0 1 1
1 1 0 0
El XOR puede usarse para saber si los bits correspondientes de dos operandos son iguales o
diferentes. Por ejemplo, si tenemos dos operandos, 1000 y 0010 y queremos saber si los bits
más significativos de ambos son iguales procedemos como sigue:
1000
XOR 0010
= 1010
Ahora, cada bit del resultado estará en 0 si el bit correspondiente de los dos operandosson
iguales, y en 1 si son diferentes. El bit más significativo del resultado está en 1 indicando que
son diferentes, pero tenemos que aislarlo de los demás con un AND para poder usarlo o tomar
una decisión:
Ahora lo tenemos aislado en el resultado final, que es diferente de cero indicando que los bits
más significativo de los operandos son diferentes.
NOT invierte los bits y XOR junto con AND permiten determinar si dos operandos tienen los bits
de una determinada posición iguales o diferentes:
Desplazamiento lógico
Desplazamiento aritmético
Rotación
Rotación a través del bit de acarreo
Desplazamientos de bits[editar · editar código]
Los desplazamientos de bit (bit shifts) son a veces considerados operaciones bit a bit, porque
operan en la representación binaria de un número entero en vez de sobre su valor numérico;
sin embargo, los desplazamientos de bits no operan en pares de bits correspondientes, y por lo
tanto no pueden ser llamados propiamente como "bit a bit" (bit-wise). En estas operaciones los
dígitos (bits) son movidos, o desplazados, hacia la izquierda o hacia la derecha.
Los registros en un procesador de computador tienen un ancho fijo, así que algunos bits “serán
desplazados hacia fuera” ("shiftedout"), es decir, "salen" del registro por un extremo, mientras
que el mismo número de bits son “desplazados hacia adentro” ("shifted in"), es decir, "entran"
por el otro extremo; las diferencias entre los operadores de desplazamiento de bits están en
cómo éstos determinan los valores de los bits que entran al registro (desplazamiento hacia
adentro) (shifted-in).
Por ejemplo, supongamos que tenemos, en dos registros del tamaño de un byte, a dos dígitos
hexadecimales (en representación binaria de 4 bits cada uno), y se quiere empaquetarlos en un
solo byte, donde los 4 bits superiores es el hexadecimal más significativo y los 4 bits inferiores
es el hexadecimal menos significativo:
Para empaquetarlos en un solo byte, primero hay que desplazar el hexadecimal más
significativo 4 posiciones hacia la izquierda. (Esto se hace con el desplazamiento lógico hacia
la izquierda):
Luego, se hace un OR de los dos valores que contienen los dígitos hexadecimales para que
queden combinados en un solo byte:
Ahora tenemos un byte con el valor de 1001 1010, el cual tiene los dos dígitos hexadecimales
empaquetados.
Los programadores de lenguaje ensamblador usan esta propiedad para hacer multiplicaciones
y divisiones rápidas, de enteros sin signo, por una potencia de 2, en donde n desplazamientos
n
equivalen a multiplicar o dividir por 2 . También, si el procesador no tiene operaciones de
multiplicación y división de enteros, o si éstas son muy lentas, se puede multiplicar o dividir
usando desplazamientos y sumas para multiplicar y desplazamientos y restas para dividir. Por
ejemplo, para multiplicar un entero por 10, se procede como sigue (en el lenguaje ensamblador
del x86):
Se quiere multiplicar el contenido del registro EAX por 10:
En las instrucciones de abajo, EAX y EBX son registros del procesador, SHL (shiftleft),
desplaza el registro indicado una posición (un bit) hacia la izquierda (que equivale a multiplicar
por 2), MOV copia el registro de la derecha sobre el registro de la izquierda, y ADD suma el
registro de la derecha al registro de la izquierda.
SHLEAX,1; EAX = EAX * 2 EAX = 2n ; desplaza a la izquierda el
contenido del registro EAX una posición,
; (multiplica EAX por 2)
MOVEBX,EAX; EBX = EAX EBX = 2n ; copia el registro EAX en
EBX, ahora los dos registros tienen 2n
SHLEBX,1; EBX = EBX * 2 EBX = 4n ; multiplica EBX por 2,
obteniendo 4n
SHLEBX,1; EBX = EBX * 2 EBX = 8n ; vuelve a multiplicar EBX por
2, obteniendo 8n
ADDEAX,EBX; EAX = EAX + EBX EAX = 2n + 8n = 10n ; suma EBX (8n) a
EAX (2n),
; (ahora EAX tiene el valor original multiplicado por 10)
Si el entero con signo es positivo, (con el bit del signo igual a 0), se insertará el bit 0 del signo
en el extremo izquierdo al desplazar un bit hacia la derecha (igual que el desplazamiento lógico
hacia la derecha), pero si es un entero negativo, (con el bit del signo igual a 1), se insertará el
bit 1 del bit del signo en el extremo izquierdo. De esta manera, el signo del número se preserva
con la división por 2 y el número resultante tiene sentido. Si se insertara un 0 a la izquierda a
un número negativo (como lo haría el desplazamiento lógico hacia la derecha), en primer lugar,
este número negativo cambiaría de signo a positivo, y en segundo lugar, la interpretación de
los bits restantes no tendrían sentido.
Otra
Desplazamiento o rotación circular hacia la izquierda Desplazamiento o rotación circular hacia la derecha
forma
de
desplazamiento es el desplazamiento circular o rotación de bits. En esta operación, los bits de
un registro son “rotados” de una manera circular como si los extremos izquierdo y derecho del
registro estuvieran conectados. En la rotación hacia la izquierda, el bit que sale por el extremo
izquierdo entrará por el extremo derecho, y viceversa con la rotación hacia la derecha. Esta
operación es útil si es necesario conservar todos los bits existentes, y es frecuentemente usada
en criptografía digital.
Rotación hacia la izquierda a través del bit del acarreo Rotación hacia la derecha a través del bit del acarreo
Rotar a través del bit del acarreo es similar a la operación de rotar anterior (rotación sin
acarreo). La diferencia está en que los dos extremos del registro están unidos entre sí a través
del flag del acarreo, el cual queda en medio de ellos. El bit que sale por un extremo va al flag
del acarreo, y el bit original que estaba en el flag del acarreo entra al registro por el extremo
opuesto.
Si se fija el flag del acarreo de antemano, una rotación simple a través del acarreo puede
simular un desplazamiento lógico o aritmético de una posición. Por ejemplo, si el flag del
acarreo contiene 0, después de una rotación hacia la derecha a través del flag del acarreo,
equivale a un desplazamiento lógico hacia la derecha, y si el flag del acarreo contiene una
copia del bit del signo, equivale a un desplazamiento aritmético hacia la derecha. Por esta
razón, algunos microcontroladores tales como los PIC solo tienen las funciones de rotar y rotar
a través del acarreo, y no se preocupan de tener instrucciones de desplazamiento aritmético o
lógico.
Rotar a través del acarreo es especialmente útil cuando se hacen desplazamientos en números
más grandes que el tamaño nativo de la palabra del procesador, porque si, por por ejemplo, un
número grande es almacenado en dos registros y se quiere desplazar hacia la derecha un bit,
el bit que sale del extremo derecho del registro de la izquierda debe entrar por el extremo
izquierdo del registro de la derecha. Con rotación a través del acarreo, ese bit es “almacenado”
en el flag del acarreo durante el primer desplazamiento hacia la derecha sobre el registro de la
izquierda, listo para ser desplazado al registro de la derecha usando una simple rotación con
acarreo hacia la derecha y sin usar ninguna preparación extra.