Instrucciones: Lenguaje del computador

Anuncio
(I I Pa rt e )
I nst ruc c ione s: Le ngua je
de l c om put a dor
§2.1 Introducción
Es el repertorio de instrucciones de un
computador
Procesadores diferentes tienen conjunto de
instrucciones diferentes.
Pero con muchos aspectos en común
Los primeros computadores tenían un conjunto
de instrucciones muy sencillo.
Construcción muy simple.
Muchos computadores modernos también tienen
un conjunto de instrucciones simples.
Ing. JoséAlberto Díaz García
2
Utilizado como ejemplo en el libro de texto
Stanford MIPS, comercializado por MIPS
Technologies (www.mips.com)
Son utilizadas por gran parte del mercado
Aplicaciones en electrónica de consumo, equipo de
redes/almacenamiento, cámaras, impresoras,
.
Típicas en muchas ISAs modernas.
Ing. JoséAlberto Díaz García
3
Se refiere a la forma en que se escriben
las instrucciones y los operandos que se
involucran en cada uno de los campos.
En las instrucciones MIPS hay dos
formatos para escribir las instrucciones
Formato básico
Formato para instrucciones en punto flotante
Ing. JoséAlberto Díaz García
4
Básicas
Se refiere a instrucciones aritméticas, de manejo de
datos y control de programa necesarias para escribir
algoritmos en código ensamblador, para que sean
interpretadas por un procesador con instrucciones
MIPS.
Punto flotante
Los MIPS tienen un coprocesador que opera en punto
flotante con precisión sencilla (32 bits), o con doble
precisión (64 bits)
El coprocesador cuenta con su grupo de registros de
32 bits de ancho enumerados con $f0 hasta $f31.
Ing. JoséAlberto Díaz García
5
Ing. JoséAlberto Díaz García
6
Ing. JoséAlberto Díaz García
7
$a0 $a3: argumentos (reg s 4 7)
$v0, $v1: valores de resultados (reg s 2 y 3)
$t0 $t9: temporales
Pueden sobreescribirse por un call
$s0
$s7: almacenar
Deben ser almacenados/salvados por un call
$gp: puntero global para datos estáticos (reg 28)
$sp: puntero de pila (reg 29)
$fp: puntero de marco o frame (reg 30)
$ra: dirección de retorno (reg 31)
Ing. JoséAlberto Díaz García
8
Resumen de los modos de direccionamiento
Ing. JoséAlberto Díaz García
9
Todas las instrucciones son de 32 bits de
ancho
Cuenta con formatos diferentes para
diferentes propósitos
La similitud en formatos permite una fácil
implementación
31
31
31
6 bits
5 bits
5 bits
5 bits
5 bits
op
rs
rt
rd
6 bits
5 bits
5 bits
16 bits
op
rs
rt
offset
shamt funct
6 bits
26 bits
op
address
Ing. JoséAlberto Díaz García
6 bits
0
0
Formato R
Formato I
Formato J
0
10
Formato básicas
Formato en punto flotante
Ing. JoséAlberto Díaz García
11
Aritméticas & Lógicas
en registros
add $s1, $s2, $s3
or $s3, $s4, $s5
manipulan datos
$s1 = $s2 + $s3
$s3 = $s4 OR $s5
Transferencia de datos mueve datos que
se encuentran en registros a o de memoria
lw $s1, 100($s2)
sw $s1, 100($s2)
$s1 = Memory[$s2 + 100]
Memory[$s2 + 100] = $s1
Salto - altera el flujo del programa
beq $s1, $s2, 25
Ing. JoséAlberto Díaz García
if ($s1==$s1) PC = PC + 4 + 4*25
12
Uso de instrucciones (assembly)
add dest, src1, src2
sub dest, src1, src2
and dest, src1, src2
dest=src1 + src2
dest=src1 - src2
dest=src1 AND src2
Características de las instrucciones
Siempre tres operandos: destino y dos fuentes
El orden de los operandos está definido
Los operandos siempre se encuentran en los
registros de propósito general
Ing. JoséAlberto Díaz García
13
Representación binaria de las
instrucciones aritméticas & lógicas
6 bits
5 bits
5 bits
5 bits
op
rs
rt
rd
31
5 bits
6 bits
shamt funct
0
Utilizado en instrucciones aritméticas, lógicas y
de desplazamiento.
También se les llama instrucciones con formato
tipo R.
Ing. JoséAlberto Díaz García
14
opcode
Presenta el código binario que representa la operación básica que realizará la
instrucción, por lo general se le llama código de operación
rs
Se presenta el código correspondiente al registro donde se encuentra el primer
operando
rt
Se presenta el código correspondiente al registro donde se encuentra el segundo
operando
rd
Se presenta el código correspondiente al registro destino donde se almacenará
el resultado de la operación
shamt
Shift amount, se utiliza en algunas instrucciones relacionadas con
desplazamientos de bits
funct
Función, algunas veces llamado como código de función, selecciona las
variantes específicas del código de operación.
Ing. JoséAlberto Díaz García
15
Representación binaria de las
instrucciones aritméticas y lógicas
Lenguaje máquina para
add $8, $17, $18
En la tarjeta de referencia buscar los
valores para op, funct
6 bits
5 bits
5 bits
5 bits
op
rs
rt
rd
5 bits
6 bits
shamt funct
31
0
0
17
18
8
0
32
000000 10001 10010 01000 00000 100000
Ing. JoséAlberto Díaz García
Decimal
Binaria
16
Dos fuentes y un destino
add a, b, c
# a toma el valor de
b + c
Todas las operaciones aritméticas tienen la
misma forma
Principio de Diseño #1: La simplicidad favorece
la regularidad
La regularidad hace simple la implementación.
Simplicidad permite un mayor rendimiento a menor
costo
Ing. JoséAlberto Díaz García
§2.2 Operaciones y el hardware del computador
Sume y substraer, tres operandos
17
Código en lenguaje C:
f = (g + h) - (i + j);
Compilado en código MIPS:
add t0, g, h
add t1, i, j
sub f, t0, t1
Ing. JoséAlberto Díaz García
# temp t0 = g + h
# temp t1 = i + j
# f = t0 - t1
18
Datos constantes especificados en una
instrucción
addi $s3, $s3, 4
No hay una instrucción para substraer en forma
inmediata.
Basta con utilizar una constante negativa
addi $s2, $s1, -1
Principio de Diseño 3: Haga el caso común lo
más rápido posible.
Las constantes pequeñas son comunes
Los operandos inmediatos eliminan las instrucciones
de cargue.
Ing. JoséAlberto Díaz García
19
El registro MIPS 0 ($zero) es la constante 0
No se puede sobre escribir
Útil para las operaciones comunes
Por ejemplo, movimientos entre registros
add $t2, $s1, $zero
Ing. JoséAlberto Díaz García
20
x
x n 12
n 1
xn 22
Rango: 0 a +2n
Ejemplo
n 2
1
x12
x0 2
0
1
§2.4 Números con signo y sin signo
Dado un número de n-bit
0000 0000 0000 0000 0000 0000 0000 10112
=0+
+ 1×23 + 0×22 +1×21 +1×20
=0+
+ 8 + 0 + 2 + 1 = 1110
Utilizando 32 bits
0 a +4,294,967,295
Ing. JoséAlberto Díaz García
21
Enteros con signo en complemento a 2
Dado un número de n-bit
x
x n 12
n 1
Rango: 2n
Ejemplo
xn 22
1
n 2
a +2n
1
x12
1
x0 2
0
1
1111 1111 1111 1111 1111 1111 1111 11002
= 1×231 + 1×230 +
+ 1×22 +0×21 +0×20
= 2,147,483,648 + 2,147,483,644 = 410
Utilizando 32 bits
2,147,483,648 a +2,147,483,647
Ing. JoséAlberto Díaz García
22
Enteros con signo en complemento a 2
El bit 31 es el bit de signo
1 para los números negativos
0 para los números positivos
( 2n 1) no puede representarse
Los números positivos tienen el mismo signo y la
misma representación en complemento a 2.
Algunos números específicos
0: 0000 0000
0000
1: 1111 1111
1111
Más negativo: 1000 0000
Más positivo: 0111 1111
Ing. JoséAlberto Díaz García
0000
1111
23
Complemento y sume 1
Complemento significa 1
x x 1111...1112
x 1
0, 0
1
1
x
Ejemplo: negar +2
+2 = 0000 0000
2 = 1111 1111
= 1111 1111
Ing. JoséAlberto Díaz García
00102
11012 + 1
11102
24
Representa números utilizando más bits
Conserva el valor numérico
En el conjunto de instrucciones MIPS
addi: para valores inmediatos extendidos
lb, lh: carga extendida byte/mediapalabra
beq, bne: extendida con desplazamiento
Reproduce el bit de signo a la izquierda
p.e. números sin signo: extendidos con 0s
Ejemplo: 8-bit a 16-bit
+2: 0000 0010 => 0000 0000 0000 0010
2: 1111 1110 => 1111 1111 1111 1110
Ing. JoséAlberto Díaz García
25
Se llaman código máquina
Instrucciones MIPS
Se codifican en palabras de instrucción de 32-bits.
Los formatos de números pequeños, codificación del
código de operación (opcode), números de registros,
Reproducciones
Numero de los registros
$t0 $t7 son los registros del 8 15
$t8 $t9 son los registros del 24 25
$s0 $s7 son los registros del 16 23
Ing. JoséAlberto Díaz García
§2.5 Representación de instrucciones en el computador
Las instrucciones se codifican en binario
26
op
rs
rt
rd
shamt
funct
6 bits
5 bits
5 bits
5 bits
5 bits
6 bits
Campos de la instrucción
op: código de operación (opcode)
rs: número del primer registro fuente
rt: número del segundo registro fuente
rd: número del registro destino
shamt: cantidad de desplazamientos (00000
por fila)
funct: código de la función (opcode extendido)
Ing. JoséAlberto Díaz García
27
op
rs
rt
rd
shamt
funct
6 bits
5 bits
5 bits
5 bits
5 bits
6 bits
add $t0, $s1, $s2
special
$s1
$s2
$t0
0
add
0
17
18
8
0
32
000000
10001
10010
01000
00000
100000
000000100011001001000000001000002 = 0232402016
Ing. JoséAlberto Díaz García
28
Base 16
Representación compacta de una cadena de bits
4 bits por cada dígito hexadecimal
0
1
2
3
0000
0001
0010
0011
4
5
6
7
0100
0101
0110
0111
8
9
a
b
1000
1001
1010
1011
c
d
e
f
1100
1101
1110
1111
Ejemplo: ECA8 6420
1110 1100 1010 1000 0110 0100 0010 0000
Ing. JoséAlberto Díaz García
29
op
rs
rt
Constante o dirección
6 bits
5 bits
5 bits
16 bits
Instrucción aritmética inmediata e instrucción load/store
rt: número de registro fuente o destino
Constante: 215 a+215 1
Dirección: se agrega un offset a la dirección base en rs
Principio de Diseño 4: Un buen diseño demanda un buen
compromiso
Los diferentes formatos complican la decodificación, pero
permiten uniformidad en instrucciones de 32 bits.
Mantenga los formatos lo más similar posible.
Ing. JoséAlberto Díaz García
30
Computadores con programa almacenado
La gra n figura
Las instrucciones se
representan en binario como
los datos.
Las instrucciones y los datos
se almacenan en memoria.
Los programas pueden
operar en programas
p.e., compiladores, linkers,
La compatibilidad binaria
permite a los programas
compilados operar en
diferentes computadores
ISAs estandarizadas
Ing. JoséAlberto Díaz García
31
Operación
C
Java
MIPS
Desplazamiento
izquierda
<<
<<
sll
Desplazamiento
derecha
>>
>>>
srl
Modo de bit AND
&
&
and, andi
Modo de bit OR
|
|
or, ori
Modo de bit NOT
~
~
nor
§2.6 Operaciones lógicas
Instrucciones par la manipulación de bits
Útil para insertar y extraer grupos de
bits en una palabra
Ing. JoséAlberto Díaz García
32
Útil para enmascarar bits en una palabra
Seleccionar algunos bits, borrar otros 0
and $t0, $t1, $t2
$t2
0000 0000 0000 0000 0000 1101 1100 0000
$t1
0000 0000 0000 0000 0011 1100 0000 0000
$t0
0000 0000 0000 0000 0000 1100 0000 0000
Ing. JoséAlberto Díaz García
33
Útil para incluir bits en una palabra
Ponga algunos bits en 1, deje los otros sin
cambiar.
or $t0, $t1, $t2
$t2
0000 0000 0000 0000 0000 1101 1100 0000
$t1
0000 0000 0000 0000 0011 1100 0000 0000
$t0
0000 0000 0000 0000 0011 1101 1100 0000
Ing. JoséAlberto Díaz García
34
Útil para invertir bits en una palabra
Cambiar 0 a 1, y 1 a 0
MIPS cuenta con una instrucción para realizar la
función NOR con tres operandos
a NOR b == NOT ( a OR b )
nor $t0, $t1, $zero
Registro 0: siempre
tiene ceros
$t1
0000 0000 0000 0000 0011 1100 0000 0000
$t0
1111 1111 1111 1111 1100 0011 1111 1111
Ing. JoséAlberto Díaz García
35
Transferencia de datos entre registros y
memoria
Formato de las instrucciones (ensamblador)
lw $dest, offset($addr)
sw $src, offset($addr)
load word
store word
Usos:
Accesar una variable en la memoria principal
Accesar un elemento de un arreglo
Ing. JoséAlberto Díaz García
36
8
R0=0 (constant)
R1
R2=0x10
R3
R4
R5 =R5
629310
+
0x00
0x04
0x08
0x0c
0x10
0x14
0x18
0x1c
Variable X
Variable Y
Variable Z = 692310
R30
R31
Registros
lw R5,8(R2)
Ing. JoséAlberto Díaz García
Memoria
37
12=0xc
R0=0 (constant)
R1
R2=0x08
R3
R4
R5=105
+
Dirección base
0x00
0x04
0x08
0x0c
0x10
0x14
0x18
0x1c
a[0]
a[1]
a[2]
a[3]=105
a[3]
a[4]
R30
R31
Registros
Programa en C: int a[5];
a[3] = z;
Offset para escalar
Memoria
Ensamblador:
sw $5,12($2)
Ing. JoséAlberto Díaz García
38
Representación binaria de
instrucciones para transferir datos
6 bits
5 bits
5 bits
16 bits
op
rs
rt
offset
Utilizado por instrucciones para cargar y
almacenar
Dirección
op: Operación básica de la instrucción (opcode)
rs: primer registro con primer operando fuente
rt: segundo registro con operando fuente
offset: offset para la dirección con signo en 16 bits (32,768 a +32,767)
También se le llama instrucciones con formato I
Ing. JoséAlberto Díaz García
39
Utilizados para el acceso frecuente de datos
Enumerados del 0 al 31
Un dato de 32-bits se denomina palabra
Nombres del ensamblador
$t0, $t1, , $t9 para valores temporales
$s0, $s1, , $s7 para variables almacenadas
§2.3 Operandos del hardware del computador
Las instrucciones aritméticas utilizan operandos
que se encuentran almacenados en los registros
MIPS tiene un grupo de registros de 32 × 32-bits
Principio de Diseño #2: Pequeño es rápido
p.e. memoria principal: millones de posiciones
Ing. JoséAlberto Díaz García
40
Ejemplo de operandos en registros
Código C:
f = (g + h) - (i + j);
f, , j in $s0, , $s4
Código MIPS compilado:
add $t0, $s1, $s2
add $t1, $s3, $s4
sub $s0, $t0, $t1
Ing. JoséAlberto Díaz García
41
Memoria principal utilizada para componer datos
Arreglos, estructuras, datos dinámicos
Aplicar operaciones aritméticas
Cargar valores de memoria a registros
Almacenar resultados de un registro a memoria
La memoria se direcciona por medio de un Byte
Cada dirección se identifica por un Byte
Las palabras se alinean en memoria
Las direcciones deben ser múltiplos de 4
Las MIPS son Big Endian
Los bytes más significativos por lo menos direccionan una
palabra
c.f. Little Endian: Bytes menos significativos por lo menos en una
dirección
Ing. JoséAlberto Díaz García
42
Ejemplo 1 operandos en memoria
Código C:
g = h + A[8];
g en $s1, h en $s2, dirección base de A en $s3
Compilado en código MIPS:
Índice 8 requiere un offset de 32
4 Bytes por palabra
lw $t0, 32($s3)
add $s1, $s2, $t0
offset
# cargue palabra
Registro base
Ing. JoséAlberto Díaz García
43
Código C:
A[12] = h + A[8];
h en $s2, dirección base de A en $s3
Código compilado en MIPS:
El índice 8 requiere un offset de 32
lw $t0, 32($s3)
# cargue word
add $t0, $s2, $t0
sw $t0, 48($s3)
# almacena word
Ing. JoséAlberto Díaz García
44
Los registros son más rápidos de accesar que la
memoria
Las operaciones con datos de memoria
requieren de instrucciones relacionadas con la
carga y el almacenamiento.
Más instrucciones para ejecutar
Los compiladores utilizan la mayor cantidad de
registros para almacenar las variables
Solo se almacenan en memoria las variables menos
frecuentes.
La optimización de registros es muy importante.
Ing. JoséAlberto Díaz García
45
Compare con el formato R
6 bits
5 bits
5 bits
5 bits
5 bits
op
rs
rt
rd
6 bits
5 bits
5 bits
16 bits
op
rs
rt
offset
6 bits
shamt funct
Formato R
Formato I
Note la similitud!
Ing. JoséAlberto Díaz García
46
Lenguaje máquina para
lw $9, 1200($8) == lw $t1, 1200($t0)
31
6 bits
5 bits
5 bits
16 bits
op
rs
rt
offset
35
8
9
1200
Decimal
0000010010110000
Binaria
100011 01000 01001
Ing. JoséAlberto Díaz García
0
47
Los saltos condicionales nos permiten realizar
decisiones
beq R1, R2, LABEL if R1==R2 goto LABEL
bne R3, R4, LABEL if R3!=R4 goto LABEL
Ejemplo
Código C
L1:
if (i==j) goto L1;
f = g + h;
f = f - i;
Ensamblador
L1:
beq $s3, $s4, L1
add $s0, $s1, $s2
sub $s0, $s0, $s3
Ing. JoséAlberto Díaz García
48
Ejemplo
Código C
if (i==j) f = g + h;
else f = g - h;
Ensamblador
Else:
Exit:
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit;
# salto incondicional nuevo
sub $s0, $s0, $s3
Nueva instrucción: Salto incondicional jump
j LABEL # goto Label
Ing. JoséAlberto Díaz García
49
6 bits
5 bits
5 bits
16 bits
op
rs
rt
offset
Estas instrucciones utilizan formato I
offset se le agrega al PC cuando se realiza el salto
beq r0, r1, offset
tiene el efecto:
Conversión a
word offset
if (r0==r1) pc = pc + 4 + (offset << 2)
else pc = pc + 4;
El Offset se especifica en las palabras de la instrucción
(¿Porqué?)
¿Cuál es el rango que puede tomar la etiqueta del salto?
Ing. JoséAlberto Díaz García
50
Lenguaje máquina
para
$20
$19
beq $s3, $s4, L1
add $s0, $s1, $s2
L1: sub $s0, $s0, $s3
PC
PC+4
Etiqueta
para beq
31
Offset de 1-instrucción
6 bits
5 bits
5 bits
16 bits
op
rs
rt
offset
4
19
20
1
Decimal
0000000000000001
Binaria
000100 10011 10100
Ing. JoséAlberto Díaz García
0
51
bne, beq realiza una comparación de igualdad
slt realiza una comparación de magnitud
Registro de
condición
slt $t0,$s3,$s4
# if $s3<$s4 $t0=1;
# else $t0=0;
Combina el salto con bne o beq:
slt $t0,$s3,$s4
bne $t0,$zero, Less
# if (a<b)
# goto Less;
¿Porque no se incluye la instrucción blt en el
hardware?
Si se realiza por hardware baja el rendimiento de la máquina
El ensamblador realiza esta función si se requiere (generando
dos instrucciones)
Ing. JoséAlberto Díaz García
52
Representación binaria de - Jump
6 bits
26 bits
op
address
Las instrucciones de salto utilizan el
formato j (op=2)
¿Qué sucede durante la ejecución?
PC = PC[31:28] : (IR[25:0] << 2)
Concatena los cuatro Conversión a
word offset
bits más
significativos del PC
para formar una
dirección de 32 bits
Ing. JoséAlberto Díaz García
53
Lenguaje máquina para:
Asuma L5 se encuentra en la dirección 0x00400020
j L5
y
PC <= 0x03FFFFFF
LSB 28
bits
>>2
31
6 bits
26 bits
op
address
2
0x0100008
000010
00000100000000000000001000
Ing. JoséAlberto Díaz García
0x0100008
0
Decimal/Hex
Binario
54
Instrucciones para Constantes / Inmediatas
Las constantes pequeñas se utilizan con cierta
frecuencia (50% de los operandos)
p.e.
A = A + 5;
B = B + 1;
C = C - 18;
Instrucciones MIPS inmediatas (Formato I):
addi $29, $29, 4
slti $8, $18, 10
andi $29, $29, 6
ori $29, $29, 4
Instrucciones aritméticas sign-extend immed.
Instrucciones lógicas sin sign extend immed.
Permite hasta constantes de 16 bits
¿Cómo carga una constante en un registro?
ori $5, $zero, 666
Ing. JoséAlberto Díaz García
55
Porque 16 bits caben perfectamente en
instrucciones de 32 bits.
Porque la mayoría de las constantes son
pequeñas (p. e. < 16 bits)
Principio de diseño #4: Haga el caso
común rápido
Ing. JoséAlberto Díaz García
56
and, andi ancho de un bit AND
or, ori ancho de bit OR
Ejemplo
$s0
11011111010110100100100011110101
$s1
11110000111100001111000011110000
and
$s2
11010000010100000100000011110000
ori
$s3,s2,252
(25210)
00000000000000000000000011111100
$s3
$s2,$s0,$s1
11010000010100000100000011111100
Ing. JoséAlberto Díaz García
57
Inmediatas de 32-Bits y direcciones
Las operaciones inmediatas generan constantes de 16
bits.
¿Que sucede cuando necesito constantes mas grandes?
Utiliza "load upper immediate - lui (Formato I) para poner
los 16 bits más significativos de la constante en el registro.
lui $t0, 1010101010101010
$t0
1010101010101010
(original contents)
0000000000000000
Lleno con ceros
Luego utilice ori para llenar en los 16 bits menos significativos:
ori $t0, $t0, 1010101010101010
$t0
1010101010101010
Ing. JoséAlberto Díaz García
1010101010101010
0000000000000000
58
Instrucciones MIPS para desplazamientos
Instrucciones MIPS para desplazamientos lógicos
Desplace a la izquierda: Instrucción SLL (shift-left logical)
Desplace a la derecha: Instrucción SRL (shift-right logical)
$s0
11011111010110100100100011110101
sll
$s1,$s0,8
Se introducen ceros
$s1
01011010010010001111010100000000
srl
$s2,$s1,4
Se introducen ceros
$s2
00000101101001001000111101010000
Ing. JoséAlberto Díaz García
59
Codificación de las instrucciones de
desplazamiento
6 bits
5 bits
5 bits
5 bits
5 bits
6 bits
op
rs
rt
rd
shamt funct
sll
0
rs
rt
rd
shamt
0
srl
0
rs
rt
rd
shamt
6
NO SE UTILIZAN
Aplicaciones
Acceso a los campos de los bits
Multiplicación / División en potencias de 2
Ejemplo: acceso a arreglo
Ing. JoséAlberto Díaz García
sll $t0,$t1,2 # $t0=$t1*4
add $t3,$t1,$t2
lw $t3, 0($t3)
60
¿Cuál es la instrucción en lenguaje ensamblador
de la siguiente instrucción en lenguaje máquina?
0x00AF8020
Convierta a binario
0000 0000 1010 1111 1000 0000 0010
0000
Decodifique
op: 00000
rs: 00101
rt: 01111
rd: 10000
shamt: 00000
funct: 100000
Solución: add $s0, $a1, $t7
Ing. JoséAlberto Díaz García
61
op
rs
rt
rd
shamt
funct
6 bits
5 bits
5 bits
5 bits
5 bits
6 bits
shamt: cantidad de posiciones a desplazar
Corrimiento lógico a la izquierda.
Desplace a la izquierda y llene con 0 bits
sll por i bits múltiples por 2i
Corrimiento lógico a la derecha
Desplace a la derecha y llene con ceros
srl por i bits divisibles por 2i (solo sin signo)
Ing. JoséAlberto Díaz García
62
En caso contrario, continúe secuencialmente
beq rs, rt, L1
si (rs == rt) salte a la instrucción con etiqueta L1;
bne rs, rt, L1
si (rs != rt) salte a la instrucción con etiqueta L1;
§2.7 Instrucciones para tomar decisiones
Saltar a una instrucción con etiqueta si la
condición es cierta
j L1
Salte incondicionalmente a la instrucción la
con etiqueta L1
Ing. JoséAlberto Díaz García
63
Código C:
if (i==j) f = g+h;
else f = g-h;
f, g,
in $s0, $s1,
Compilado en código MIPS:
bne
add
j
Else: sub
Exit:
$s3, $s4, Else
$s0, $s1, $s2
Exit
$s0, $s1, $s2
Ensamblador calcula la
dirección
Ing. JoséAlberto Díaz García
64
Código C:
while (save[i] == k) i += 1;
i en $s3, k en $s5, la dirección para
almacenar en $s6
Compilado en código MIPS:
Loop: sll
add
lw
bne
addi
j
Exit:
$t1,
$t1,
$t0,
$t0,
$s3,
Loop
Ing. JoséAlberto Díaz García
$s3, 2
$t1, $s6
0($t1)
$s5, Exit
$s3, 1
65
Un bloque básico es una secuencia de
instrucciones sin:
Saltos anidados (excepto al final)
Etiquetas para saltos (excepto al inicio)
El computador identifica los
bloques básicos para
optimizarlos
En los procesadores
avanzados se puede acelerar
la ejecución de bloques
básicos.
Ing. JoséAlberto Díaz García
66
El resultado es 1 si la condición es
verdadera
De lo contrario, es 0
slt rd, rs, rt
if (rs < rt) rd = 1; else rd = 0;
slti rt, rs, constante
if (rs < constante) rt = 1; else rt = 0;
Utilice en combinación con beq, bne
slt $t0, $s1, $s2
bne $t0, $zero, L
Ing. JoséAlberto Díaz García
# if ($s1 < $s2)
#
branch to L
67
¿Por qué no blt, bge, etc.?
Hardware para <, ,
slower than =,
Combinado con saltos involucra más trabajo
por instrucción, requiere un reloj más lento.
Todas la instrucciones penalizadas
beq y bne son el caso común
Este es un buen compromiso de diseño
Ing. JoséAlberto Díaz García
68
Comparar signo: slt, slti
Comparar sin signo: sltu, sltui
Ejemplo
$s0 = 1111 1111 1111 1111 1111 1111 1111 1111
$s1 = 0000 0000 0000 0000 0000 0000 0000 0001
slt $t0, $s0, $s1 # con signo
1 < +1
$t0 = 1
sltu $t0, $s0, $s1
+4,294,967,295 > +1
Ing. JoséAlberto Díaz García
# sin signo
$t0 = 0
69
1.
2.
3.
4.
5.
Colocar los parámetros en los registros
Transferir el control a los procedimientos
Asignar memoria al procedimiento
Realizar las operaciones del procedimiento
Colocar el resultado en el registro para el
llamado
6. Retornar al lugar de llamado del
procedimiento
Ing. JoséAlberto Díaz García
§2.8 Manejo de procedimientos en el hardware del computador
Pasos requeridos
70
$a0 $a3: argumentos (reg s 4 7)
$v0, $v1: valores de resultados (reg s 2 y 3)
$t0 $t9: temporales
Pueden sobreescribirse por un call
$s0
$s7: almacenar
Deben ser almacenados/salvados por un call
$gp: puntero global para datos estáticos (reg 28)
$sp: puntero de pila (reg 29)
$fp: puntero de marco o frame (reg 30)
$ra: dirección de retorno (reg 31)
Ing. JoséAlberto Díaz García
71
Instrucciones para procedimientos y
calls o llamados
Llamados a un procedimiento: salte y lazo
jal etiquetadeprocedimiento
La dirección de la próxima instrucción se coloca en
$ra
Salta a la dirección indicada
Retorno de un procedimiento: salto a un registro
jr $ra
Copia el contenido de $ra al contador de programa
También se puede utilizar saltos calculados
Por ejemplo en las instrucciones para case/switch
Ing. JoséAlberto Díaz García
72
Ejemplo de un procedimiento tipo hoja
Código C:
int ejemplo hoja (int g, h, i, j)
{ int f;
f = (g + h) - (i + j);
return f;
}
Argumentos g, , j en $a0, , $a3
f en $s0 (desde aquí, se necesita salvar $s0
en la pila)
Resultado en $v0
Ing. JoséAlberto Díaz García
73
Código MIPS:
ejemplo hoja:
addi $sp, $sp, -4
sw
$s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
add $v0, $s0, $zero
lw
$s0, 0($sp)
addi $sp, $sp, 4
jr
$ra
Ing. JoséAlberto Díaz García
Save $s0 on stack
Procedure body
Result
Restore $s0
Return
74
Procedimientos que llaman a otros
procedimientos
Para llamados anidados, el que llama a los
procedimientos necesita almacenar en la
pila:
Su dirección de retorno
Cualquier argumento y temporales que se
necesitan después del llamado
Recuperar de la pila después del llamado
Ing. JoséAlberto Díaz García
75
Código en C:
int fact (int n)
{
if (n < 1) return f;
else return n * fact(n - 1);
}
Argumento n en $a0
Resultado en $v0
Ing. JoséAlberto Díaz García
76
Ejemplo de un procedimiento no hoja
Código MIPS:
fact:
addi $sp, $sp, -8
sw
$ra, 4($sp)
sw
$a0, 0($sp)
slti $t0, $a0, 1
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr
$ra
L1: addi $a0, $a0, -1
jal fact
lw
$a0, 0($sp)
#
#
#
#
#
ajusta la pila a 2 itemes
almacena la dirección de
retorno
almacena el argumento
prueba si n < 1
# si sí, resultado es 1
# pop 2 itemes de la pila
# y retorna
lw
$ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $a0, $v0
#
#
#
#
#
#
#
jr
# y retorna
$ra
Ing. JoséAlberto Díaz García
else decrementa n
llamado recursivo
recupera el valor original
de n
y dirección de retorno
pop 2 itemes de la pila
multiplica para resultado
77
Datos locales localizados por el call
P. e., C variables automáticas
Marco de procedimiento (registro de activación)
Utilizado por algunos compiladores para manejar el
almacenamiento en la pila
Ing. JoséAlberto Díaz García
78
Texto: código de programa
Datos estáticos: variables
globales
P.e.., variables estáticas en C,
arreglo de constantes y filas de
caracteres o strings
$gp se inicializa para
direccionar y permitir
desplazamientos dentro del
segmento
Datos dinámicos: apilado
E.g., malloc en C, new en Java
Stack: almacenamiento
automático
Ing. JoséAlberto Díaz García
79
§2.9 Comunicándose con la gente
Conjunto de caracteres codificados en Bytes
ASCII: 128 caracteres
95 gráficos, 33 control
Latin-1: 256 caracteres
ASCII, +96 caracteres gráficos adicionales
Unicodigo: conjunto de caracteres de32-bits
Utilizado en Java, C++ muchos caracteres,
La mayoría de los alfabetos del mundo, más símbolos
UTF-8, UTF-16: codificación en largo variable
Ing. JoséAlberto Díaz García
80
Se pueden utilizar operaciones de un bit
MIPS byte/halfword load/store
El caso más común es el procesamiento de
una hilera de caracteres
lb rt, offset(rs)
lh rt, offset(rs)
La extensión de signo a 32 bits en rt
lbu rt, offset(rs)
lhu rt, offset(rs)
Extensión de cero en 32 bits en rt
sb rt, offset(rs)
sh rt, offset(rs)
Almacene solo lo de la derecha byte/halfword
Ing. JoséAlberto Díaz García
81
Código C (naïve):
Hilera de caracteres que termina con un Null
void strcpy (char x[], char y[])
{ int i;
i = 0;
while ((x[i]=y[i])!='\0')
i += 1;
}
Direcciones en x, y en $a0, $a1
i en $s0
Ing. JoséAlberto Díaz García
82
Código MIPS:
strcpy:
addi
sw
add
L1: add
lbu
add
sb
beq
addi
j
L2: lw
addi
jr
$sp,
$s0,
$s0,
$t1,
$t2,
$t3,
$t2,
$t2,
$s0,
L1
$s0,
$sp,
$ra
$sp, -4
0($sp)
$zero, $zero
$s0, $a1
0($t1)
$s0, $a0
0($t3)
$zero, L2
$s0, 1
0($sp)
$sp, 4
Ing. JoséAlberto Díaz García
#
#
#
#
#
#
#
#
#
#
#
#
#
ajuste la pila a un item
salvar $s0
i = 0
direc de y[i] en $t1
$t2 = y[i]
direc de x[i] en $t3
x[i] = y[i]
sale del lazo si y[i] == 0
i = i + 1
próxima iteración del lazo
recupera lo salvado en $s0
pop item 1 de la pila
retorne
83
Inmediatos de 16-bit son suficientes
Para la ocasión constantes de 32-bit
lui rt, constante
Copia la constante de 16-bit a la izquierda de rt
Limpia los 16 bits de la derecha de rt a 0
lhi $s0, 61
0000 0000 0111 1101 0000 0000 0000 0000
ori $s0, $s0, 2304 0000 0000 0111 1101 0000 1001 0000 0000
Ing. JoséAlberto Díaz García
§2.10 MIPS direccionamiento para 32-Bit inmediatos o direccionamiento
La mayoría de las constantes son pequeñas
84
Las instrucciones con salto especifican:
Opcode, dos registros, dos etiquetas de dirección
La mayoría de las etiquetas de dirección son
saltos cercanos
Hacia delante o atrás
op
rs
rt
Dirección o constante
6 bits
5 bits
5 bits
16 bits
Direccionamiento relativo al PC
Dirección de etiqueta = PC + offset × 4
El PC ha incrementado en 4 en este
momento
Ing. JoséAlberto Díaz García
85
Para los saltos (j y jal) las etiquetas pueden
estar en cualquier lugar en el segmento de texto
Codifica la dirección en la instrucción
op
Dirección
6 bits
26 bits
Direccionamiento para salto
(Pseudo)Direct
Dirección de la etiqueta = PC31
(dirección× 4)
Ing. JoséAlberto Díaz García
28
:
86
Ejemplo de direccionamiento con etiqueta
Código del lazo del ejemplo anterior
Asuma el lazo a partir de la posición 80000
$t1, $s3, 2
80000
0
0
19
9
4
0
add
$t1, $t1, $s6
80004
0
9
22
9
0
32
lw
$t0, 0($t1)
80008
35
9
8
0
bne
$t0, $s5, Exit 80012
5
8
21
2
addi $s3, $s3, 1
80016
8
19
19
1
j
80020
2
Loop: sll
Loop
20000
80024
Exit:
Ing. JoséAlberto Díaz García
87
Si la etiqueta de salto está muy largo del
offset de 16 bits, el ensamblador deberá
reescribir el código.
Ejemplo
beq $s0,$s1, L1
bne $s0,$s1, L2
j L1
L2:
Ing. JoséAlberto Díaz García
88
Descargar