1. ¿Cuál
es el objetivo de la pila STACK en un procesador?
Stack
o pila es una estructura de datos con acceso del tipo LIFO (Last
In First Out), último en entrar, primero en salir. Este tipo de estructura de
datos es fácil de desarrollar por los sistemas microprocesadores y resulta de
gran utilidad para trabajar con listas de datos y es imprescindible para el
trabajo interno del microprocesador en las subrutinas e interrupciones.
Algunos
microprocesadores pueden tener el Stack en su interior, representando un
sistema muy rápido pero de tamaño limitado, la mayoría de microprocesadores
disponen el Stack en la memoria externa, hecho que proporciona una gran
capacidad de almacenamiento y el control de su ubicación, aunque el acceso sea
más lento.
2. ¿Cuál
es la diferencia entre el código objeto y el código en lenguaje ensamblador de
un procesador?
Cuando programamos en un lenguaje
distinto del lenguaje máquina, nuestro código debe ser traducido a binario para
que el ordenador pueda entenderlo y ejecutarlo. Existe un programa específico
encargado de hacer esa traducción y que, dependiendo del lenguaje en el que
hayamos escrito nuestro programa, puede ser un ensamblador o un
compilador.
Ensambladores Se llaman ensambladores los programas encargados de traducir los programas escritos en ensamblador a código binario.
Fíjese en que tanto el programa traductor como el lenguaje se llaman del mismo modo: ensamblador.
Como el lenguaje ensamblador es muy próximo al binario, estos traductores son programas relativamente sencillos.
Compiladores
El compilador es un programa que traduce el código de alto nivel a código binario. Es, por tanto, parecido al ensamblador, pero mucho más complejo, ya que las diferencias entre los lenguajes de alto nivel y el código binario son muy grandes.
El programa escrito en lenguaje de alto nivel se denomina programa fuente o código fuente. El programa traducido a código binario se llama programa objeto o código objeto. Por lo tanto, el compilador se encarga de convertir el programa fuente en un programa objeto.
Una vez que se ha obtenido el programa objeto ya no es necesario volver a realizar la traducción (o compilación), a menos que se haga alguna modificación en el programa fuente, en cuyo caso habría que volver a compilarlo.
El programa objeto, una vez generado, puede ejecutarse en la máquina en la que fue compilado, o en otra de similares características (procesador, sistema operativo, etc.).
Cuando el programa objeto se haya disperso en diferentes archivos (lo que ocurre con frecuencia cuando el programa es grande o, sencillamente, cuando usa funciones escritas por terceras personas), puede ser necesario un proceso previo de enlace de los diferentes módulos. De eso se encarga un programa llamado enlazador o linker, ya ven qué original, que suele actuar inmediatamente después del compilador.
Ensambladores Se llaman ensambladores los programas encargados de traducir los programas escritos en ensamblador a código binario.
Fíjese en que tanto el programa traductor como el lenguaje se llaman del mismo modo: ensamblador.
Como el lenguaje ensamblador es muy próximo al binario, estos traductores son programas relativamente sencillos.
Compiladores
El compilador es un programa que traduce el código de alto nivel a código binario. Es, por tanto, parecido al ensamblador, pero mucho más complejo, ya que las diferencias entre los lenguajes de alto nivel y el código binario son muy grandes.
El programa escrito en lenguaje de alto nivel se denomina programa fuente o código fuente. El programa traducido a código binario se llama programa objeto o código objeto. Por lo tanto, el compilador se encarga de convertir el programa fuente en un programa objeto.
Una vez que se ha obtenido el programa objeto ya no es necesario volver a realizar la traducción (o compilación), a menos que se haga alguna modificación en el programa fuente, en cuyo caso habría que volver a compilarlo.
El programa objeto, una vez generado, puede ejecutarse en la máquina en la que fue compilado, o en otra de similares características (procesador, sistema operativo, etc.).
Cuando el programa objeto se haya disperso en diferentes archivos (lo que ocurre con frecuencia cuando el programa es grande o, sencillamente, cuando usa funciones escritas por terceras personas), puede ser necesario un proceso previo de enlace de los diferentes módulos. De eso se encarga un programa llamado enlazador o linker, ya ven qué original, que suele actuar inmediatamente después del compilador.
3. Consulte
el set de instrucciones básicas del procesador 8086
Instrucciones de movimientos de datos
MOV
|
destino,
fuente
|
;la única
instrucción que utiliza todos los tipos de direccionamiento
|
XCHG
|
destino,
fuente
|
;Intercambia
los contenidos de destino y fuente
|
XLAT
|
tabla
fuente
|
;carga el
registro AL con el byte direccionado por (BX+AL)
|
LAHF
|
;carga las
flags S, Z, A, P y C en AH
|
|
SAHF
|
;guarda AH
en el registro de flags
|
|
LDS
|
destino,
fuente
|
;transfiere
un puntero de 32 bits al registro DS y al registro destino
|
LES
|
destino,
fuente
|
;transfiere
un puntero de 32 bits al registro ES y al registro destino
|
LEA
|
destino,
fuente
|
;transfiere
el offset de fuente (una dirección) a destino (un
registro)
|
PUSH
|
fuente
|
;guarda fuente en
el Stack (en la dirección SS:SP)
|
POP
|
destino
|
;recupera
del Stack (dirección SS:SP-1) y guarda en registro destino
|
PUSHF
|
;almacena
el registro de flags en/desde el Stack
|
|
POPF
|
;recupera
el registro de flags en/desde el Stack
|
|
PUSHA
|
; almacena
los regs. DI,SI,BP,SP,BX,DX,CX,AX en/desde el Stack
|
|
POPA
|
; recupera
los regs. DI,SI,BP,SP,BX,DX,CX,AX en/desde el Stack
|
|
IN
|
origen
|
;carga
desde un puerto origen un byte o Word en AL o AX
|
OUT
|
destino
|
;escribe
Al o AX en el puerto destino (direccionan. inmediato o DX)
|
Las operaciones aritméticas
ADD
|
destino,
fuente
|
;suma fuente + destino y
guarda el resultado en destino
|
ADC
|
destino,
fuente
|
;suma fuente + destino +
Carry y guarda el resultado en destino
|
SUB
|
destino,
fuente
|
;resta destino - fuente y
guarda el resultado en destino
|
SUB
|
destino,
fuente
|
;resta destino - fuente -
Carry y guarda el resultado en destino
|
MUL
|
fuente
|
;multiplica
AL o AX * fuente y guarda el resultado en DX:AX
|
IMUL
|
fuente
|
;igual que
la anterior pero con números enteros con signo
|
DIV
|
fuente
|
;divide
DX:AX / fuente y guarda cociente en AX y resto en DX
|
IDIV
|
fuente
|
;igual que
la anterior pero con números enteros con signo
|
AND
|
destino,
fuente
|
;opera
destino AND fuente y guarda resultado en destino
|
OR
|
destino,
fuente
|
;opera destino OR fuente y
guarda el resultado en destino
|
XOR
|
destino,
fuente
|
;opera destino XOR fuente y
guarda el resultado en destino
|
NOT
|
destino
|
; El NOT
cambia todos los 1 en 0 y los 0 en 1 de destino.
|
NEG
|
destino
|
;NEG
realiza el complemento a 2 de destino
|
INC
|
destino
|
;Incremente
en 1 el contenido de destino
|
DEC
|
destino
|
;Decremento
en 1 el contenido de destino
|
DAA / DAS
|
;Efectúa
el ajuste decimal en suma / resta del registro AL
|
|
AAA/AAD/
AAM/AAS
|
;ajustan
el registro AL a valor decimal desempaquetado (para aplicar en operaciones
suma, resta, multiplicación y división)
|
Instrucciones de
rotación
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
|
Instrucciones de
comparación
CMP
|
destino,
fuente
|
; compara fuente y destino.
Modifica las flags V, Z, S, C, P y AC
|
TEST
|
destino,
fuente
|
; AND
entre fuente y destino. Ninguno de los operandos
cambia.
|
TEST modifica las mismas flags que CMP pero siempre deja a V = 0 y C = 0.
Instrucciones de strings
CMPS
|
string_destino,string_fuente
|
;compara
las dos cadenas de a bytes o words
|
CMPSB
|
string_destino,string_fuente
|
;origen y
destino indicados por DS:SI y ES:DI (bytes)
|
CMPSW
|
string_destino,string_fuente
|
;origen y
destino indicados por DS:SI y ES:DI (words)
|
LODS
|
string_fuente
|
;mueve un
byte o una word desde fuente a AL o AX
|
LODSB
|
string_fuente
|
;origen
indicado por DS:SI (mueve un byte a AL)
|
LODSW
|
string_fuente
|
;origen
indicado por DS:SI (mueve una word a AX)
|
STOS
|
string_destino
|
;mueve un
byte o una word al destino desde AL o AX
|
STOSB
|
string_destino
|
;destino
indicado por ES:DI (mueve AL a un byte)
|
STOSW
|
string_destino
|
;destino
indicado por ES:DI (mueve AX a una word)
|
MOVS
|
string_destino,string_fuente
|
;mueve un
byte o word de fuente a destino
|
MOVSB
|
string_destino,string_fuente
|
;origen y
destino indicados por DS:SI y ES:DI (un byte)
|
MOVSW
|
string_destino,string_fuente
|
;origen y
destino indicados por DS:SI y ES:DI (una word)
|
SCAS
|
string_destino
|
;compara
la cadena de destino con AL o AX
|
SCASB
|
string_destino
|
;destino
indicado por ES:DI (compara AL con un byte)
|
SCASW
|
string_destino
|
;destino
indicado por ES:DI (compara AX con una word)
|
Instrucciones de
repetición
LOOP
|
offset
|
;
Decremento CX. Si CX no es cero, salta a offset (IP = IP
+ offset)
|
LOOPZ
|
offset
|
;decrementa
CX, Si CX <> 0 y Z = 1 , salta a offset (IP =
IP + offset)
|
LOOPNZ
|
offset
|
;decrementa
CX, Si CX <> 0 y Z = 0 , salta a offset (IP =
IP + offset)
|
En todos los casos, si no se produce el
salto, se ejecuta la próxima instrucción
REP
|
instrucción
|
;decrementa
CX y repite la siguiente instrucción MOVS o STOS hasta que CX=0
|
REPZ
|
instrucción
|
; Igual
que REP, pero para CMPS y SCAS. Repite si la flag Z queda en 1 (igualdad)
|
REPNZ
|
instrucción
|
;igual que
REPZ, pero repite si la flag Z queda en 0 (las cadenas son distintas)
|
Instrucciones de salto
CALL
|
destino
|
; llama a
procedimiento. IP <-- offset de destino y CS <--
segmento de destino
|
RET
|
valor
|
;retorna
desde un procedimiento (el inverso de CALL), valor es
opcional
|
INT
|
número
|
; llamado
a interrupción. CS:IP <-- vector de INT.Las flags se guardan en el Stack
|
INTO
|
;llama a
la INT 4 si la flag de overflow (V) está en 1 cuando se ejecuta la
instrucción
|
|
IRET
|
;retorna
de interrupción al programa restaurando flags
|
|
JMP
|
dirección
|
;Salta
incondicionalmente al lugar indicado por dirección
|
JA
|
offset
|
;salta a
IP + offset si las flags C=0 Y Z=0 (salta si primer operando
es mayor)
|
JAE
|
offset
|
;salta a
IP + offset si la flag C=0 (salta si primer operando es
mayor o igual)
|
JB
|
offset
|
;salta a
IP + offset si las flags C=1 (salta si primer operando es
menor)(igual a JC)
|
JBE
|
offset
|
;salta a
IP + offset si las flags C=1 o Z=1 (salta si primer operando
es menor o igual)
|
JZ
|
offset
|
;salta a
IP + offset si las flags Z=1 (salta si primer operando es
igual al segundo)(=JE)
|
JG
|
offset
|
;salta a
IP + offset si las flags S=V Y Z=0 (salta si primer operando
es mayor)
|
JGE
|
offset
|
;salta a
IP + offset si las flags S=V (salta si primer operando es
mayor o igual)
|
JL
|
offset
|
;salta a
IP + offset si las flags S<>V (salta si primer
operando es menor)
|
JLE
|
offset
|
;salta a
IP + offset si las flags S<>V o Z=1(salta si primer
operando es menor o igual)
|
JNC
|
offset
|
;salta a
IP + offset si la flag C=0 (salta si no hay Carry)
|
JNZ
|
offset
|
;salta a
IP + offset si la flag Z=0 (salta si no son iguales o no es
cero)
|
JNO
|
offset
|
;salta a
IP + offset si la flag V=0 (salta si no hay overflow)
|
JNP
|
offset
|
;salta a
IP + offset si la flag P=0 (salta si no hay paridad -o la
paridad es impar =JPO)
|
JNS
|
offset
|
;salta a
IP + offset si la flag S=0 (salta si no hay bit de signo)
|
JO
|
offset
|
;salta a
IP + offset si la flag V=1 (salta si hay desbordamiento
-overflow)
|
JP
|
offset
|
;salta a
IP + offset si la flag P=1 (salta si la paridad es par )
(=JPE)
|
JS
|
offset
|
;salta a
IP + offset si la flag S=1 (salta si el signo es negativo)
|
JCXZ
|
offset
|
;salta a
IP + offset si la flag CX=0 (salta si el registro CX es
cero)
|
Instrucciones que afectan flags
CLC/CMC/STC
|
;pone a
cero / complementa / pone en 1 la flag C (Carry)
|
CLD/STD
|
;pone a
cero / uno la flag de dirección (D=0 hace que SI y DI se incrementen)
|
CLI/STI
|
;deshabilita
/ habilita las interrupciones por hardware enmascarables
|
Instrucciones misceláneas
NOP
|
;no-operación:
el procesador pasa a la instrucción siguiente sin hacer nada
|
CBW
|
;convierte
el byte de AL en palabra (AX), copiando el bit 7 a todo el registro AH
|
CWD
|
;convierte
word en doublé-word, copiando bit 15 de AX a todo el registro DX
|
HLT
|
; El
procesador se detiene hasta que llegue un Reset o una interrupción por hard.
|
4. ¿Qué
ventajas brinda la programación en lenguaje ensamblador, frente a la
programación en lenguajes de alto nivel?
VELOCIDAD
El
proceso de traducción que realizan los intérpretes, implica un proceso de
cómputo adicional al que el programador quiere realizar. Por ello, nos
encontraremos con que un intérprete es siempre más lento que realizar la
misma acción en Lenguaje Ensamblador, simplemente porque tiene
el costo adicional de estar traduciendo el programa, cada vez
que lo ejecutamos.
De
ahí nacieron los compiladores, que son mucho más rápidos que los
intérpretes, pues hacen la traducción una vez y dejan el código objeto, que ya
es Lenguaje de Máquina, y se puede ejecutar muy rápidamente. Aunque el proceso
de traducción es más complejo y costoso que el de ensamblar un programa,
normalmente podemos despreciarlo, contra las ventajas de codificar el programa
más rápidamente.
Sin
embargo, la mayor parte de las veces, el código generado por un compilador es
menos eficiente que el código equivalente que un programador escribiría. La
razón es que el compilador no tiene tanta inteligencia, y requiere ser
capaz de crear código genérico, que sirva tanto para un programa como para
otro; en cambio, un programador humano puede aprovechar las
características específicas del problema, reduciendo la generalidad pero al
mismo tiempo, no desperdicia ninguna instrucción, no hace ningún proceso
que no sea necesario.
Para
darnos una idea, en una PC, y suponiendo que todos son buenos programadores, un
programa para ordenar una lista tardará cerca de 20 veces más en Visual
Basic (un intérprete), y 2 veces más en C (un compilador), que el
equivalente en Ensamblador.
Por
ello, cuando es crítica la velocidad del programa,
Ensamblador se vuelve un candidato lógico como lenguaje.
Ahora
bien, esto no es un absoluto; un programa bien hecho en C puede ser muchas
veces más rápido que un programa mal hecho en Ensamblador; sigue siendo
sumamente importante la elección apropiada de algoritmos y estructuras de datos.
Por ello, se recomienda buscar optimizar primero estos aspectos, en el lenguaje
que se desee, y solamente usar Ensamblador cuando se requiere más optimización
y no se puede lograr por estos medios.
TAMAÑO
Por
las mismas razones que vimos en el aspecto de velocidad, los compiladores e
intérpretes generan más código máquina del necesario; por ello, el programa
ejecutable crece. Así, cuando es importante reducir el tamaño del ejecutable,
mejorando el uso de la memoria y teniendo también beneficios en
velocidad, puede convenir usar el lenguaje Ensamblador. Entre los programas que
es crítico el uso mínimo de memoria, tenemos a los virus y
manejadores de dispositivos (drivers). Muchos de ellos, por supuesto, están
escritos en lenguaje Ensamblador.
FLEXIBILIDAD
Las
razones anteriores son cuestión de grado: podemos hacer las cosas en otro
lenguaje, pero queremos hacerlas más eficientemente. Pero todos los lenguajes
de alto nivel tienen limitantes en el control; al hacer abstracciones, limitan
su propia capacidad. Es decir, existen tareas que la máquina puede hacer, pero
que un lenguaje de alto nivel no permite. Por ejemplo, en Visual Basic no es
posible cambiar la resolución del monitor a medio programa; es una
limitante, impuesta por la abstracción del GUI Windows. En cambio, en
ensamblador es sumamente sencillo, pues tenemos el acceso directo al hardware
del monitor.
5.
Elabore
una tabla donde especifique, los modos
de direccionamiento, su propósito y los registros que involucra
MODOS DE
DIRECCIONAMIENTO
|
PROPOSITO
|
REGISTROS
|
Implícito
|
El operando se especifica en la
misma definición de la instrucción.
|
Operando
Dirección
(SP)
(AX)
|
Inmediato
|
Es el operando el que figura en la
instrucción no su dirección.
|
(BX)
(CX)
(DX)
|
Directo
|
El campo de operando en la
instrucción contiene la dirección en memoria donde se encuentra el operando
|
Operando
(AX)
|
Indirecto
|
El campo de operando contiene una dirección de memoria, en
la que se encuentra la dirección efectiva del operando.
|
Dirección
(BX)
(DI)
(SI)
|
De registro
|
Sirve para especificar operandos que están en registros
|
(DX)
(CX)
|
Indexado respecto a una base
|
Se trata de una combinación de los dos anteriores y
consiste en calcular la dirección efectiva como:
|
Desplazamiento
(SI)
(AX)
|
Direccionamiento paginado
|
En el paginado la memoria se encuentra actualmente
dividida en páginas (bloques de igual longitud)
|
(IP)
|
6.
Elabore
el listado de por lo menos 5 procesadores y consiga para cada uno de ellos el
repertorio de instrucciones.
·
Lenguaje
ensamblador x86: Incluye los procesadores Intel 8086 y 8088
·
Intel
Pentium: Incluye las mismas instrucciones que el x86
·
AMD
Athlon: Incluye las mismas instrucciones que el x86
Instrucciones
de 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.
Instrucciones de la ALU con enteros: El
ensamblador x86 tiene las operaciones matemáticas estándar, como add, sub, mul, y idiv; los
operadores lógicos and, or, xor, neg; desplazamientos, sal/sar, shl/shr;
rotación con/sin acarreo, rcl/rcr, rol/ror, un complemento de instrucciones aritméticas
BCD, aaa, aad, daa y
otras.
Instrucciones
en coma flotante: El ensamblador x86 incluye instrucciones para pila basada en unidades en
coma flotante. Entre ellas se encuentran la suma, resta, negación,
multiplicación, división, resto, raíces cuadradas, truncamiento entero y
truncamiento fraccionado. Las operaciones también incluyen instrucciones de
conversión con las que se puede cargar o almacenar un valor desde memoria a
cualquiera de los siguientes formatos: BCD, entero de 32 bits, entero de 64
bits, punto flotante de 32 bits, punto flotante de 64 bits u 80 bits.
Instrucciones
SIMD: Los
procesadores x86 modernos tienen instrucciones SIMD, que permiten realizar la
misma operación en paralelo sobre diversos valores codificados en un registro
SIMD. Varias tecnologías de instrucciones soportan diferentes operaciones sobre
distintos repertorios de registros, pero todos (desde MMX hasta SSE4, 2)
incluyen cálculo general sobre aritmética entera o en coma flotante (suma,
resta, multiplicación, desplazamiento, minimización, maximización, comparación,
división o raíz cuadrada).
Instrucciones
de manipulación de datos: El
procesador x86 también incluye modos de direccionamiento complejo para
direccionar memoria con un desplazamiento inmediato, un registro, un registro
con desplazamiento, un registro escalado con o sin desplazamiento y un registro
con desplazamiento opcional y otro registro escalado. Entonces por ejemplo, uno
puede codificar Mov eax, [Table + ebx + esi*4] como una instrucción
simple que carga 32 bits de datos desde la dirección localizada en el
desplazamiento (Table + ebx + esi * 4) desde el segmento DS, y almacenarla en
el registro eax. En general, los procesadores x86 pueden cargar y usar memoria
ajustada al tamaño del cualquier registro sobre el que está operando.
7.
¿Cuáles
son las ventajas y las desventajas de programar lenguajes ensambladores, frente
a otros como C o java por ejemplo?
Ensamblador
(Assembly)
Ventajas
·
Controla con precisión la operación del micro
controlador y permite al programador precisión en las operaciones.
·
Permite escribir un código más sucinto, y por
lo tanto más veloz. En aplicaciones profesionales se usa sobre todo para
escribir drivers para interfaces de periféricos o para escribir rutinas
altamente optimizadas que requieren velocidad, tamaño reducido y/o precisión.
·
Es valioso como herramienta educacional, ya
que para escribir ensamblador uno debe conocer a detalle la arquitectura
interna del micro controlador, el set de instrucciones, los registros y su
funcionamiento interno.
Desventajas
·
No es portable, debido a que depende de la
estructura interna del micro controlador, el código de un micro controlador no
puede correr en otro de diferente arquitectura.
·
No posee estructura ni control de tipos, por
lo cual, el programador debe cuidar por sí mismo de proveer una estructura
adecuada a su programa y controlar los tipos de datos.
·
El mantenimiento del código (revisión,
modificación, ampliación) es más complicado.
8.
¿Qué
función cumple las siguientes líneas de código?
Mov ax, 10: Es la asignación de un registro a una
determinada posición de memoria, pone en AX el valor que tuviera la posición 10 de memoria.
Mov bx, 12: Es la asignación de un registro a una
determinada posición de memoria, pone en BX el valor que tuviera la posición 12 de memoria.
Cmp ax, bx: Compara
dos registros, o un registro y una dirección de memoria, está comparando el
registro BX con el AX.
Jle Hace_Algo: Salta
a IP + offset si las flags S<>V o Z=1(salta si primer operando
es menor o igual)
9. Elabore
una tabla en la que categorice y caracterice las dos clasificaciones de
computadores a que se hace referencia en esta guía
DATOS
|
|||
Simples
|
Múltiples
|
||
INSTRUCCIONES
|
Simples
|
SSID
|
MISD
|
Múltiples
|
SIMD
|
MIMD
|
|
FLYNN
|
CLASIFICACIÓN MODERNA
|
La clasificación de flynn es un tipo de
clasificación que se realiza según la forma de procesar los datos
paralelamente, que en este caso resulta una clasificación debido a la cantidad de datos e instrucciones que se manejan.
La clasificación de flynn hace mención a
cuatro grupos:
SISD (Simples instrucciones,
simples datos):
Tienen
la característica de procesar una instrucción por cada ciclo de reloj.
SIMD (Simples instrucciones, múltiples
datos):
Ejecutan
una instrucción con múltiples datos
MISD (Múltiples instrucciones, múltiples
datos):
Ejecutan
varias instrucciones con un solo dato
MIMD (Múltiples instrucciones, múltiples
datos):
Ejecutan
diferentes instrucciones con diferentes datos
|
Multiprocesadores:
Un multiprocesador
puede verse como un computador paralelo compuesto por varios procesadores
interconectados que comparten un mismo sistema de memoria. Los sistemas
multiprocesadores son arquitecturas MIMD con memoria compartida. Tienen un
único espacio de direcciones para todos los procesadores y los mecanismos de
comunicación se basan en el paso de mensajes desde el punto de vista del
programador.
Dependiendo de la forma en que los procesadores comparten la memoria,
se clasifican en sistemas multiprocesador UMA, NUMA y COMA.
UMA (Acceso de
Memoria Uniforme): Sistema multiprocesador con acceso uniforme a memoria.
NUMA (No Acceso de Memoria Uniforme): Un sistema
multiprocesador NUMA es un sistema de memoria compartida donde
el tiempo de acceso varía según donde se encuentre localizado el
acceso.
COMA (Escondrijo Sólo Acceso de Memoria): Los sistemas COMA son un caso especial de
los sistemas NUMA. Este tipo de sistemas no ha tenido mucha transcendencia,
al igual que los sistemas SIMD.
|
10. Cuáles son las ventajas y desventajas técnicas de los procesadores simétricos y frente a los asimétricos
Procesadores Simétricos frente a los asimétricos
VENTAJAS
1. Este tipo de sistemas tienden a ser más
eficientes porque las tareas tanto del sistema operativo como de los usuarios
pueden ser distribuidas en forma balanceada a todos los procesadores.
2. El tiempo de inactividad de un procesador
mientras otro está sobre trabajando es mínimo.
3. Si un procesador falla, es posible que sus
tareas sean repartidas entre los demás y no es necesario que todo el sistema
sea parado o que falle el sistema.
4. Los sistemas SMP permiten que cualquier
procesador trabaje en cualquier tarea sin importar su localización en memoria.
5. Muchos procesos pueden ejecutarse
simultáneamente (N procesos si hay N CPU) sin que haya deterioro del desempeño.
6. Permite compartir dinámicamente trabajos y
recursos entre los distintos procesadores, y puede reducir la varianza entre
los sistemas.
DESVENTAJAS
1. Conforme se añaden procesadores, el tráfico en
el bus de memoria se satura.
2. Al manejarse ocho o más procesadores, el cuello
de botella se vuelve crítico, inclusive para los mejores diseños, por lo que
SMP es considerada una tecnología poco escalable.
3. Los sistemas operativos que soportan este tipo
de multiprocesamiento son más difíciles de diseñar.
4. Dado que las CPU son independientes, una podría
estar ociosa mientras otra está sobrecargada, con la consiguiente ineficiencia.
11. Cuáles son las ventajas y desventajas técnicas de los sistemas RISC Y CISC
VENTAJAS
|
DESVENTAJAS
|
|
CISC
|
·
Facilidad
de implementación del conjunto de instrucciones
·
Compatibilidad
hacia adelante y hacia atrás de nuevas CPU’s
·
Facilidad
de programación
·
Puede ser
menor la complejidad del computador
|
·
La
complejidad del conjunto de instrucciones crece
·
Las
instrucciones de longitud variable reducen el rendimiento del sistema
·
Inclusión
de instrucciones que raramente se usan
|
RISC
|
·
Se
incrementa la velocidad debido a un conjunto de instrucciones más simples
·
Hardware
más simple debido a instrucciones más sencillas que requieren menos espacio
en el chip
·
El ciclo
de diseño más corto resulta en un diseño efectivo, costos controlados de
desarrollo y tiempo de salida al mercado más corto
|
·
Excesiva
dependencia en la efectividad del compilador
·
La
depuración de los programas se hace difícil por la programación de
instrucciones
·
Se
incrementa el tamaño del código de lenguaje máquina
·
Necesidad
de memoria rápida
|
12.
Haga una breve descripción de las características de los procesadores
con múltiples núcleos
Características
·
Una de las principales características es que un solo procesador tiene
la capacidad de hacer la función de dos o más procesadores a la vez
·
Los procesadores multinucleo no solo los podemos encontrar en
computadoras si no también en celulares tabletas etc.
Ventajas
·
Mejora el rendimiento de la maquina
·
Se recalienta menos la maquina
·
Se ocupa menos espacio de memoria
·
Las tareas se reparten entre los núcleos
13. A que se le denomina procesadores multinúcleo consiga ejemplo de ello
13. A que se le denomina procesadores multinúcleo consiga ejemplo de ello
Un
procesador de núcleo múltiple es un circuito integrado (IC) al cual se ha unido
dos o más procesadores para mejorar el rendimiento, reducir el consumo de
energía, y lograr el procesamiento simultáneo más eficiente de múltiples tareas
(véase procesamiento en paralelo). Un montaje de núcleo doble es algo comparable a
tener múltiples procesadores separados, instalados en la misma computadora; pero
debido a que los dos procesadores están de hecho conectados al mismo socket, la conexión entre
ellos es más rápida.
Ejemplos:
Procesadores Multinúcleo de Intel
Actualmente Intel está fabricando procesadores de doble núcleo. Comenzó
fabricando los Pentium D en el 2005, luego en el 2006 lanzó los Core
Duo y el Core 2 Dúo.
Pentium D
Los Pentium D están conformados por dos procesadores Pentium 4 Prescott
sin Hyperthreading. Luego Intel sacó el Pentium Extreme Edition (No confundir
con el Pentium 4 Extreme Edition) que era un procesador que tenía los
procesadores P4 Prescott, con la tecnología Hyperthreading, lo que hacía que el software viera cuatro procesadores.
Las características de los Pentium D son:
·
Proceso de
fabricación de 90nm
·
Tienen la
tecnología EM64T, que permite trabajar con 64 bits de forma nativa
·
Utilizan
núcleos Smith Field (basados en los Prescott), cada uno de ellos tiene
una memoria caché L2 de 1MB
·
Van desde
2.80GHz, del modelo menos potente, hasta 3.20GHz para el
modelo más potente.
El procesador que contiene dos núcleos Prescott se llama Smithfield. Los
nuevos procesadores de doble núcleo Pentium D se llaman Presler, están
construidos con tecnología de fabricación de 65nm y van desde 2.8 hasta
3.73Ghz. Tienen una caché L2 por cada núcleo de 2MB (4MB en total).
Procesadores Multinúcleo de AMD
Antes de sacar sus procesadores multinúcleo al mercado, AMD ya había
conseguido un gran éxito con su procesador Athlon 64, que incorporaba
la capacidad de direccional 64 bits de memoria, la tecnología HyperTransport
que era un nuevo bus bastante rápido que eliminaba cuellos de botella
anteriores, y otras tecnologías; este procesador fue tomado como base para
la construcción de su procesador de doble núcleo Athlon 64
X2, que salió al mercado a partir del 2005.
Para Servidores, AMD sacó el procesador Opteron X2, que se basaba
también en el Opteron de un solo núcleo, el hermano mayor de los Athlon 64.
Para Portátiles AMD ha sacado el Turion X2, que lleva el poder de los procesadores de doble núcleo al campo
de los móviles.