Documentos de Académico
Documentos de Profesional
Documentos de Cultura
de Computadores
3. Lenguaje Mquina
1. Visin del Programador
2. Formato de las Instrucciones
3. Modos de Direccionamiento
4. Instrucciones Tpicas
5. Un Ejemplo: Motorola 68000
En el captulo anterior hemos visto la interfaz hardware que ofrece la CPU, esto es, los elementos
que ofrece para conectarla con el resto de los componentes de un ordenador. Ahora abordaremos
la interfaz software, o lo que es lo mismo, lo que necesitan saber los programadores o
constructores de compiladores para poder escribir programas capaces de ejecutarse en la CPU.
Esta interfaz software muestra aspectos como el repertorio y formato de las instrucciones que
ofrece, con sus variados modos de direccionamiento para acceso a los operandos. Pero para
poder escribir programas para una CPU tambin se necesita conocer otros aspectos como los
registros internos, estructura o visin de la memoria y los tipos de datos que maneja directamente
la ALU.
Despus de dar una introduccin general a estos aspectos, se ver con cierto detalle un caso
concreto: el procesador 68000 de Motorola.
Visin del
Hardware CPU Memoria
PC $0000
0400
SP 10FF $0001
SR
R0 $0400
... prog.
$0B00 2y
Rn datos
$1000
pila
Bus Bus
Datos Dir. $10FF
(x bits) (y bits) $FFFF
x
Arquitectura de Computadores Lenguaje Mquina - 2
El programador ms inmediato de un ordenador trabaja a muy bajo nivel, pues ve el hardware muy
de cerca. Los programas los tiene que escribir en lenguaje mquina o, normalmente, en
ensamblador, es decir, una representacin nemotcnica del lenguaje mquina en la que cada
instruccin ensamblador se corresponde con una instruccin mquina.
Qu tiene que conocer este programador de ensamblador o de lenguaje mquina para escribir
programas para el ordenador? La respuesta es Algo de hardware y algo de software.
1) Algo de hardware:
Algunos detalles de la CPU:
- Registros generales y de control (Contador de Programa,
Puntero de Pila, Registro de Estado, ...).
- Tamao de los registros generales, para saber el rango de los
nmeros que se pueden manejar.
Tamao de la memoria
Visin del
Software Pila
E1
Juego de Instrucciones
Nemotcnico Cod. Mquina 50
move #3,R2 11000111 ($C7)
2B
add R2,R3 00110110 ($36)
...
9A
...
sub #1,R2 01100110 ($66)
- Meter
LIFO
- Sacar
2) Algo de software:
El juego de instrucciones
Organizacin de la pila (si la hay).
Estos elementos de hardware y de software son con los que cuenta el programador para escribir
sus programas, o lo que es lo mismo, sta es la visin del programador del ordenador bsico.
En resumen, cuenta con una memoria donde almacena su programa (con las instrucciones y los
datos) y una CPU que es capaz ejecutar las instrucciones del programa, ayudndose para ello de
registros internos a los que trae los operandos desde la memoria principal, y de una pila para
guardar ciertos datos temporales.
Puesto que ya conocemos la estructura bsica de una CPU, en este captulo vamos ocuparnos del
lenguaje mquina, es decir, del formato que pueden tener las instrucciones mquina, de los modos
de direccionamiento disponibles para acceder a los operandos indicados en las instrucciones y, por
supuesto, de los distintos tipos de instrucciones que suelen ofrecer los procesadores de propsito
general (al menos los de tipo CISC).
Al final del captulo particularizaremos todo esto para el microprocesador de Motorola MC68000,
comentando su estructura general, organizacin de la memoria, su pila y, por supuesto, su juego
de instrucciones.
Cod. Op.
- Valor
- Direccin memoria
registro
Una instruccin mquina es una secuencia de bits que indica una operacin que debe realizarse y
con qu operandos debe realizarse.
Los operandos son datos que estn en alguno de los registros internos de la CPU, en la memoria
principal o en algn controlador de entrada/salida.
Una instruccin siempre realiza alguna accin sobre algn o algunos operandos. Estos pueden
estar indicados implcita o explcitamente en la instruccin mquina.
Un operando est implcito en una instruccin cuando el propio cdigo de operacin establece
sobre qu acta la operacin. En este caso, tal operando es fijo, es decir, el programador no puede
establecer que esa instruccin acte con otro operando distinto.
Cuando una instruccin puede operar con diversos operandos posibles, a elegir por el
programador, los operandos elegidos deben figurar de manera explcita (separados del cdigo de
operacin) en la instruccin mquina.
Si una instruccin utiliza varios operandos, estos pueden ser una mezcla de operandos implcitos y
explcitos.
El formato de una instruccin mquina define la disposicin y el reparto de sus bits entre los
componentes de la instruccin, esto es, el cdigo de operacin y los operandos.
Una instruccin mquina debe incluir el cdigo de operacin y, si los tiene, uno o ms operandos
explcitos. A cada operando explcito se accede mediante uno de los distintos modos de
direccionamiento que veremos en el siguiente apartado.
Como veremos ms tarde (al comentar los distintos tipos de instrucciones que se suelen encontrar
en los procesadores de propsito general) ya que hay instrucciones con uno, dos, tres o ningn
operando explcito, es normal que los juegos de instrucciones estn compuestos por instrucciones
con distintos formatos. En el formato de cada instruccin se suele indicar implcita o explcitamente
el modo de direccionamiento de cada uno de sus operandos.
A la hora de disear un juego de instrucciones, se deben tener en cuenta ciertas consideraciones sobre dos
cuestiones: la longitud de la instruccin y el reparto de los bits que la componen.
Longitud de la instruccin. Hay un claro compromiso entre el deseo de un rico y variado repertorio de instrucciones,
y la necesidad de ahorrar espacio. Los programadores quieren muchos cdigos de operacin distintos (requiere
muchos bits en el campo de cdigo de operacin) para disponer de operaciones que se ajusten lo ms posible a sus
necesidades, y as escribir programas ms cortos. De igual manera, cuantos ms modos de direccionamiento estn
disponibles, ms flexibilidad tendrn para manejar estructuras de datos complejas, como tablas o matrices. Por otro
lado, puesto que cada vez se dispone de mayor cantidad de memoria, se requieren muchos bits para hacer referencia
a un gran espacio de direccionamiento. Pero claro, una instruccin que ofrezca todo esto puede ocupar 32 bits,
posiblemente, el doble que otra similar que no ofrezca tanta flexibilidad. Est claro que una instruccin larga ocupa ms
espacio en memoria que una corta, se tarda ms tiempo en llevarla de memoria a la CPU, y se tarda ms tiempo en
decodificarla.
Se debe tener en cuenta que el ancho del bus de datos sea mltiplo de la longitud de un carcter, para evitar
desaprovechar el espacio de almacenamiento. Y esta restriccin afecta a la longitud de las instrucciones, que deben
ocupar un nmero entero de palabras, o en una palabra debe caber un nmero entero de instrucciones. Por esto los
tamaos de las instrucciones suelen ser mltiplos de 8. Un diseo con caracteres de 9 bits, instrucciones de 12 y
palabras de 31 bits sera una catstrofe.
Reparto de los bits. Aqu el compromiso est en el reparto de los bits disponibles entre el nmero de cdigos de
operacin y la versatilidad de los operandos. Esta versatilidad genera las siguientes preguntas: cuntos operandos
hay en la instruccin?, de cuntos modos de direccionamiento se dispone?, dnde estn los operandos, en registros
o en memoria?, cuntos registros hay?.
El direccionamiento a memoria tambin plantea una pregunta: cul es la granularidad de las direcciones?. Es decir,
a dnde apunta cada direccin, a un byte, a una palabra de 16 bits, a una palabra de 32 bits, ...? Si el grano es de 1
byte, para direccionar una memoria de 64 Kb se requieren 16 bits, mientras que si el grano fuera una palabra de 4
bytes, solo se necesitaran 14 bits, lo cual significa instrucciones ms cortas, menor espacio para el programa, y un
menor tiempo para alimentar la instruccin. Sin embargo, tiene la pega de que para obtener un carcter de memoria
hay que acceder a la palabra completa, y luego en la CPU seleccionar la parte deseada, lo cual consume tiempo.
OTRO CASO
Intel -Motorola
Instrucciones de 16 bits
Instruccin de
Longitud variable Hasta 3 operandos en 16 registros
Cmo?
Arquitectura de Computadores Lenguaje Mquina - 6
Debido a los compromisos que acabamos de ver, normalmente todos los juegos de instrucciones son de longitud
variable, es decir, disponen de diversos formatos de instruccin, con distintas longitudes que se adaptan a las
necesidades de la instruccin. Por esto, es normal encontrarse que en una misma mquina hay instrucciones de 1, 2, 3
y 4 o ms bytes de longitud (eso s, siempre con un tamao mltiplo de 8 bits).
El Pentium de Intel, tiene instrucciones de longitud variable, y pueden llegar a tener un tamao de hasta 12 bytes. El
PowerPC, por el contrario, tiene un juego de instrucciones con un formato regular de 32 bits, donde los 6 primeros
corresponden al cdigo de operacin.
Hasta ahora hemos supuesto que una vez decidido el nmero de bits reservado para el cdigo de operacin, tanto este
nmero como el reservado para los operandos es fijo. Por ejemplo, si una CPU ofrece 100 instrucciones, parece que el
cdigo de operacin debe tener reservados 7 bits en la instruccin. Pero en algunas arquitecturas en las que las
instrucciones son de longitud fija (como en el PowerPC), puede resultar conveniente hacer variable el tamao del
cdigo de operacin, para acomodarse a las necesidades de la instruccin. Vemoslo con un ejemplo.
Supongamos una mquina con instrucciones de 16 bits, que realiza operaciones hasta con 3 operandos, y que stos
siempre estn en alguno de sus 16 registros. Esto quiere decir que se necesitan 4 bits por operando, y que si puede
haber hasta 3 operandos, se necesitan 12 bits para ellos. Esto nos deja con 4 bits para cdigos de operacin, lo que
significa que puede haber hasta 16 operaciones distintas con 3 operandos.
Pero resulta que lo que se desea es un juego con 15 instrucciones de 3 operandos, 14 instrucciones de dos operandos,
31 de un operando, y 16 instrucciones sin operandos. Cmo hacerlo? Con Cdigos de Operacin con Extensin.
En la siguiente transparencia tenemos la solucin.
Los cdigos de operacin con extensin son bastante comunes. No solamente los utilizan procesadores con formatos
instruccin de longitud fija, como el PowerPC, sino los de longitud variable como el 80386, 80486 y Pentium de Intel, y
la familia 68000 de Motorola.
16 instrucciones
14 instrucciones
sin operandos
de 2 operandos Cod. Op. 1111 1111 1111 0000
Cod. Op. 1111 0000 XXXX YYYY
de 16 bits 1111 1111 1111 0001
de 8 bits 1111 0001 XXXX YYYY 1111 1111 1111 0010
1111 0010 XXXX YYYY . . .
. . . . . .
. . . 1111 1111 1111 1101
. . . 1111 1111 1111 1110
1111 1100 XXXX YYYY 1111 1111 1111 1111
1111 1101 XXXX YYYY
15 instrucciones de 3 operandos.
Comencemos con el formato de las 15 instrucciones de 3 operandos de 4 bits. No tenemos ningn problema, pues para representar
15 cdigos de operacin se requieren 4 bits, y los 12 bits restantes se utilizan para los tres operandos de 4 bits.
As, los cdigos de operacin sern el 0000, 0001, ..., hasta el 1110. Y nos sobra una combinacin de las 165 que ofrecen 4 bits!
14 instrucciones de 2 operandos.
La combinacin que nos sobraba del formato anterior (la 1111) la utilizaremos ahora para indicar un nuevo formato de instruccin.
Es decir, las instrucciones cuyos 4 bits de mayor peso sean 1111 tendrn un cdigo de operacin extendido con los 4 bits
siguientes. En este nuevo formato, el cdigo de operacin ocupa 8 bits, donde los 4 de mayor peso estn siempre a 1. Los ocho
bits restantes se utilizan para indicar los dos operandos de este formato.
Ahora nos encontramos con que tambin nos sobran dos combinaciones: 1111 1110 y 1111 1111. Las aprovecharemos.
31 instrucciones de 1 operando.
Si los cuatro bits de mayor peso a 1 indican que el cdigo de operacin se extiende o ampla con otros cuatro, cuando los 7 bits de
mayor peso son 1111 111, indica que el formato de tales instrucciones est formado por un cdigo de operacin de 12 bits (los de
mayor peso). Los cuatro bits restantes se utilizan como operando.
Para este formato disponemos ahora de 5 bits para expresar 31 nuevas instrucciones, las que tienen los cdigos desde 1111 1110
0000 hasta 1111 1111 1110. Ahora nos sobra una combinacin de las disponibles.
Cuando se planifican formatos de instrucciones con cdigos de operacin con extensin, para cada formato, se debe reservar
alguna de las combinaciones posibles para expresar una extensin en el cdigo de operacin.
En Memoria Principal
Muchos bits
En Registros de la CPU
Se requieren pocos bits
Rpido acceso
Pocos registros
Hay que cargar los registros
El diseo cuidadoso de los cdigos de operacin es una parte importante del juego de instrucciones de una mquina.
No obstante, la mayor parte de los bits de una instruccin se utilizan para especificar los operandos de la operacin,
por lo que tambin debe afrontarse con mucho cuidado el modo de direccionar los operandos de las instrucciones.
Vamos a considerar ahora dos factores sobre los operandos a tener en cuenta en el diseo del formato de las
instrucciones:
Dnde poner los operandos
Cuntos operandos se indican en la instruccin
Todos
ADD $FF1234,$FFF123,$FFFF12
Requiere muchos bits
Reutilizar Alguno
ADD $FF1234,$FFF123
En cuanto al nmero de operandos, algunas instrucciones pueden requerir tres operandos, como
la suma (dos sumandos y un resultado), lo cual puede resultar en un exceso de bits. Por ello, la
mayora de este tipo de instrucciones suele utilizar como resultado uno de los mismos operandos,
ahorrando as espacio en la instruccin. Otra posibilidad consiste en no indicar los operandos
explcitamente en la instruccin, utilizando directamente ciertos operandos de forma implcita. As,
algunas mquinas indican un nico operando para realizar una suma, y lo que hacen es aadir el
contenido de ese operando al de un registro especial llamado acumulador, y el resultado lo dejan
tambin en el acumulador. El problema que presenta esta ltima tcnica es que cuando hay
muchos clculos, hay que estar constantemente cargando y salvando el contenido del acumulador,
lo cual requiere espacio de instrucciones y tiempo de ejecucin. Otro modo de indicar operandos
implcitos es con los direccionamientos orientados a Pila que veremos en las siguientes
transparencias.
MOV_AC #47
C. Op. Operando
Constantes pequeas
Nmeros en complemento a dos
Sin referencias a memoria
Como ya hemos mencionado, el espacio disponible para los operandos en una instruccin suele
estar bastante limitado. Tambin sabemos que los datos con los que hay que operar pueden
encontrarse en los registros del procesador, en variables de la memoria principal o en la pila. Por
otra parte, dependiendo de la complejidad de las estructuras de datos manejadas se puede hacer
necesaria la utilizacin de modos de direccionamiento ms o menos complejos. Algunas veces el
modo del direccionamiento viene indicado implcitamente por el cdigo de operacin, que fuerza el
modo de direccionamiento, en otros casos el modo debe indicarse explcitamente en cada
operando.
Vamos a dedicarnos ahora a tratar algunos modos de direccionamiento ms comunes que suelen
encontrarse en los procesadores de propsito general. Aunque hay mltiples variaciones, todas
ellas suelen estar basadas en los modos que vamos a tratar a continuacin.
Direccionamiento Inmediato
La forma ms simple de indicar un operando es incluyndolo en la propia instruccin. Ya que las
instrucciones no son modificables, este es el modo que se utiliza en operaciones con constantes.
Si la constante es un valor numrico, se almacena en complemento a dos.
La ventaja del direccionamiento inmediato es que no se requieren referencias adicionales a
memoria para obtener el operando, ahorrando por lo tanto espacio y tiempo. El inconveniente es
que el espacio reservado para este operando suele estar restringido y suele ser menor que el
tamao de la palabra, por lo que en algunos procesadores solamente se utiliza para constantes de
valores pequeos.
INC $10B0
C. Op. dddddddddddddddd ....
operando
INC R2
Registros
C. Op. rrrr .... de la CPU
operando
Direccionamiento a Registro
Este modo es similar al direccionamiento directo, pero en este caso, el campo de direccin se
refiere a uno de los registros generales del procesador.
Las ventajas que tiene es que solo necesita 3 o 4 bits para indicar uno de los registros generales, y
que no requiere referencias adicionales a memoria. El inconveniente es que no se suele disponer
de muchos registros, aunque con el advenimiento de las mquinas RISC, la tendencia es a ir
incrementando su nmero.
Se utiliza para guardar valores temporales en la evaluacin de expresiones, o para mantener en
registros algunas variables que se referencian muy a menudo.
INC_IND R7
C. Op. rrrr .... Memoria
dddddd operando
Registros
de la CPU
Direccionamiento Indirecto
Si en el direccionamiento directo, el campo de operando indicaba la direccin del dato, en el direccionamiento indirecto,
se hace referencia a una palabra de memoria principal en la que se encuentra la direccin del operando. La otra
posibilidad de este direccionamiento es que el campo de operando hace referencia a un registro general en el que se
encuentra la direccin del dato.
Como se puede apreciar, segn este esquema, con una indireccin se requieren dos accesos adicionales a memoria
para obtener el operando (si es va registro, solo uno).
Este direccionamiento se utiliza cuando la direccin de las variables no se conoce en tiempo de compilacin, sino que
es durante la ejecucin del programa cuando se calcula la direccin del operando y se guarda sta en memoria o en un
registro.
Los procesadores de Intel de la familia 80x86 y Pentium disponen de direccionamiento indirecto por registro, pero no a
travs de memoria. Igual le sucede al MC68000 de Motorola. Su hermano mayor, el MC68020 tambin dispone de
direccionamiento indirecto va memoria.
Una rara variante de este modo es el direccionamiento indirecto multinivel. En este caso, el primer bit de la palabra
direccionada indica si dicha palabra es ya la direccin efectiva del operando, o se debe aplicar un nuevo nivel de
indireccin.
Supongamos que en una determinada mquina se dispone de dos operaciones para incrementar el valor de una
variable en memoria principal, una por direccionamiento directo, y otra por direccionamiento indirecto por memoria, es
decir, que ambas instrucciones constan de cdigo de operacin y de una direccin de memoria principal. Cmo saber
cundo se est utilizando la del direccionamiento directo o la del direccionamiento indirecto?
Hay dos maneras para diferenciarlas:
1) Teniendo cdigos de operacin distintos, que implcitamente indican el modo de direccionamiento.
2) Teniendo ambas el mismo cdigo de operacin, pero disponiendo en la instruccin de un campo que indica
explcitamente el modo de direccionamiento de cada operando.
Ojo! Dos instrucciones en ensamblador con el mismo nombre nemotcnico pueden generar instrucciones mquina
con distintos cdigos de operacin. Y al contrario, dos instrucciones en ensamblador con distinto nombre nemotcnico
pueden generar instrucciones mquina con el mismo cdigo de operacin y distintos modos de direccionamiento.
bbbbbb +
operando
REGISTROS
Relativo CP
Para control de bucles
Segn Por Registro Base Un Registro base
rrrr Para reas de datos reubicables
- Por registro base. Este modo de direccionamiento se utiliza comnmente en los programas reubicables. El
registro base contiene la direccin de una gran rea de datos o de instrucciones. Y los bits del campo de
operando indican el desplazamiento del dato a partir del comienzo del rea de datos indicado por el registro
base.
Adems de permitir programas reubicables, constituye una buena alternativa al direccionamiento directo, pues
requiere pocos bits en el campo de operando.
- Indexado. El propsito de este modo de direccionamiento es facilitar el acceso iterativo a las matrices o tablas de
datos. Lo que se hace es indicar en los bits del campo de operando la direccin inicial de la tabla, y a esta
direccin se le aade el contenido de un registro llamado registro de ndice. Para ir referenciando los
sucesivos elementos de la tabla simplemente hay que ir incrementando el contenido del registro de ndice.
Cima
66 66
(PP)
Cima Cima
55 55 55
(PP) (PP)
Cima
44 44 44 44
(PP)
33 33 33 33
66
22 22 22 22
Base 11 11 11 11 Ac
Direccionamiento a Pila
La Pila es una estructura de datos que se mantiene en memoria principal. Bsicamente es un
vector de celdas de datos de direcciones secuenciales, en los que se meten y sacan datos con
poltica LIFO (Last In, First Out), es decir, el ltimo en entrar es el primero en salir.
Esta estructura es muy til como ayuda en la ejecucin de los programas, pues se utiliza para
guardar en ella variables temporales, parmetros, direcciones de retorno en la llamada a
procedimientos, etc.
El primer elemento que se mete en la pila se dice que esta en el fondo de la pila, y el ltimo que se
ha metido est en la cima de la pila. El inters de la cima de la pila es que siempre est en ella el
primer dato disponible de la pila. Las operaciones con la pila son meter y sacar datos de ella, y
operan utilizando un registro denominado puntero de pila que siempre contiene la direccin de la
cima de la pila.
En algunos procesadores, como el 68000, el registro de puntero de pila es simplemente uno de los
registros generales que se utilizan para direcciones, y se accede a la pila mediante instrucciones
de movimiento de datos y el ya comentado direccionamiento indirecto por registro. Los
procesadores de Intel disponen de un registro especfico: el Puntero de Pila, que siempre est
apuntando a la cima de la pila, y se ofrecen instrucciones especficas para meter y sacar datos de
la pila (PUSH y POP) en las que ni siquiera se indica explcitamente el registro de indireccin, pues
est implcito por el cdigo de operacin.
Tanto en Motorola como en Intel, la Pila es una estructura de datos que, en contra de la intuicin,
crece de las direcciones altas hacia las bajas, es decir, que la cima de la Pila siempre est en una
direccin ms baja que la base de la Pila (salvo cuando la Pila est vaca, claro).
Modo
Inmediato #1234 1130
R0 1234
Directo a registro R0
R1 130
Absoluto 1132 1132 1234
R2 1132
Indirecto por registro (R2) ...
R3 1132
Indirecto por memoria (6003) ...
R4 -6
Indexado 1138(R4) 6000 1130
R5 1133
Pre-decremento -(R5) R6 1100
Post-incremento (R3)+ R7 32
6003 1132
Reg. base + desplazamiento 32(R6)
Relativo al PC 130(PC) PC 1002
Memoria Principal
Relativo al PC indexado (PC,R1)
Resultado
0, 1, 2, n
Operandos
Ortogonalidad En Registros Longitud de
En Memoria Instruccin
Aunque el nmero de instrucciones que se ofrece vara de mquina a mquina, en todas ellas
suelen encontrarse los mismos tipos de instrucciones:
Transferencia de datos
Aritmticas
Lgicas
Transferencia de Control
Control del sistema
Muchas de estas instrucciones utilizan dos operandos, y dependiendo de la versatilidad u
ortogonalidad de la mquina, pueden permitir que ambos operandos estn solamente en registros
generales, uno en registro y el otro en memoria, o los dos en memoria. Obviamente, siempre hay
un compromiso entre la mxima ortogonalidad (cualquier mezcla de modos de direccionamiento),
con la correspondiente longitud de instruccin que ello conlleva.
En general, Intel y PowerPC suelen ofrecer instrucciones en las que no permiten todos los tipos de
direccionamiento en una misma instruccin (por ejemplo, direccionamiento directo para ambos
operandos), sobre todo en el caso del PowerPC, que es un procesador RISC. En cambio Motorola
ofrece un juego de instrucciones ms ortogonal, claro est, a cambio de tener instrucciones de
hasta 10 bytes de longitud.
Otra cuestin que se debe tener en cuenta es que una gran parte de las instrucciones modifican o
establecen los flags de estado del Registro de Estado, indicando si la ltima operacin ha
producido overflow, si un resultado es cero, positivo o negativo, etc.
MOVE OP_fuente,OP_destino
Op_destino := Op_fuente
Operandos en:
Registro
Memoria
Pila
Inmediato
Transferencia de Datos
En realidad no son instrucciones de transferencia o movimiento de datos, sino simplemente de
copia. Es uno de los tipos de instrucciones ms fundamentales. Estas instrucciones tienen dos
operandos, el fuente y el destino, y deben copiar el contenido del operando fuente al de destino.
Por tanto, deben indicar la ubicacin o direccin de ambos operandos, que pueden estar en un
registro, en memoria o en la pila. (El operando fuente tambin puede ser un operando inmediato
incluido en la propia instruccin).
A las instrucciones de copia de memoria a registro se las suele llamar de carga, mientras que las
que copian de registro a memoria se denominan de almacenamiento.
ADD OP_1,OP_2
Op_1 := Op_1 + Op_2
Suma, Resta,
- Coma Fija y Flotante
Multiplicacin,
Divisin - Truncamientos
Aritmticas
Todos los procesadores de propsito general proporcionan las operaciones bsicas aritmticas de
suma, resta, multiplicacin y divisin, siempre, al menos, para nmeros enteros de coma fija. Los
procesadores de los ltimos aos tambin suelen incluir operaciones en coma flotante, y los
mainframes tambin manejan nmeros decimales empaquetados.
Las instrucciones aritmticas suelen ofrecerse con distintas precisiones, y no debe olvidarse que
pueden producirse resultados con truncamiento o redondeo.
Otras instrucciones aritmticas comunes son: incrementar, decrementar, valor absoluto y valor
negado.
OR OP_1,OP_2
Op_1 := Op_1 OR Op_2
Transformacin de formato
Lgicas
Tambin es normal ofrecer instrucciones para manejar los bits individuales de un byte o de una
palabra. Normalmente lo que hacen es realizar operaciones booleanas sobre bits, por lo que las
instrucciones ofrecidas suelen ser: OR, AND, OR exclusivo y NOT (negacin).
Estas operaciones se aplican a bits individuales o a series de bits, de tal forma que si cada
operando es una serie de bits, la operacin lgica se realiza entre el primer bit de la serie 1 y el
primer bit de la serie 2, entre el segundo bit de la serie 1 y el segundo bit de la serie 2, ...
Algunos autores incluyen dentro de las operaciones lgicas las operaciones de Transformaciones
de Formato, es decir, los desplazamientos y las rotaciones. Vemoslas en la siguiente
transparencia.
Desp. Aritmtico
S C C 0
Rotacin
C C
Desplazamientos y Rotaciones
Los desplazamientos y las rotaciones se aplican sobre un nico operando, y pueden actuar a
derechas o a izquierdas.
Los desplazamientos pueden ser lgicos o aritmticos. El desplazamiento aritmtico a la derecha
va replicando el bit de signo (el del extremo izquierdo) a medida que se va desplazando, por lo que
se mantiene el signo en el resultado. En el desplazamiento aritmtico a izquierdas, el
desplazamiento no afecta al bit de signo, por lo que tambin se mantiene el signo en el resultado.
Como ya es sabido, el efecto aritmtico de un desplazamiento a izquierdas es el de ir multiplicando
por las sucesivas potencias de 2, mientras que el desplazamiento aritmtico a la derecha produce
la divisin por las sucesivas potencias de 2.
Ya que las rotaciones y los desplazamientos suelen afectar al bit de acarreo, estas instrucciones
sirven para analizar de forma individual los bits que componen un byte o una palabra de datos,
pues simplemente hay que consultar en cada momento el bit de acarreo para saber el valor que
tena el ltimo bit de la izquierda o la derecha antes de realizar la operacin.
Establecer Privilegio
Modificacin del Registro de Estado
RESET, HALT, ...
Saltos
Incondicionales Condicionales
JMP direccin
BEQ direccin
1 2
Establecer Bifurcar BNE direccin
Estado segn Condicin BHI direccin
(V,C,N,Z)
BLT direccin
ADD OP1,OP2
BCS direccin
CMP OP1, OP2
BVS direccin
TEST OP1
Transferencia de control
Ya sabemos que el flujo natural de ejecucin de las instrucciones es el orden lineal: se ejecuta la instruccin de la
siguiente direccin de memoria. No obstante, los programas tienen que modificar esa secuencialidad dependiendo de
ciertas situaciones o de los datos de entrada. Tambin se hace necesaria la ruptura del flujo secuencial de control
cuando se realizan llamadas a procedimientos, que si bien mantienen una secuencialidad lgica, requieren un salto a
una instruccin distinta de la siguiente en secuencia.
Por esto se hace necesaria la presencia de instrucciones que permiten variar el flujo de control, lo cual se realiza con
instrucciones de salto o bifurcacin.
Hay instrucciones de salto incondicional, que simplemente tienen un cdigo de operacin y un operando que indica la
direccin de la siguiente instruccin a ejecutar. Pero en muchas ocasiones, los saltos se realizan solamente si se da
una determinada circunstancia, es decir, necesitamos saltos condicionales.
Los saltos condicionales se realizan en funcin de los bits o flags de estado del registro de estado. Estos bits los
establecen muchas operaciones de transferencia de datos, lgicas y aritmticas. Adems se dispone tambin de
operaciones de comparacin, que toman dos operandos y establecen los bits de estado dependiendo de la
comparacin de los dos operandos. Tambin hay instrucciones de prueba o test, que establecen los flags de estado
considerando solamente el valor de un nico operando (positivo, negativo, cero).
Algunos de los flags ms comunes que suele tener el registro de estado son los que indican: overflow, acarreo, cero,
negativo.
Como resumen, decir que los saltos condicionales estn formados por pares de instrucciones, una que establece el
estado, y otra que establece la condicin y el salto; si el estado cumple la condicin, se produce el salto. Las
instrucciones ms habituales para establecer el estado son las aritmticas, las de comparacin y las de prueba o test.
Hay otros mecanismos para romper el flujo secuencial de ejecucin, como son las corrutinas, las interrupciones y las
excepciones (o interrupciones software). De stas, en esta asignatura vamos a tratar solamente las interrupciones,
pero lo haremos en el captulo dedicado a los Sistemas de Entrada/Salida
Dir. Instruccin
$5000 MOVE #$0100,R2 R2 Apunta a la 1 dir.
$5004 SUB #5,(R2) Resta 5 a la pos. de memoria
. . . ADD #1,R2 Incrementa puntero
. . . CMP #0201,R2 R2 en la ltima direccin?
. . . BNE $5004 Si no era la ltima, repite
RE
TU 4100 Call P1 4600 Call P2
RN 4101 4601
Return
LL
4650 Call P2
CA
4651
Return
URN
T
RE
4601 4651
Retorno 4101 4101 4101 4101 4101
al p.p.
Los procedimientos se utilizan asiduamente en los lenguajes de alto nivel, por lo que el lenguaje mquina debe
proporcionar un soporte para que se ejecuten eficazmente. As, veremos aqu el mecanismo que generalmente se
utiliza para realizar las llamadas a procedimientos con el nivel que ofrece el lenguaje mquina.
Sabemos que un procedimiento o subrutina es un grupo de instrucciones que realizan alguna tarea y que puede ser
llamado desde diversos puntos de un programa. A diferencia de los saltos, estas llamadas tienen la particularidad de
que una vez terminado el trabajo del procedimiento, se devuelve el control a la siguiente instruccin del punto de
llamada. Por esto, una de las primeras cosas que hay que hacer en una llamada a procedimiento es guardar la
direccin de retorno en alguna parte. Veamos algunas posibilidades.
En un registro. Cuando se llama a un procedimiento se guarda siempre la direccin de retorno en un registro
preestablecido, as cuando finaliza el procedimiento simplemente hay que tomar la direccin de retorno de ese registro.
La pega que tiene es que si desde un programa principal se llama a un procedimiento P_1, y ste llama a su vez al
procedimiento P_2, al realizar la segunda llamada se machaca la direccin de retorno de la primera llamada.
Este problema se produce porque se utiliza el mismo lugar para guardar la direccin de retorno de todos los
procedimientos. Por esto, una mejora podra consistir en guardar la direccin de retorno en una posicin de memoria
al comienzo de cada procedimiento, de tal manera que si el programa principal llama al procedimiento P_1, se
guarda la direccin de retorno en una zona de datos al comienzo del procedimiento P_1, y cuando ste llama al
procedimiento P_2, esta direccin de retorno se guarda en la zona correspondiente del procedimiento P_2, con lo que
no se machaca la primera direccin de retorno. El problema est en que no permite los procedimientos recursivos ni
los reentrantes. (Un procedimiento es reentrante si en un momento dado puede tener activas varias instancias por
haber sido llamado desde distintos procedimientos de distintos procesos).
El mejor lugar para guardar la direccin de vuelta es la Pila. Cuando se llama a un procedimiento se mete la direccin
de retorno en la cima de la pila. (Tngase en cuenta que cada proceso tiene su propia pila de trabajo). As, si un
procedimiento se llama recursivamente, se van guardando sus direcciones de vuelta en la pila, que simplemente va
creciendo a medida que se producen las llamadas, y empezar a decrecer segn se vaya llegando al final de cada
instanciacin.
Por esto, todos los procesadores de propsito general disponen de instrucciones de llamada a procedimiento (CALL)
que tienen un nico parmetro, la direccin del procedimiento llamado, que automticamente salva el CP en la pila
antes de saltar al procedimiento llamado. Obviamente, tambin disponen de una instruccin de fin de procedimiento
(RETURN) que saca el valor de la cima de la pila y lo pone en el CP (Contador de Programa).
Direcciones
x x (PP+2)
...
y (PP+1)
...
FFFF Pila
Arquitectura de Computadores Lenguaje Mquina - 26
Una vez que sabemos guardar la direccin de retorno, debemos ocuparnos del paso de parmetros.
Podramos pensar en poner los parmetros en una direccin fija de memoria o en registros, pero nos
encontraramos con los mismos problemas que para salvar la direccin de retorno. Por esto, los parmetros
tambin se van a poner en la pila.
Supongamos un programa que en un punto determinado realiza la siguiente llamada al procedimiento P1:
CALL P_1 (x, y).
Esta es la secuencia de acciones que deben llevarse a cabo para realizar la llamada a un procedimiento:
1. Meter en la pila el parmetro x.
2. Meter en la pila el parmetro y.
3. Meter en la pila el valor del CP.
4. Saltar a la direccin del procedimiento P1.
Una vez que toma control el procedimiento llamado, tiene en la cima de la pila la direccin de retorno,
inmediatamente debajo el parmetro y y, por ltimo, el parmetro x. Sabiendo esto, se puede acceder a los
parmetros mediante un direccionamiento relativo al PP (Puntero de Pila): PP+1, PP+2, ...
Cuando en el procedimiento llamado se alcance la instruccin RETURN, su ejecucin provocar el sacar de
la pila la direccin de retorno y ponerla en el CP, con lo que se devolver el control al procedimiento
llamante. En ste, se deber restaurar el estado de la pila a la misma situacin que tena antes de la
llamada al procedimiento, es decir, habr que sacar de la pila los dos parmetros que se encuentran
situados en las dos posiciones ms altas de la pila. Una vez que se haya dejado la pila en su situacin
original se contina con la ejecucin de la siguiente instruccin a la de la llamada al procedimiento.
Esto funciona aparentemente, aunque, como veremos ms adelante, hay situaciones en las que este
mecanismo no es vlido y necesita algn arreglo.
0000
b PP
a x (PP+4)
Dir. Ret.
y (PP+3)
y
x a (PP+1)
... b (PP)
...
FFFF
Direcciones Pila
El ltimo aspecto que nos queda por ver de la llamada a procedimientos es la asignacin de
espacio para las variables locales.
Las variables globales de un programa pueden guardarse o ubicarse en alguna zona fija de
memoria, sin embargo, no puede hacerse lo mismo con las variables locales de un procedimiento,
pues como ya hemos visto antes, se machacaran estos valores en procedimientos reentrantes o
recursivos. Por lo tanto, las variables locales de un procedimiento deben guardarse tambin en la
pila.
Hasta ahora hemos visto que la llamada a un procedimiento deja en la pila los parmetros y la
direccin de retorno antes de ceder el control al procedimiento llamado. Ahora, una vez que toma
control el procedimiento debe ocuparse de asignar espacio para sus variables locales. Si cada
variable necesita una palabra de memoria, lo que se puede hacer es dejar tantos huecos en la pila
como variables haya, haciendo corresponder cada hueco a una variable.
En este momento, despus de haber reservado espacio para las variables locales, el escenario de
la pila ser el siguiente: el PP estar apuntando a la ltima de las variables locales, seguida del
resto de las variables locales, en orden inverso al de su declaracin. En nuestro ejemplo, el PP
estar apuntando a la variable b y PP+1 estar apuntando a la variable a; PP+2 apuntar a la
direccin de retorno, mientras que PP+3 apuntar al parmetro y y PP+4 al parmetro x.
El conjunto de valores constituido por los parmetros, la direccin de retorno y las variables locales
se denomina trama de pila.
y*y PP
x*x
0000
b x (BL+2)
a y (BL+1)
Dir. Ret. BL
y
a (BL-1)
x b (BL-2)
...
...
FFFF
Direcciones Pila
Acabamos de ver el mecanismo para referenciar las variables locales de cada rutina. No obstante,
todava se pueden presentar problemas. Por ejemplo, supongamos una llamada al procedimiento
de la transparencia, en el que se debe calcular la siguiente expresin
b:=(x * x)-(y * y)
Es comn que la evaluacin de esta expresin se realice por partes, de tal manera que primero se
calcula el valor de x2 y se guarda en la pila, a continuacin se calcula el valor de y2 y tambin se
guarda en la pila. Por ltimo se toman los dos valores de la cima de la pila y se restan.
Pues bien, cuando se ha metido en la pila el valor de x2 y vamos a acceder al parmetro y resulta
que ya no est en PP+3! Esto es porque la pila ha crecido, la cima de la pila se ha desplazado y
por lo tanto el registro PP ha variado su valor.
Para evitar este problema lo que se necesita es un registro que est continuamente apuntando a la
trama de la pila en curso (puede haber otras tramas debajo si hay llamadas anidadas). A este
registro lo vamos a llamar BL (Base Local). As, lo primero que debe hacer el procedimiento
llamado es poner el BL con el valor de PP actual y despus reservar el espacio para sus variables
locales. As, posteriormente podr direccionar los parmetros y las variables locales mediante
direccionamiento relativo al BL (BL-1, BL-2, ...), con lo que ya no importa que el PP vare su
valor debido a variables temporales.
Todava nos queda un problema por resolver. Supongamos que desde un procedimiento P1 se llama a un
procedimiento P2, y que ste llama a su vez al procedimiento P3. Mientras se est ejecutando P2, el registro BL est
apuntando a la trama de pila de P2, pero cuando ste llama a P3 el BL se actualiza con la direccin de la trama de pila
de P3, machacando y perdiendo! la direccin de la trama de pila de P2. Es decir, cuando se llama a un procedimiento
se pierde la direccin de la trama de pila del procedimiento llamante.
La forma de solucionar esto es muy simple, consiste en guardar en cada trama de pila la direccin de la trama de pila
del proceso llamante antes de actualizar el BL con la direccin de la nueva trama de pila.
Veamos cual sera el orden completo de las acciones de una llamada:
Secuencia de llamada (en el procedimiento llamante):
1. Meter los parmetros en la pila.
2. Meter en la pila la direccin de retorno.
3. Ceder el control al procedimiento llamado.
Prlogo del procedimiento llamado:
4. Guardar en la pila el valor del registro BL.
5. Copiar el registro PP al registro BL.
6. Asignar espacio en la pila para las variables locales (moviendo el PP).
Los procesadores suelen ofrecer instrucciones para ejecutar fcilmente el prlogo y el eplogo de los procedimientos
(Intel: ENTER y LEAVE; Motorola: LINK y UNLK). Las mquinas RISC como PowerPC no disponen de este tipo de
instrucciones.
La instruccin ENTER del Pentium consume 11 ciclos de reloj para su ejecucin, aunque si el prlogo se realiza a base
de instrucciones elementales requiere solamente 1,5 ciclos !
Y la Entrada/Salida ?
Cmo se leen y escriben
los datos?