Tema 2: Arquitectura del repertorio de instrucciones Visión del

Anuncio
Tema 2: Arquitectura del repertorio de instrucciones
Visión del computador que tiene el programador en bajo nivel
Lo que el programador en lenguaje ensamblador debe conocer para
escribir programas:
- Los registros del procesador
- Tipos de instrucciones
- Tipos de operandos
- Modos de direccionamiento
- Formato de las instrucciones
1
2. Arquitectura del repertorio de instrucciones (ISA)
2.1 Introducción (diseño del ISA; cómo es una instrucción)
2.2 Los registros (del procesador)
2.2 Tipos de instrucciones (qué operaciones)
2.3 Tipos de operandos
2.4 Modos de direccionamiento (especificación de los operandos)
2.5 Formato de las instrucciones (codificación binaria)
2.6 Resumen de la ISA de la MIPS
2
2.1 Introducción
Diseño del ISA
Es un nivel complicado de diseñar
Al hacerlo, hay que tener en cuenta:
el software (compilador de LANs) que tiene que soportar
la estructura del hardware que lo soportará
Es la conexión entre ambos niveles: lenguaje que ambos tienen que
entender
3
Es un punto de encuentro de el diseñador de la estructura y
el programador a bajo nivel del computador (o el escritor del
compilador):
- el diseñador de la estructura ve el nivel ISA como la
funcionalidad que ésta debe dar al programador
- el programador se hace consciente de la estructura definida por el
diseñador: cómo usa los registros, qué operaciones tiene la ALU,
cómo accede a memoria y qué tipos de datos tiene
Objetivo común de los diseñadores de computadores:
– encontrar un lenguaje que haga fácil la construcción del
hardware y del software (el compilador)
– maximizar el rendimiento y minimizar el coste
4
Cómo es una instrucción
Los programas en este nivel se expresan en lenguaje ensamblador
swap:muli $2, $5,4
add $2, $4,$2
lw $16, 4($2)
sw $16, 0($2)
jr $31
El lenguaje ensamblador es ‘equivalente’ al lenguaje máquina
00000000101000010000000000011000
00000000100011100001100000100001
10001100011000100000000000000000
10101100011000100000000000000100
00000011111000000000000000001000
5
El lenguaje máquina, lo interpreta y ejecuta directamente el hardware
del computador
Formado por instrucciones (máquina) simples
Instrucción máquina = especifica una operación que debe realizar el
procesador
6
Una instrucción especifica tanto la operación a realizar como los
operandos a utilizar en esta operación
(1) Las operaciones son básicas (las que realiza la estructura del
computador):
- aritmético-lógicas (de la ALU): suma, resta, AND, OR,
desplazamientos
- movimientos de datos entre registros y memoria
(2) Los operandos: objetos con los que se opera (fuentes) y el
resultado de la operación (destino); estarán en registro o memoria
7
Sintaxis típica de una instrucción en lenguaje ensamblador
Ejemplo: Lenguaje ensamblador del procesador MIPS R2000/3000
4 campos básicos: etiqueta, nemónico de la instrucción, operandos (2
fuentes y 1 destino) y comentarios (opcional)
8
Fíjate que el número de operandos fuente de una instrucción
aritmética como la suma son dos
Esto permite tener una ALU más sencilla
Para evaluar expresiones aritméticas que aparecen en los lenguajes
de alto nivel (LAN) habrá que ejecutar varias instrucciones aritméticas
de bajo nivel
Ejemplo: la sentencia de alto nivel a=b+c+d+e se implementa con la
secuencia de instrucciones de bajo nivel:
add a, b, c
add a, a, d
add a, a, e
Esto es un ejemplo de la diferencia de nivel de abstracción de un LAN
y un lenguaje ensamblador ó máquina (1 instrucción de alto nivel
equivale a 3 de bajo)
9
2.2 Los registros
Pequeña memoria rápida en el procesador para almacenamiento
temporal de información
Su número y función varían entre los distintos diseños de
arquitecturas del repertorio de instrucciones
Hoy en día, casi todas las arquitecturas son con registros de
propósito general: conjunto de registros manejables por el
programador, para contener operandos y especificar direcciones de
memoria
Este no es el único tipo de arquitectura Æ veamos qué tipos de
arquitectura hay en función de cómo se pueden especificar en una
instrucción los operandos
10
Tipos de arquitecturas del repertorio de instrucciones
Una primera clasificación (histórica) según el tipo de
almacenamiento temporal para los operandos
Esto determina el número de operandos explícitos por instrucción
Almacenamiento Ejemplos
temporal
1. Pila
HP 3000
2. Acumulador
PDP-8
Motorola 6809
3. Conjunto de
IBM 360
registros
DEC
VAX,MIPS
Operandos
explícitos
0
1
Operando
destino en …
Pila
Acumulador
2ó3
Registros o
memoria
11
Dónde están los operandos, en los distintos tipos de arquitectura:
- arquitectura de pila: implícitamente en la cima de la pila (memoria)
- arquitectura de acumulador: implícitamente uno de los fuente y el
destino en el registro acumulador y el otro fuente en memoria
- arquitectura de registros: en registros o posiciones de memoria, 2
ó 3 operandos explícitos
Según el tipo de arquitectura de registros:
i) se podrá hacer operaciones ALU con datos en memoria, ó
ii) habrá que cargarlos en registros para operar con ellos (MIPS)
12
Veamos como se traduciría la secuencia de código C = A + B para
las 3 clases de arquitectura:
(A, B y C son variables: los valores de A, B, C están en memoria y
los valores de A y B no cambian)
Pila
PUSH A
PUSH B
ADD
POP C
Acumulador
LOAD A
ADD B
STORE C
Registro
LOAD R1, A
ADD R1, B
STORE C, R1
13
(1) Pila
Ventajas:
- evaluación sencilla de expresiones (polaca inversa)
- instrucciones cortas: como máximo se especifica un operando
Inconveniente:
- muchas transferencias con memoria
(2) Acumulador
Ventajas:
- minimización de los estados internos de la máquina
- instrucciones cortas: sólo se especifica un operando
Inconveniente:
- muchas (menos que las de pila) transferencias con memoria
14
(3) Registros
Las arquitecturas de registros dominan hoy día
Ventajas:
- Los registros son fáciles de usar por el compilador, pueden ser
asociados con las variables, con lo que se consigue:
• una disminución del tiempo de ejecución: reducción del tráfico
de memoria (los registros son más rápidos)
• una mejor densidad de código: menos bits necesarios
especificar un registro que una dirección de memoria
15
Veamos una clasificación de las arquitecturas de registros
atendiendo a:
(1) el número de operandos (2 ó 3) que se especifican
explícitamente las instrucciones aritmético-lógicas
Si se especifican dos operandos, uno de ellos es fuente y destino
(2) el número de operandos que pueden estar en memoria en las
instrucciones aritmético-lógicas (de 0 a 3)
16
Las posibles combinaciones de estas 2 características son:
Máximo número de
operandos
explícitos por
instrucción ALU (1)
2
3
2
Número de operandos
que pueden estar en
memoria por
instrucción ALU (2)
0
0
1
2
3
2
3
Ejemplos
IBM RT-PC
SPARC, MIPS
PDP-10, Motorola
68000, IBM 360
PDP-11
VAX
17
Los tres tipos más comunes de arquitecturas de registro atendiendo
a estas dos características son:
Tipo
Registro-registro
(3,0)
Cargaalmacenamiento
Registromemoria (2,1)
Memoriamemoria (3,3)
Ventajas
Codificación simple de
instrucciones de
longitud fija
Nºciclos/instrucción
similares
Fácil codificación de
las instrucciones
No hay que cargar los
datos en registros
Inconvenientes
Necesarias más
instrucciones que
arquitecturas con
referencias a memoria
Se destruye un operando
Variación en el tamaño de
las instrucciones
18
Registros del procesador
Son de dos tipos:
(1) visibles al programador en lenguaje ensamblador: puede ser
utilizados explícitamente en una instrucción
(2) de control y de estado: usados por
(a) la unidad de control para controlar el funcionamiento de la CPU:
proceso de instrucciones y accesos a memoria
(b) el SO para controlar la ejecución de los programas
19
(1) Registros manejables por el programador:
Junto con la ALU forman el camino de datos
Se utilizan para contener los operandos de las instrucciones máquina
o para especificar una dirección de memoria
Pueden ser referenciados explícitamente en las instrucciones máquina
Por ejemplo en la MIPS mediante un número:
add $9, $17, $2 ó lw $16, 4($2)
20
Los compiladores pueden usarlos para asociarlos con variables y
disminuir el tráfico con memoria
El ejemplo anterior (a=b+c+d+e)
add a, b, c
add a, a, d
add a, a, e
en realidad se implementa asociando las variables con registros:
a - $8, b - $9, c - $10, d - $11, e - $12,
de forma que el compilador generaría:
add $8, $t9, $10
add $8, $8, $11
add $8, $8, $12
21
Cuestiones de diseño de los registros manejables por el programador:
(a) Respecto al uso que le puede dar el programador:
(1) de propósito general: pueden contener datos y especificar
direcciones (MIPS)
(2) de datos: sólo pueden contener datos
(3) de dirección: sólo para especificar direcciones (modos de
direccionamiento indirecto ó base+desplazamiento)
(b) Número de registros
La experiencia dice que entre 8 – 32
Menos Æ no suficientes para contener variables Æmuchas referencias
a memoria
Más Æ no reduce notablemente las referencias a memoria y aumenta
la longitud de las instrucciones (más número de bits para especificar
los registros)
22
(c) Tamaño de los registros
Habrá que decidir si todos los registros tienen el mismo tamaño
(MIPS) o no
(1) los que han de contener direcciones, lo suficientemente largo
para contener direcciones completas
(2) los que han de contener datos, lo suficientemente largos para
contener la mayoría de los tipos de datos: una palabra
A menudo es posible usar dos registros de datos contiguos
como uno solo para contener valores de doble longitud
(MIPS: los registros para punto flotante doble precisión)
23
(2) Registros de control y estado del funcionamiento de la CPU:
En la mayoría de las máquinas, no manejables por el usuario
Algunos serán manejables por instrucciones ejecutadas en modo
supervisor (control del SO)
(a) Registros de control
(1) Contador de programa: contiene la dirección de la instrucción a
ejecutar
(2) Registro de instrucción: contiene la instrucción a ejecutar
(3) Registro de dirección de memoria: contiene la dirección de una
posición de memoria para ser leída o escrita
(4) Registro de buffer de memoria: contiene la palabra de datos a
escribir en memoria o que ha sido leída
24
En esta figura vemos los registros de control
25
(b) Registro de estado (del programa en ejecución)
Contiene los códigos de condición y otra información de estado
(i) Los códigos de condición (indicadores o ‘flags’) son valores
binarios (bits) que especifican si se ha producido una determinada
circunstancia en una operación ALU
Pueden ser de signo, cero, acarreo, overflow,…
Son utilizados implícitamente en las instrucciones de salto condicional
(ii) Además de los códigos de condición la palabra de estado puede
contener bits para:
(1) habilitación/deshabilitación de interrupciones
(2) modo supervisor/usuario (de funcionamiento de la CPU)
26
Ejemplos de organización de registros: 2 microprocesadores
contemporáneos (1978):Motorola MC68000, Intel 8086
27
Motorola MC68000:
Registros de 32 bits: 8 de datos y 9 de dirección
(1) Los de datos:
También se usan como registros índice (un modo de direccionamiento)
Permiten operaciones con 8,16 y 32 bits según determine el código de
operación (MIPS)
(2) Los de direcciones:
A7 y A7’ punteros de pila para usuarios y para SO respectivamente
(3) Contador de programa de 32 bits y registro de estado de 16
Decisiones de diseño:
(1) repertorio de instrucciones regular sin registros de uso especial
(2) división en dos grupos, ahorro de 1 bit (compromiso razonable
entre generalidad total y código más compacto)
28
Intel 8086
Enfoque diferente en la organización de los registros: cada registro
tiene un uso particular aunque algunos pueden tener uso general
4 registros de datos de 16 bits, direccionables también como bytes
Uso general en algunas instrucciones e implícito en otras, p.e. la
multiplicación usa siempre el acumulador
Registros de segmento uso dedicado e implícito, apuntan a los
segmentos de datos, código y pila (base + desplazamiento)
Los índice implícitos en algunas operaciones: contienen
desplazamientos dentro de cada segmento(base + desplazamiento)
Decisiones de diseño: codificación compacta Æ flexibilidad reducida
29
Intel 80386
Microprocesador de 32 bits, diseñado como una ampliación del 8086
(16 bits)
Conserva la organización de registros original integrada en la nueva
organización Æ proporciona compatibilidad ascendente para los
programas del 8086
Tuvieron que limitar la flexibilidad al diseñar la organización de los
registros
El Pentium tiene la misma organización de registros que el 386
30
Características del banco de registros del MIPS R2000
31
(1) Banco de registros de propósito general:
32 Registros de 32 bits (CPU)
Se identifican como $0 a $31. Ejemplo: add $2, $3, $4 ($2=$3+$4)
El registro $0 tiene permanentemente el valor 0
(2) Dos registros especiales de 32 bits (CPU)
HI y LO: almacenan los resultados de multiplicaciones y divisiones.
(3) Banco de registros de reales (FPU)
32 registros de 32 bits que puede utilizarse como:
- 32 registros de 32 bits con formato IEEE 754 de simple
precisión. Se identifican por $f0, $f2, $f4, …, $f30
- 16 registros de 64 bits con formato IEEE 754 de doble
precisión. Se identifican por $f0, $f2, $f4, …, $f30
32
Convención en el uso de los registros en la MIPS
Nombre
del
registro
zero
at
v0
v1
a0
a1
a2
a3
t0..t7
s0..s7
t8, t9
k0, k1
gp
sp
fp
ra
Número
Uso
0
1
2
3
4
5
6
7
8..15
16..23
24, 25
26, 27
28
29
30
31
Constante 0
Reservada para ensamblador
Para devolver resultados de funciones
“
Argumento 1 a una rutina
Argumento 2
“
Argumento 3
“
Argumento 4
“
Temporal (no se guarda valor entre llamadas)
Temporal (el valor se guarda entre llamadas)
Temporal (no se guarda valor entre llamadas)
Reservado para el kernel del sistema operativo
Puntero al área global (apunta al bloque de datos)
Puntero de pila
Puntero de marco de pila
Dirección de retorno, usado por llamadas a rutina
33
Esta es la visión de los registros de la MIPS que nos da el PCSpim
34
2.2 Tipos de instrucciones
Las instrucciones soportadas por la mayoría de las arquitecturas
pueden clasificarse según la siguiente tabla:
35
(I) Aritméticas y lógicas
Aritméticas
En todas las máquinas
La mayoría suma, resta, multiplicación y división
Tipos de operandos:
- todas con enteros con signo
- algunas con enteros sin signo (MIPS)
- a menudo con punto flotante (MIPS)
- a veces para BCD
Otras operaciones aritméticas posibles:
- valor absoluto
- cambio de signo
- incremento y decremento
36
Lógicas
En todas las máquinas
Operaciones sobre datos lógicos: operaciones lógicas bit a bit
Operaciones lógicas en la MIPS: AND, OR, NOR y XOR
Ejemplo: sean los valores en registros:
R1 = 10100101 y R2 = 00001111
R1 AND R2 = 00000101
Además operaciones de desplazamiento (MIPS) y rotación:
37
38
Examples of ALU Instructions
Instruction
Meaning
MULF A, B, C
multiply the32-bit floating point values at mem loc’ns.
A and B, store at C
VAX11
nabs r3, r1
Store abs value of r1 in r3
Machine
PPC601
ori $2, $1, 255 Store logical OR of reg $1 with 255 into reg $2
MIPSR3000
DEC R2
Decrement the 16-bit value stored in reg R2
DECPDP11
SHL AX, 4
Shift the16-bit value in reg AX left by 4 bit pos’ns.
Intel8086
39
(II) Transferencia de datos
Operación: copiar un dato de un sitio a otro
Existe en todas las máquinas
Debe especificar:
- operandos fuente y destino (en registro o memoria)
- longitud datos a transferir
Opción de diseño: dónde especifico el tamaño del dato:
- en el código de operación (MIPS: lb ó lw)
- en el operando (VAX)
Operación muy sencilla en el caso registro-registro (no en la MIPS)
Si es con memoria, habrá que calcular la dirección del dato y hacer el
acceso a memoria (más lenta que los registros)
40
Examples of Data Movement
Instructions
Instruction Meaning
MOV A, B
Move 16 bits from memory location A to Location B
VAX11
Load accumulator A with the byte at memory location
Addr
M6800
Move 32-bit data from memory location A to register
R3
PPC601
Load the 32-bit integer at memory location addr into
register $3
MIPS R3000
Move 16-bit data from R4 to output port dout
DEC PDP11
Load a byte from in port KBD to accumulator
Intel Pentium
LDA A, Addr
lwz R3, A
lw $3, addr
mov R4, dout
IN AL, KBD
Machine
41
(IV) Control (de flujo de ejecución)
En las instrucciones vistas hasta ahora la instrucción que se ejecutará
a continuación es la siguiente en memoria
Las instrucciones de control cambian esta secuencia de ejecución
(ruptura de secuencia)
Para ello tendrán que especificar que instrucción se ejecutará a
continuación
La operación que realiza la CPU es actualizar el registro contador de
programa (PC) para que contenga la dirección en memoria de la
próxima instrucción a ejecutar
42
Tipos de rupturas de secuencia:
(1) Bifurcaciones (branch): rupturas de secuencias condicionales
La condición puede ser el valor de un bit de estado, la comparación
(con cero) del valor de un registro (MIPS) ó la comparación de los
valores de 2 registros (MIPS)
(2) Saltos (jump): rupturas de secuencia no condicionales
(3) Llamadas y retornos de procedimientos: para ejecutar un
procedimiento y retornar al programa principal
43
(V) Sistema
En todas las máquinas
Llamadas al sistema operativo (MIPS:syscall) para que realice
algún servicio: entrada/salida, detener la ejecución del programa,…
en la MIPS
(VI) Punto flotante
44
Operaciones con reales
En casi todas las máquinas
La MIPS las tiene
(VII) Decimal
Para operar con datos BCD
No las tiene
(VIII) Cadenas
Para copiar o mover cadenas de caracteres
No las tiene
45
Veamos un resumen del repertorio de instrucciones de la MIPS:
MIPS IV Instruction Set
(1) Arithmetic and Logical Instructions
(2) Constant-Manipulating Instructions
(3) Comparison Instructions
(4) Branch Instructions
(5) Jump Instructions
(6) Load Instructions
(7) Store Instructions
(8) Data Movement Instructions
(9) Floating-Point Instructions
(10) Exception and Interrupt Instructions
46
(1) Arithmetic and Logical Instructions
Addition (with overflow)
add rd, rs, rt
Put the sum of registers rs and rt into register rd
Addition immediate (with overflow)
addi rt, rs, imm
Put the sum of register rs and the sign-extended immediate into
register rt
If the addition results in 32-bit 2’s complement arithmetic overflow then
the destination register is not modified and an Integer Overflow
exception occurs
47
AND
and rd, rs, rt
Put the logical AND of registers rs and rt into register rd
AND immediate
andi rt, rs, imm
Put the logical AND of register rs and the zero-extended immediate
into register rt
Divide
div rs, rt
Divide register rs by register rt. Leave the quotient in register lo and the
remainder in register hi
Multiply
mult rs, rt
Multiply registers rs and rt. Leave the low-order word of the product in
register lo and the high-order word in register hi
48
NOR
nor rd, rs, rt
Put the logical NOR of registers rs and rt into register rd
OR
or rd, rs, rt
Put the logical OR of registers rs and rt into register rd
OR immediate
ori rt, rs, imm
Put the logical OR of register rs and the zero-extended immediate into
register rt
49
Shift left logical
sll rd, rt, shamt
Shift left logical variable
sllv rd, rt, rs
Shift right arithmetic
sra rd, rt, shamt
Shift right arithmetic variable
srav rd, rt, rs
Shift right logical
srl rd, rt, shamt
Shift right logical variable
srlv rd, rt, rs
Shift register rt left (right) by the distance indicated by immediate shamt
or the register rs and put the result in register rd
50
Subtract (with overflow)
sub rd, rs, rt
Put the difference of registers rs and rt into register rd.
If the subtraction results in 32-bit 2’s complement arithmetic
overflow then the destination register is not modified and an Integer
Overflow exception occurs
Exclusive OR
xor rd, rs, rt
Put the logical XOR of registers rs and rt into register rd.
XOR immediate
xori rt, rs, imm
Put the logical XOR of register rs and the zero-extended immediate
into register rt
51
(2) Constant-Manipulating Instructions
Load upper immediate
lui rt, imm
Load the lower halfword of the immediate imm into the upper halfword
of register rt. The lower bits of the register are set to 0
Cargar una palabra inmediata en un registro
No hay una instrucción máquina para ello
Se puede hacer con un lui y un ori
Por ejemplo lui $t0, 0x1234
# t0=0x12340000
ori $t1, $t0, 0x5678
# t1=0x12340000 OR 0x00005678
cargaría la palabra 0x12345678 en el registro t1
52
(3) Comparison Instructions
Set less than
slt rd, rs, rt
Set register rd to 1 if register rs is less than rt, and to 0 otherwise
Set less than immediate
slti rt, rs, imm
Set register rt to 1 if register rs is less than the sign-extended
immediate, and to 0 otherwise
53
(4) Branch Instructions
Branch on equal
beq rs, rt, label
Conditionally branch to instruction specified by label if register rs
equals rt
Branch on greater than equal zero
bgez rs, label
Conditionally branch to instruction specified by label if register rs is
greater than or equal to 0
Branch on greater than zero
bgtz rs, label
Conditionally branch to instruction specified by label if register rs is
greater than 0
54
Branch on less than equal zero
blez rs, label
Conditionally branch to instruction specified by label if register rs is
less than or equal to 0
Branch on less than zero
bltz rs, label
Conditionally branch to instruction specified by label if register rs is
less than 0
Branch on not equal
bne rs, rt, label
Conditionally branch to instruction specified by label if register rs is
not equal to rt
55
(5) Jump instructions
Jump
j target
Unconditionally jump to the instruction at target
Jump and link
jal target
Unconditionally jump to the instruction at target; save the address of
the next instruction in register $ra
Jump register
jr rs
Unconditionally jump to the instruction whose address is in register rs
56
(6) Load Instructions
Load byte
lb rt, address
Load unsigned byte
lbu rt, address
Load the byte at address into register rt; the byte is
sign-extended by lb, but not by lbu
57
Load halfword
lh rt, address
Load unsigned halfword
lhu rt, address
Load the 16-bit quantity (halfword) at address into register rt; the
halfword is sign-extended by lh, but not by lhu
Load word
lw rt, address
Load the 32-bit quantity (word) at address into register rt
58
(7) Store Instructions
Store byte
sb rt, address
Store the low byte from register rt at address
Store halfword
sh rt, address
Store the low halfword from register rt at address
Store word
sw rt, address
Store the word from register rt at address
59
(8) Data Movement Instructions
Move from hi
mfhi rd
Move from lo
mflo rd
Move the hi (lo) register to register rd
Move to hi
mthi rs
Move to lo
mtlo rs
Move register rs to the hi (lo) register
Mover un registro a otro
No existe una instrucción máquina para ello
Se puede hacer con un add rd, rs, $zero #rd=rs+0
60
(9) Floating-Point Instructions
No las veremos
(10) Exception and Interrupt Instructions
System call
syscall
Register $v0 contains the number of the system call (see Figure A.17)
provided by SPIM
61
2.4. Tipos de operandos
El tipo de un dato viene determinado por la operación
que se realice con él
Categorías generales más importantes:
(1)
(2)
(3)
(4)
Direcciones
Números
Caracteres
Datos lógicos
62
(1) Direcciones
En las instrucciones de control de secuencia el operando es una
dirección de memoria de la instrucción a la que se salta
Pueden considerarse como números enteros sin signo
En la MIPS serán números de 32 bits
63
(2) Números
Son usuales tres tipos de datos numéricos:
(i) Enteros
- con signo, representados en complemento a 2
- sin signo
Tamaños: byte, media palabra (half-word), palabra (word)
(ii) Punto flotante
IEEE 754: simple precisión (32 bits) y doble precisión (64 bits)
(iii) Decimal
En BCD (Decimal codificado en binario):
- empaquetado: 2 dígitos decimales por byte. Ejemplo: 01001001 -> 49
- no empaquetado: 1 dígito/byte. Ejemplo: 00000100 00001001 -> 49
MIPS no los tiene
64
(3) Caracteres
Códigos binarios para representar caracteres
mediante secuencias de bits
Estándares:
- ASCII de 8 bits
- EBCDIC de 8 bits (utilizado por los grandes computadores IBM)
MIPS no tiene instrucciones específicas para tratamiento de
caracteres
(4) Datos lógicos
Un objeto de n bits es considerado como n datos de 1 bit
Utilizados en operaciones lógicas
65
Formatos numéricos del Pentium II
66
2.4. Modos de direccionamiento
Distintas formas que tiene la arquitectura para especificar los
operandos
Objetivos:
- referenciar un rango elevado de posiciones de memoria principal
(número de bits para el direccionamiento limitado)
- dar soporte a las estructuras de datos de alto nivel
Puede ser:
- para datos, sobre los que opera la instrucción
- para instrucciones, especifica la dirección de la siguiente
instrucción a ejecutar (en instrucciones de control)
Veremos:
- aspectos del almacenamiento de datos en memoria: alineación y
orden de los bytes
- los distintos modos de direccionamiento
67
2.4.1. Necesidades de direccionamiento
Dónde puede estar un operando:
- en la propia instrucción
- en un registro
- en memoria
68
A simple vista, lo lógico sería que en la propia instrucción se
especificase el operando, su dirección en memoria o el registro que lo
contiene
No siempre lo más indicado por las siguientes razones:
- ahorro de espacio: direccionamientos indirectos,
base+desplazamiento e indexado, ocupan menos bits que una
dirección
- código reubicable: con los direccionamientos relativos a una
dirección base (almacenada en un registro)
- estructuras de datos: direccionamientos relativos a la dirección
base (en un registro) de la tabla, con un desplazamiento (en un
registro o una constante), direccionamientos
auto-incremento/decremento y escalado o índice
69
2.4.2. Interpretación de las direcciones de memoria
¿Qué objeto es accedido dada una dirección y una longitud?
Dos convenios para ordenar en memoria los bytes de un objeto
multibyte:
- little endian: el byte en la dirección menos significativa es el del
extremo menos significativo
- big endian: el byte en la dirección menos significativa es el del
extremo más significativo
70
Convenios para clasificar los bytes de una palabra:
- Little Endian: La dirección de un dato es la dirección de la parte
menos significativa del dato
- Big Endian: La dirección de un dato es la dirección de la parte más
significativa del dato
Aspecto importante cuando se intercambia información entre distintas
máquinas
71
Alineación de los datos en memoria
Algunas arquitecturas exigen que los objetos mayores de un byte
estén alineados en memoria
Definición: un acceso a un objeto de tamaño t bytes en el byte de
dirección D se alinea si D mod t = 0 (mod: resto de la división D/t)
Es decir, la dirección del objeto debe ser múltiplo de su tamaño en
bytes
72
El alineamiento permite simplificar los accesos a memoria: hardware
más sencillo y la misma velocidad de acceso para cualquier palabra en
memoria
Ejemplo ‘little-endian’:
73
Ejemplo: doble palabra alineada y no alineada
74
2.4.3. Descripción de los distintos modos de direccionamiento
75
Para especificar algunos modos de direccionamiento usaremos la
siguiente notación:
A = especificación de una dirección de memoria (Address)
R = especificación de un registro (Register)
EA = dirección real del operando en memoria (Effective address)
(X) = contenido de la posición de memoria X o del registro X
76
(1) Direccionamiento por registro
El campo de dirección especifica un registro donde está el operando
OPERANDO = (R)
n bits del campo de dirección necesarios para referenciar 2n registros
Ventajas : campo de direcciones pequeño y no hay accesos a
memoria
Desventaja: espacio de posiciones limitado
Ejemplo: add r4, r3 equivale a r4 = r4 + r3
77
(2) Direccionamiento inmediato
El operando está en la propia instrucción
OPERANDO = Operand
Para definir constantes cortas
Ejemplo: add r4, #5 equivale a r4 = r4 + 5
78
Número en complemento a 2, se hace extensión del signo al cargarlo
en un registro
Ventaja: una vez captada la instrucción, no se necesitan más
referencias a memoria
Desventaja: pocos bits para codificar el dato
VAX permite distintos tamaños para operandos inmediatos: 6, 8, 16,
32 y 64 bits
MIPS solo permite 16 bits
79
(3) Direccionamiento directo
El campo de dirección contiene la dirección efectiva del operando
EA = A
Muy sencillo, usada en las 1ªs computadoras
Desventaja: limitación del rango de direcciones por el tamaño del
campo
Ejemplo: add r1, (100) equivale a r1 = r1 + M[100]
80
Direccionamiento indirecto (por memoria o por registro)
Solución a la limitación del direccionamiento directo
(4) Direccionamiento indirecto por registro
Se especifica un registro donde está la dirección del operando
EA = (R)
Supera la limitación del nº de bits para especificar la dirección y un
solo acceso a memoria para obtener el operando
Ejemplo: add r2, (r5) equivale a r2 = r2 + M[r5]
81
(5) Direccionamiento indirecto por memoria
El campo de direcciones contiene la dirección de una palabra donde
está la dirección del operando
EA = (A)
Desventaja: dos accesos a memoria, para obtener el operando
Ejemplo: add r1, @(100) equivale a r1 = r1 + M[M[100]]
82
(6) Direccionamiento base + desplazamiento
Combina posibilidades del directo (facilidad de uso) y del indirecto por
registro (menos bits para especificar dirección)
Habrá que especificar un registro y un valor. La suma del contenido
del registro y el valor es la dirección del operando
EA = (R) + A
Ejemplo: add r4,28(r1) equivale a r4 = r4 + M[28+r1]
Para tratar vectores: el registro puede apuntar al principio del vector y
el desplazamiento selecciona el elemento correspondiente
83
(7) Direccionamiento relativo al contador de programa
Caso particular de direccionamiento base + desplazamiento
El registro referenciado implícitamente es el contador de programa
El campo de direcciones se trata como un número en complemento a
2, y representa un desplazamiento relativo al PC
Se utiliza para realizar saltos condicionales (concepto de localidad)
84
(8) Direccionamiento indexado
La dirección del operando es la suma de dos registros
Para acceder a vectores de forma más versátil que base +
desplazamiento. Un registro contiene la base del vector y el otro el
índice del elemento correspondiente
Ejemplo: add r3, (r1+r2) equivale a r3= r3+M[r1+r2]
85
(9) Direccionamiento autoincremento
Indirecto por registro con autoincremento del mismo
Ejemplo: add r1,(r3)+ equivale a r1= r1 + M[r3]
r3=r3+d
(d:tamaño del elemento)
(10) Direccionamiento autodecremento
Igual pero se autodecrementa el registro
(11) Direccionamiento escalado o índice
Para soportar tratamientos de arrays
Ejemplo: add r1, 50(r2)[r3] equivale a r1=r1+M[50+r2+r3*d] donde
d:tamaño del elemento del array
86
Los cinco modos de direccionamiento del MIPS son:
(1) Direccionamiento inmediato
El operando se encuentra codificado en la propia instrucción,
representado como dato inmediato
87
(2) Direccionamiento a registro
El operando está en un registro cuyo identificador se encuentra
codificado en la instrucción
88
(3) Direccionamiento base (+desplazamiento)
La dirección efectiva del operando se obtiene sumando un
desplazamiento que se encuentra en la instrucción con una dirección
base que se encuentra en un registro especificado también por la
instrucción
89
(4) Direccionamiento relativo al contador de programa
Es un caso particular del direccionamiento base (+desplazamiento)
donde el registro que contiene la dirección base es de forma implícita
el PC y el desplazamiento es de instrucciones (4 posiciones de
memoria)
90
Este modo de direccionamiento se utiliza en instrucciones de
bifurcación
Ya que el desplazamiento es de 16 bits, este modo de
direccionamiento permite saltar dentro del rango de palabras ±215
respecto a la instrucción
Esto es suficiente para implementar bucles y sentencias ‘if’
Este modo de direccionamiento, especifica un salto relativo (número
de instrucciones) a la instrucción de bifurcación
91
(5) Direccionamiento pseudodirecto
La dirección se calcula concatenando los 4 bits más significativos del
PC con la dirección de 26 bits especificada en la instrucción y dos
ceros
Este modo de direccionamiento permite saltar más allá que el anterior
92
2.5. Formato de las instrucciones
Representación de las instrucciones en el computador
Mediante 0s y 1s: una instrucción máquina es un número
Cómo se agrupan en distintos campos que especificar la operación y
los operandos
Instrucción máquina = combinación de números (valores de los
campos)
93
Tamaño de las instrucciones: aspecto básico del diseño del formato
Compromiso entre:
- repertorio de instrucciones potente (más operaciones, más
operandos, más modos de direccionamiento y mayor rango de
direcciones (más registros)): más bits para codificar
- programas cortos: instrucciones cortas y de longitud variable
- sencillez del hardware de captación y decodificación de las
instrucciones: tamaño de las instrucciones fijo e igual al tamaño de
la palabra de la máquina
Los direccionamientos implícito e indirecto, permiten acortar el tamaño
de la instrucción
94
Codificación de los modos de direccionamiento
Según el número de modos de direccionamiento que tenga una
arquitectura:
95
Características de los formatos de instrucción que deben tener las
arquitecturas:
- Cada computador tiene unos pocos formatos: cada instrucción se
ajusta a uno de ellos. Cuantos menos más sencilla la unidad de
control
- Son sistemáticos: campos del mismo tipo tienen la misma longitud
y ocupan el mismo sitio dentro de la instrucción (código de
operación el primero). Simplifica la decodificación de la instrucción
96
Ejemplos de formatos de instrucciones
IBM 360
16 registros de tipo general: 0 – 15
Palabra de 32 bits
Modos de direccionamiento del computador:
- inmediato (8 bits)
- registro: Ri (4 bits)
- almacenamiento (base + desplazamiento): Bi (registro base), Di
(desplazamiento de 12 bits)
- indexado: Xi (registro índice), Bi (registro base), Di
(desplazamiento)
Tiene 5 formatos de instrucción, según los modos de direccionamiento
2 o 3 operandos explícitos, cada uno mediante un modo de
direccionamiento determinado
97
98
Veamos ejemplos de instrucciones (RR, RS y SI) del IBM 360:
Especificación de las instrucciones:
Descripción Código
mnemónico
Suma
ADR
normalizada
larga
Salta si
BXH
índice alto
Movimiento MVI
inmediato
Código
Formato Especificación de
operación instrucc. los operandos
2A
RR
R1, R2
86
RS
R1, R3, D2(B2)
92
SI
D1(B1), inmediato
ADR 3, 4
equivale a 0x2A34
BXH 5, 8, X’6B8’(7) equivale a 0x865876B8
MVI X’A49’(6), X’3F’ equivale a 0x923F6A49
99
El VAX
Formato de instrucción muy flexible: código de operación de 8 bits,
seguido de un máximo de cinco especificadores de operando:
100
Cada especificador de operando se compone de dos o tres partes:
1. Código del modo de direccionamiento (4 bits):
-
5: registro
0xC: base + desplazamiento (de 16 bits)
0xA: base + desplazamiento (de 8 bits)
Para especificar un operando inmediato los 2 bits más significativos
son 00 y los 6 bits restantes se utilizan para codificar el valor del
operando
2. especificación de registro (4 bits)
3. (opcional) especifica un desplazamiento en el direccionamiento
base + desplazamiento (8, 16 ó 32 bits)
Veamos algunos ejemplos de instrucciones del VAX:
101
102
Ejemplos:
Dar la instrucción máquina equivalente a:
CLRL R13
equivale a 0xD45D
MOVW 362(R3), 67(R12)
equivale a 0xB0C36A01AC43
ADDL3 #58, R1, 55(R11)
equivale a 0xC13A51AC37
103
Formatos de instrucción de la MIPS
3 formatos de instrucción de 32 bits:
104
Los tipos de instrucciones en cada formato son:
- Formato tipo R: utilizado por las instrucciones aritméticas y lógicas
que no tienen operandos inmediatos
- Formato tipo I: utilizado por las instrucciones de transferencia, las
de salto condicional (bifurcación) y las instrucciones con operandos
inmediatos
- Formatos tipo J: utilizado por las instrucciones de salto
Veamos ejemplos de los distintos formatos:
105
1. Tipo R
- op: operación básica de la instrucción, tradicionalmente llamada
código de operación
- rs: primer registro operando fuente
- rt: segundo registro operando fuente
- rd: registro operando destino, donde se almacena el resultado de la
operación
- shamt: tamaño del desplazamiento (shift amount)
- funct: función. Este campo selecciona la variante específica de la
operación del campo op, y a veces se le denomina código de
función
106
Instrucciones aritméticas y lógicas:
(1) 3 operandos en registros:
Ejemplos:
107
Cuidado, son números en decimal
Modo de direccionamiento registro:
108
(2) 2 operandos en registros:
Desplaza rt (fuente), ‘shamt’ posiciones, y pon el resultado en rd
(destino)
Por ejemplo: sll $7, $3, 5
0
0
3
7
6
0
109
2. Tipo I
2.1. Instrucciones de transferencia (de datos entre memoria y
registros)
110
Existen instrucciones de carga distintas para los diferentes tamaños de
objeto:
111
En todos los casos, el direccionamiento para el segundo operando es
base (registro rt) + desplazamiento (valor especificado en la propia
instrucción con 16 bits):
El uso de etiquetas en ensamblador evita al programador hacer el
cálculo con direcciones:
lb $2, dirección (dirección = valor($1) = $1 + valor)
112
2.2. Instrucciones de salto condicional (bifurcación)
La instrucción “beq rs, rt, L1”(branch if equal) significa ir a la sentencia
etiquetada con L1 si el valor del registro rs es igual al valor del registro
rt
La instrucción “bne rs, rt, L1”(branch if not equal) significa ir a la
sentencia etiquetada con L1 si el valor de rs no es igual al valor en rt
113
El modo de direccionamiento empleado es direccionamiento con
desplazamiento relativo al contador de programa
Se especifica el desplazamiento (16 bits) con respecto al contador de
programa donde está la instrucción destino del salto Æ las
instrucciones de bifurcación pueden saltar 215-1 instrucciones hacia
delante y 215 hacia atrás
En ensamblador, el uso de etiquetas libera al programador del tedioso
cálculo de las direcciones de salto:
beq $19, $20, L1 donde L1= PC + 0x183d
114
2.3. Instrucciones con un operando inmediato
Para operaciones con constantes:
Direccionamiento inmediato
115
3. Tipo J
3.1. Instrucciones de salto (incondicional)
Direccionamiento pseudodirecto: donde la dirección de salto son los
26 bits de la instrucción concatenados con los bits de mayor peso del
contador de programa:
116
Ejemplos de modos de direccionamiento de la MIPS
117
(1) Inmediato
Instrucción ensamblador: addi $t0,$t1,4 (operando inmediato)
Tipo I
Instrucción máquina: 001000010010100000000000000000100
4
Operación a realizar: $t0 = $t1 + 4
Contenido de los registros antes de la operación:
Contenido de los registros después de la operación:
118
(2) Registro:
Instrucción ensamblador: sub
Tipo R
Instrucción máquina:
$10, $11, $12 (los 3 operandos
direccionados en modo registro)
00000001011011000101000000100010
$11 $12 $10
Operación a realizar:
$10 = $11 - $12 = 7 – 4 = 3
Contenido de los registros después de la operación:
119
(3) Base (+desplazamiento)
Instrucción ensamblador: sw
$13, 8($14) (dir.base+desplaz.)
Instrucción máquina: 10101101110011010000000000001000
$14
8
Operación: transfiere la palabra en el registro $13 a la posición de
memoria especificada (8 + $14)
120
Contenido de los registros antes de la operación:
De forma que la operación a realizar es:
M ($14 + 8) = M (0x10010008) = $13 = 0x1234567
El valor queda almacenado en la correspondiente posición de
memoria:
121
(4) Relativo al contador de programa
Este modo de direccionamiento, especifica un salto relativo (número
de instrucciones) a la instrucción de bifurcación
Instrucción ensamblador: bgez $t2, instr1 (dir. relativo al PC)
add $t7, $t0,$t1
instr1: add $t7, $t1, $t2
122
Instrucción máquina: 00000101010000010000000000000010
2
Operación: bifurca a la instrucción especificada por la etiqueta instr1
si el registro $t2 es mayor o igual que 0
Sea [0x0040002C] la dirección de la instrucción de bifurcación (bgez
$t2, instr1) Æ instr1 = 0x0040002C + (2*4)= 0x00400034, que
es la dirección de la instrucción destino del salto (add $t7,$t1,$t2)
123
(5) Pseudodirecto
La dirección se calcula concatenando los 4 bits más significativos del
PC con la dirección de 26 bits especificada en la instrucción y dos
ceros
Instrucción ensamblador:
instr2:
j instr2 (dir. pseudodirecto)
add $t7, $t0,$t1
add $t7, $t1, $t2
Operación : salta a la instrucción especificada por instr2
124
Instrucción máquina: 00001000000100000000000000010000
Sea [0x00400038] la dirección de la instrucción de salto (j instr2)
instr2 = 00000000010000000000000001000000 = 0x00400040, que
es la dirección de la instrucción destino del salto (add $t7,$t1,$t2)
125
Descargar