Académique Documents
Professionnel Documents
Culture Documents
Cap. 4: Repertorio de
instrucciones. Direccionamiento y
formatos.
Jos Daniel Muoz Fras
Universidad Pontificia Comillas. ETSI ICAI.
Departamento de Electrnica y Automtica
ICAIdea
ndice
1.
Introduccin.
2.
Direccionamiento inmediato.
3.
4.
b)
c)
d)
5.
6.
Direccionamiento indirecto.
ICAIdea
Introduccin
Modo de direccionamiento = procedimiento para
determinar:
Un operando.
La direccin de un operando.
La direccin de una instruccin.
ICAIdea
Introduccin
Inmediato.
Directo:
Absoluto:
De registro.
De memoria.
De pgina base.
Relativo:
A un registro.
A un reg. ndice
A pila.
Al contador de programa.
Indirecto.
Implcito.
ICAIdea
Aunque cada modo de direccionamiento se expondrn en detalle a lo largo del captulo, podemos introducir aqu su significado de forma somera:
Inmediato: El operando se incluye en la propia instruccin. En el MIPS, este modo de
direccionamiento se usa para el segundo operando de las instrucciones addi, ori, etc.
Directo: Se indica en la instruccin la direccin del objeto. Por ejemplo el MIPS utiliza el
modo relativo a un registro para las instrucciones de carga y almacenamiento.
Indirecto: Se indica una direccin en la que se encuentra la direccin del objeto. Este
modo es til para el manejo de punteros. No obstante algunas arquitecturas como el MIPS
no lo incluyen.
Implcito: El objeto est siempre en un lugar predeterminado que depende de la instruccin.
Por ejemplo en el MIPS la instruccin mult no necesita un registro destino, pues siempre
deja su resultado en los registros hi y lo.
Ejercicio
En un programa MIPS es necesario cargar el dato cuya direccin est almacenada en la posicin 0x10007000. Si el registro gp contiene el valor 0x10008000, escriba la secuencia de instrucciones MIPS para cargar dicho dato en el registro s0.
Introduccin
Las motivaciones para usar los modos de
direccionamiento son:
Ahorro de espacio.
Cdigo reubicable y reentrante.
Manejo de estructuras de datos.
ICAIdea
En principio puede parecer ms conveniente especificar en la instruccin el objeto o su direccin. Sin embargo esto no es lo ms indicado, ya que los distintos modos de direccionamiento
permiten:
Ahorro de espacio. Interesa que las instrucciones sean lo ms cortas posibles para ahorrar
tiempo al leerlas y espacio en memoria para almacenar los programas. Por ejemplo, en las
operaciones aritmticas del MIPS han de especificarse dos operandos y un resultado. Si se
especificase la direccin de memoria de cada uno de estos objetos seran necesarias 3
palabras de 32 bits, que sumados al cdigo de operacin (p. ej. 6 bits) haran un total de
102 bits.
Cdigo reubicable y reentrante. Un cdigo reubicable es aquel que puede ejecutarse sin
cambios en cualquier zona de la memoria. Para ello es necesario disponer de
direccionamientos relativos. Un cdigo reentrante es aquel que puede ser llamado desde
varios lugares a la vez o ser llamado varias veces antes de terminar su ejecucin. Ejemplos
cercanos son las rutinas recursivas o las rutinas de libreras en entornos multiproceso. En
estos casos son necesarios direccionamientos de pila.
Manejo de estructuras de datos. Las tablas, matrices y estructuras de datos en lenguajes de
alto nivel se manejan ms eficientemente usando modos de direccionamiento relativos.
Direccionamiento inmediato
En el direccionamiento inmediato el objeto (un
operando en este caso) est almacenado dentro de
la propia instruccin.
Por ejemplo, en el MIPS las instrucciones tipo I tienen
un operando inmediato de 16 bits:
Tipo I
ICAIdea
16 bits
Inmediato
ICAIdea
ICAIdea
menos
ICAIdea
ICAIdea
Tipo I
16 bits
Despl=4
0x74
0x70
31
ICAIdea
las instrucciones de carga y almacenamiento del MIPS: lw, sw, lh, sh, lb y sb utilizan este
modo de direccionamiento. Como se ha dicho antes, el desplazamiento es de 16 bits y se suma con
signo al registro base, que puede ser cualquiera de los 32 registros disponibles.
Ntese que las instrucciones lw y sw accedern a los 32 bits que hay a partir de la direccin
calculada, lh y sh a los 16 bits y, por ltimo, lb y sb acceder al byte que hay en la direccin
calculada.
Si se usa el registro zero como registro base se dispone de un direccionamiento absoluto a
pgina base. Cuando el desplazamiento sea positivo se acceder a los primeros 32 kb de la memoria
y cuando sea negativo a los ltimos 32 kb de la memoria.
De la misma forma, existe una convencin en el MIPS para el manejo de la memoria. Segn
esta convencin, se reserva un bloque de 64 kb para almacenar los datos 1 de los programas. Dicho
bloque est situado a partir de la posicin 0x10000000. Para permitir un acceso fcil a esta zona
de memoria, se sita el valor 0x10008000 en el registro gp (del ingles global pointer), de forma
que se pueda acceder a todo el bloque mediante el desplazamiento adecuado tomando como base
el registro gp.
1 En
esta zona se almacenan solamente las variables globales y las locales estticas (las precedidas por la palabra clave static en C). Las variables locales se almacenan en la pila.
ICAIdea
El modo de direccionamiento relativo a registro ndice es una variacin del anterior: En lugar
de almacenar la direccin de referencia en un registro y usar un desplazamiento pequeo para
acceder a los datos, ahora se usa como direccin de referencia un campo de la instruccin y como
desplazamiento un registro. El principal inconveniente de este modo de direccionamiento es que
si se desea que la direccin de referencia abarque todo el mapa de direcciones, ha de tener un
elevado nmero de bits. Algunas arquitecturas como el PowerPC solucionan este problema usando
un registro para la direccin de referencia (registro base) y otro para el ndice. El Pentium va un
poco ms all permitiendo un registro base, un registro ndice y adems un desplazamiento de 8,
16 o 32 bits.
El principal uso de este modo de direccionamiento es el acceso a vectores de datos. Por ello
muchas arquitecturas permiten un escalado del registro ndice, de forma que se puedan manejar
vectores de datos de 16 o 32 bits automticamente. Por ejemplo el Pentium dispone de este modo
de direccionamiento con escalados de 1, 2 o 4 para acceder a vectores de bytes, palabras y dobles
palabras (8, 16 y 32 bits en nomenclatura Pentium). As, cuando se accede a un vector de dobles
palabras, el ndice se multiplica por 4, de forma que al acceder a la doble palabra i se direcciona
la posicin de memoria despl+4*i.
Otras arquitecturas permiten incrementar o decrementar automticamente el registro ndice
para recorrer automticamente un vector de forma secuencial, tal como se muestra en la siguiente
transparencia.
I+1 ; (ref+I)
Pre-autodecremento. vec[--i]. I
I-1 ; (ref+I)
I+1
I-1
ICAIdea
Algunas arquitecturas como el 68000 o el PowerPC permiten incrementar o decrementar automticamente el registro ndice. Existen cuatro posibilidades, aunque no todas las arquitecturas
incluyen las cuatro:
Pre-autoincremento. Es equivalente a la sentencia de C vec[++i]: En primer lugar se
incrementa el ndice para a continuacin calcular la direccin. Expresado en notacin de
transferencia de registros, siendo I el registro ndice y ref la direccin de referencia,
que coincidir con la direccin del primer elemento del vector vec: I I+1 ; (ref+I)
Estos modos de direccionamiento facilitan el recorrido secuencial de un vector, ya que automticamente incrementan o decrementan el ndice de ste. Ahora bien, el incremento ha de
adaptarse al tamao de los datos del vector. Por ello, las arquitecturas que soportan este modo
suelen permitir incrementar el ndice en 1, 2 o 4 segn se est trabajando con vectores de 8, 16 o
32 bits.
Ejercicio
Escriba una serie de instrucciones MIPS para realizar un direccionamiento indexado con postautoincremento en un vector de enteros de 32 bits. Como direccin base se usar s0 y como registro
ndice se usar t0. Utilice estas instrucciones para poner a cero un vector de 100 elementos cuya
direccin inicial est almacenada en s0.
ICAIdea
PC
ICAIdea
Tipo I
16 bits
Despl=2
x4
0x78
PC
ICAIdea
0x70
Tipo J
6 bits
op
26 bits
0x1E
x4
4 bits
PC 0
ICAIdea
0x78
Ejercicios
1.
2.
En la instruccin de ensamblador beq $s0, $s1, L1, la etiqueta L1 pertenece a una instruccin situada 200.000 bytes por encima de ella. Escriba una secuencia de instrucciones
MIPS que permitan realizar dicho salto condicional.
Ejemplo
Inmediato
op
rs
st
rd
sh
fu
18
0x8004
17
32
0x8008
lw $t0, 0($t1)
35
0x800C
20
0x8010
18
18
0x8014
j B
ICAIdea
19
32
32
0x2000
0
Ejercicio
Es el cdigo anterior reubicable? Por qu? En caso negativo, modifique el programa anterior
para que sea reubicable, incluyendo la codificacin en cdigo mquina. Para esta ltima parte puede
usar el apndice A de (Patterson y Hennessy, 2000).
Direccionamiento indirecto
Mediante uno de los modos de direccionamiento
anteriores se obtiene la direccin del objeto.
Los modos usados son los absolutos y los indirectos a
registro base e ndice.
Se necesita otro acceso a memoria para leer el objeto.
Aunque es til para manejo de punteros, muchas
arquitecturas (p. ej. MIPS) no lo incluyen.
ICAIdea
rs=2
0
1
2
rt
0x27
0x74
0x74
31
ICAIdea
Ejercicio
Si el registro s0 contiene un puntero a un entero que se desea cargar en el registro t0, escriba
una instruccin MIPS para hacerlo.
0x27
Objeto
ICAIdea
0x74
0x27
Ejercicio
Se desea cargar en t0 un entero cuya direccin est almacenada en la posicin de memoria
0x1000. Escriba una secuencia de instrucciones MIPS para hacerlo. En qu zonas de memoria
han de residir los punteros para poder usar este modo de direccionamiento en el MIPS?
16 bits
Despl=4
0x27
0x74
0x70
0x27
31
ICAIdea
ICAIdea
ICAIdea
En la pgina 12 se expuso brevemente el direccionamiento directo a registro base con desplazamiento e indexado como una combinacin del direccionamiento a registro base con el direccionamiento indexado. Este direccionamiento, disponible en el Pentium, calcula la direccin del
objeto como (Rb)+(despl)+(Ri), es decir, la direccin a la que se accede es la suma del contenido
del registro ndice ms el desplazamiento almacenado en el campo despl de la instruccin ms el
contenido del registro Ri.
En el direccionamiento indirecto relativo a registro base con desplazamiento e indexado, se
accede a la direccin (Rb)+(despl) para obtener un puntero al que se le suma el contenido del
registro Ri para obtener la direccin final del objeto. En notacin de transferencia de registros, la
direccin del objeto se obtiene como: ((Rb)+(despl))+(Ri).
La utilidad de este modo de direccionamiento es la de poder acceder a los elementos de un
vector a partir de una tabla de punteros a una serie de vectores, lo cual no es muy comn en la
prctica. Al igual que el direccionamiento indirecto con post-indexado, este modo de acceder a los
elementos de un vector no es muy eficiente Por qu?
CD
F2 CO LI MD RT1 RT2
CD
CO Cdigo de operacin.
LI Longitud de instruccin.
MD Modo de direccionamiento.
CD Campo de datos.
RTx Identificacin de registro.
ICAIdea
Fx
CD
DF
C+E
Comentario
Inmediato
F1
Dato 8b
1+0
F2
Dato 16b
2+0
F1
Dir(dato)
(CD)
1+1
F2
Dir(dato)
(CD)
2+1
Indirecto
F1
Dir(Dir(dato))
((CD))
1+2
Punteros en mem.
Directo Reg.
F1
Id. Reg.
RT
1+0
Indir. Reg.
F1
Id. Reg.
(RT)
1+1
Punt. en reg.
Directo
ICAIdea
Ejercicio
Dnde han de residir los punteros para poder utilizar el direccionamiento indirecto? Cuntos
accesos a memoria seran necesarios en un modo de direccionamiento indirecto si queremos que el
puntero utilizado pueda estar en cualquier parte de la memoria?
Fx
CD
DF
Relativo CP
F1
Despl.
(CP)+(CD)
1+1
Saltos cercanos
Relativo Ind.
F1
Ref.
(CD)+(Rin)
1+1
Vectores
F2
Ref.
(CD)+(Rin)
2+1
F1
Despl.
(Rb)+(CD)
1+1
F2
Despl.
(Rb)+(CD)
2+1
Relativo base
ICAIdea
C+E Comentario
Estructuras datos
El modo de direccionamiento relativo al contador de programa usa el formato F1, con lo que
slo se permiten saltos cortos (del tamao del CD). El nmero de accesos es uno de captacin ms
otro para captar el objeto, que en este modo de direccionamiento ser una instruccin. 1
El modo de direccionamiento relativo a registro ndice dispone de dos formatos: F1 cuando
la direccin de referencia est en pgina base y F2 cuando dicha direccin de referencia est en
cualquier parte de la memoria. En el primer caso se necesita un ciclo para captar la instruccin
y otro para acceder al dato, mientras que en el segundo se necesitan dos ciclos para captar la
instruccin.
El modo de direccionamiento relativo a registro base dispone tambin de dos formatos posibles, en funcin de la longitud necesaria para el desplazamiento.
1 Aunque
este modo de direccionamiento se utiliza siempre para saltos, nada impide en teora
usarlo para acceder a los datos del programa. No obstante, en la mayora de las aplicaciones los
datos y los programas se sitan en segmentos de memoria separados para una mayor facilidad
de programacin. Por ejemplo en el MIPS los programas de usuario se sitan desde 0x400000 a
0x0FFFFFF y los datos desde 0x1000000 a 0x7FFFFFFF.
Fx
CD
DF
C+E Comentario
Ind. postindex
F1
Dir(vec)
((CD))+(Rin)
1+2
Punt a vector
Ind. preindex
F1
Dir(vec)
((CD)+(Rin))
1+2
Vec de punt.
F1
Despl.
((Rb)+(CD))
1+2
Vec de punt.
Ind. Base+Indx
F2
Dir.
((Rb)+(CD))+(Rin)
2+2
Vec de vec
de punt.
ICAIdea
Regularidad y ortogonalidad
Regularidad: Inexistencia de casos particulares.
Es ms fcil de programar en ensamblador.
El diseo del compilador es mas sencillo.
Ortogonalidad: Se puede usar cualquier modo de
direccionamiento para cada uno de los operandos y el
resultado.
ICAIdea
ICAIdea
Use
EAX
GPR 0
ECX
GPR 1
EDX
GPR 2
EBX
GPR 3
ESP
EBP
ESI
EDI
EIP
EFLAGS
ICAIdea
31
CS
SS
DS
ES
FS
GS
En la figura se muestran los registros disponibles en el Pentium para operaciones con enteros.
Los 8 primeros EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI son considerados de propsito
general, aunque algunos de ellos tienen adems otras tareas especficas. Por ejemplo el ESP es
el puntero de pila y el EBP puede ser usado como puntero al bloque de activacin. Los registros
ESI y EDI se usan en las instrucciones de transferencia de cadenas de caracteres para apuntar
respectivamente al origen y destino de los caracteres transferidos.
Los 6 registros de 16 bits CS, SS, DS, ES, FS, GS son los punteros de segmentos en el
modo real o los descriptores de segmento en modo protegido. Aunque en modo real (MS-DOS) el
programador tena que acceder a estos registros para el manejo de la memoria, en modo protegido
son slo usados por el sistema operativo. En cualquier caso, no estn disponibles para usarlos en
las aplicaciones.
Por ltimo el registro EIP es el contador de programa y el registro EFLAGS contiene los bits
de estado (banderas) del procesador. Estos bits se activan automticamente al ejecutarse ciertas
instrucciones. Por ejemplo existe un bit denominado Z que se activa cada vez que el resultado de
una operacin es cero.
Como puede observar, el banco de registros del Pentium, si se compara con el del MIPS,
es bastante ms limitado. Existen slo 8 registros de propsito general en lugar de los 31 del
MIPS, pero adems 4 de ellos tienen funciones muy especficas, lo que hace que sea an ms
difcil mantener un gran nmero de variables dentro de estos registros durante la ejecucin de
los programas. Lamentablemente, la necesidad de mantener la compatibilidad con el 8086 hace
imposible introducir nuevos registros para mejorar las prestaciones. Lo nico que se ha podido
hacer ha sido aumentar su tamao de 16 a 32 bits, pero nada ms.
ICAIdea
Fuente1/Destino
fuente2
Registro
Registro
Registro
Inmediato
Registro
Memoria
Memoria
Registro
Memoria
Inmediato
Las instrucciones aritmticas y lgicas del Pentium admiten dos argumentos, de los cuales el
primero hace las veces de fuente y de destino, es decir, el resultado de la operacin se sobreescribe
en el primer argumento. Esto hace an ms difcil mantener las variables de los programas en los
registros internos de la CPU, ya que uno de los argumentos se destruye en la operacin, por lo que
si lo volvemos a necesitar despus hay que volver a cargarlo de memoria (o guardarlo en la pila y
recuperarlo despus si es un resultado intermedio que no est an almacenado en la memoria).
Una clara ventaja del Pentium con respecto al MIPS (y en general con respecto a todos los
RISC) es la de poder especificar como uno de los operandos una palabra situada en memoria,
usando cualquiera de los modos de direccionamiento descritos a continuacin. Esta caracterstica
facilita la programacin, pero dificulta la implementacin del procesador.
ICAIdea
Un ejemplo de instruccin que no soporta todos los modos de direccionamiento es la instruccin out que sirve para enviar un dato a un puerto de entrada/salida. Dicha instruccin necesita
que la direccin del puerto est en el registro DX.
Tampoco algunos registros pueden usarse con otros modos de direccionamiento a memoria.
Por ejemplo, para copiar un dato al registro ES no puede hacerse mediante un direccionamiento
inmediato con la instruccin:
mov es, 023h ; Ilegal
pues este tipo de instruccin slo soporta el modo registro, registro. Por tanto para almacenar
un valor en el registro es primero hay que colocar dicho valor en un registro de propsito general
(por ejemplo ax) y luego copiar dicho registro al es, tal como se muestra a continuacin:
mov
mov
ax, 023h
es, ax
Obviamente estas excepciones dificultan la labor de los programadores que han de recordar
un gran nmero de excepciones y casos particulares.
ICAIdea
Siguiendo la filosofa de los procesadores RISC, el Pentium soporta un gran nmero de modos
de direccionamiento.
En primer lugar los valores inmediatos pueden ser de hasta 32 bits, lo cual contrasta con el
MIPS, en el cual slo pueden ser de 16 bits.
En segundo lugar se puede especificar la direccin absoluta de memoria de 32 bits dentro de
una instruccin, lo cual permite usar fcilmente cualquier posicin de la memoria.
Al igual que el MIPS es posible acceder a una posicin de memoria cuya direccin est almacenada en un registro de propsito general. No obstante dicho registro no puede ser ni ESP ni
EBP.
Tambin dispone de un modo de direccionamiento relativo a registro base, pudendose usar
desplazamientos de 8 bits o de 32 bits, lo que permite nuevamente acceder a toda la memoria.
El modo relativo a registro base escalado en indexado (SIB en la terminologa Intel) es bastante
potente, permitiendo acceder a cualquier elemento de un vector en una sola operacin. En este
modo se especifica un registro base, al que se le suma un ndice multiplicado por un factor de
escala que puede ser 1, 2, 4 u 8 para permitir usar vectores con elementos de 1, 2, 4 u 8 bytes.
Al resultado se le puede sumar un desplazamiento adicional de 8 o 32 bits. Por ejemplo, si el
comienzo del bloque de activacin est almacenado en el registro ebp y de desea almacenar un 4
en el elemento 3 de un vector de enteros que comienza en la posicin 7 del bloque de activacin,
se puede hacer:
mov eax, 3
mov [dword ebp+4*eax+7], dword 4
El direccionamiento a pila est soportado mediante las instrucciones push y pop.
Por ltimo, el direccionamiento relativo al CP admite desplazamientos de 8 o de 32 bits.
Bytes
04
13
01
01
04
04
PREFIX
OPCODE
MODE
SIB
DISPLACEMENT
IMMEDIATE
Bits
Bits
ICAIdea
SCALE
INDEX
MOD
REC
R/M
BASE
Referencias
de Miguel Anasagasti, P. (2000). Fundamentos de los computadores. Paraninfo-Thomson learning.
Intel (2003). IA-32 Intel R Architecture Software Developers Manual. Volume 2: Instruction Set
Reference. Intel corporation. Disponible on-line en:
http://developer.intel.com/design/pentium4/manuals/245471.htm.
Patterson, D. A. y Hennessy, J. L. (2000). Estructura y diseo de computadores. Interficie circuitera/programacin. Revert.
1 El