MIPS Assembler

Anuncio
ELO311
Estructuras de Computadores Digitales
Ensamblador MIPS
Tomás Arredondo Vidal
Este material está basado en:
material de apoyo del texto de David Patterson, John Hennessy,
"Computer Organization & Design", (segunda y tercera edición),
Morgan Kaufmann, CA. 2005
material del curso anterior ELO311 del Prof. Leopoldo Silva
material del curso CSE331 de Mary Jane Irving de Penn State
www.wikipedia.org
Repaso: Ciclo de Ejecución
El camino de datos (datapath) ejecuta las
instrucciones bajo dirección de control
Processor
Devices
Control
000000 00100 00010 0001000000100000
Memory
Input
Datapath
contents Reg #4 ADD contents Reg #2
results put in Reg #2
Output
La memoria almacena instrucciones y datos
Repaso: Organización del Procesador
Control tiene que tener la
Leer
Habilidad de leer instrucciones de memoria
Lógica para controlar la secuenciación de
instrucciones
Exec
Decode
Lógica para generar señales que controlen
la manera en que la información fluye entre
componentes del camino de datos
Lógica para controlar las operaciones de las FUs del camino de datos
Camino de datos tiene que tener los
Componentes – unidades funcionales (e.g., sumador) y almacenamiento
(e.g., set de registros) – necesario para ejecutar instrucciones
Componentes interconectados para que las instrucciones se puedan
ejecutar
Capacidad de leer y almacenar datos en la memoria
For a given level of function, however, that system is best in
which one can specify things with the most simplicity and
straightforwardness. … Simplicity and
straightforwardness proceed from conceptual integrity.
… Ease of use, then, dictates unity of design,
conceptual integrity.
The Mythical Man-Month, Brooks, pg 44
MIPS = RISC (Reduced Instruction Set Computer)
Filosofía RISC
Instrucciones de largo fijo
Sets de instrucciones de lectura-escritura (load-store)
Modos de direccionamiento limitado
Operaciones limitadas
MIPS, Sun SPARC, HP PA-RISC, IBM PowerPC, Intel
(Compaq) Alpha, …
Conjuntos de instrucciones se miden por la manera en
la cual los compiladores las usan no como los
programadores los usan
Organización General de MIPS
Processor
Memory
Register File
src1 addr
src2 addr
5
5
dst addr
write data
5
1…1100
src1
data
32
32
registers
($zero - $ra)
read/write
addr
src2
data
32
32
32
32 bits
br offset
32
Fetch
PC = PC+4
Exec
32 Add
PC
32 Add
4
read data
32
32
32
write data
32
Decode
230
words
32
32 ALU
32
32
4
0
5
1
6
2
32 bits
byte address
(big Endian)
7
3
0…1100
0…1000
0…0100
0…0000
word address
(binary)
Procesador Monociclo
Esquema General por unidad
Unidad de Control
MemWr
AluSrc
nPC_sel
RegDst
WE PC
RegWr
ExtOp
COp+
MemRd MemtoReg
AluCtr
Equal
Funct
Unidad
de
rs
5
rt
5
Unidad
rd
5
Registros
busW
Instrucción
32
busA
Unidad
de
32
AluOut
0
busB Operaciones
32
AddrD
Inm16
Din
Mem oria
Datos
Reloj
1
Dout
Instrucciónes Aritméticas MIPS
Comandos de asembler MIPS
add
$t0, $s1, $s2
sub
$t0, $s1, $s2
Cada instrucción aritmética hace solo una operación
Cada instrucción aritmética tiene exactamente tres
operandos
destination ← source1
op
source2
Los operandos se contienen en el set de registros del
camino de datos o register file ($t0,$s1,$s2)
Orden de los operandos es fijo (destino primero)
Instrucciónes Aritméticas MIPS
Comandos de asembler MIPS
add
$t0, $s1, $s2
sub
$t0, $s1, $s2
Cada instrucción aritmética hace solo una operacion
Cada instrucción aritmética tiene exactamente tres
operandos
destination ← source1
op
source2
Los operandos se contienen en el set de registros del
camino de datos o register file ($t0,$s1,$s2)
Orden de los operandos es fijo (destino primero)
Comandos Más Complejos
Asumiendo que la variable b es almacenado en el
registro $s1, c es almacenado en $s2, y d es
almacenado en $s3 y el resultado debe guardarse en
$s0, cual es el equivalente en asembler de?
h = (b - c) + d
Comandos Más Complejos
Asumiendo que la variable b es almacenado en el
registro $s1, c es almacenado en $s2, y d es
almacenado en $s3 y el resultado debe guardarse en
$s0, cual es el equivalente en asembler de?
h = (b - c) + d
sub
$t0, $s1, $s2
add
$s0, $t0, $s3
Conjunto de Registros MIPS
Operandos de instrucciones aritméticos deben ser del conjunto
de registros (register file) de ubicaciones especiales contenidas
en el camino de datos (datapath)
Register File
Tiene 32 registros de 32 bits
Con dos puertos de lectura y
Un puerto de escritura
src1 addr
src2 addr
dst addr
write data
5
32 src1
5
data
5
32
locations
32 src2
32
Registros son
Mas rápidos que memoria principal (e.g. DRAM)
Mas fácil de usar para un compilador
data
32 bits
e.g., (A*B) – (C*D) – (E*F) puede hacer multiplicaciones en cualquier
orden (vs stack)
Puede tener variables
Densidad del código es mayor (registros usan menos bits que memoria)
Direcciones de registros se indican usando $
Nombres de registros
0
$zero constant 0 (Hdware)
16 $s0 callee saves
1
$at reserved for assembler
...
2
$v0 expression evaluation &
23 $s7
3
$v1 function results
24 $t8 temporary (cont’d)
4
$a0 arguments
25 $t9
5
$a1
26 $k0 reserved for OS kernel
6
$a2
27 $k1
7
$a3
28 $gp pointer to global area
8
$t0 temporary: caller saves
29 $sp stack pointer
(callee can clobber)
30 $fp frame pointer
...
15 $t7
(caller can clobber)
31 $ra return address (Hdware)
Registros vs. Memoria
Operandos de instrucciones aritméticas deben ser
registros,
— solo hay 32 registro disponibles
Processor
Control
Datapath
Devices
Memory
Input
Output
Compiladores asocian variables con registros
Que pasa con programas con muchas variables?
Registros vs. Memoria
Operandos de instrucciones aritméticas deben ser
registros,
— solo hay 32 registro disponibles
Processor
Control
Datapath
Devices
Memory
Input
Output
Compiladores asocian variables con registros
Que pasa con programas con muchas variables?
Accediendo a la Memoria
MIPS tiene dos instrucciones básicas de transferencia de
datos para acceder a la memoria
lw
$t0, 4($s3)
#load word from memory
sw
$t0, 8($s3)
#store word to
memory
(assume $s3 tiene 2410)
La instrucción de transferencia de datos debe especificar
De donde leer (load) o escribir (write) en memoria – memory
address
Desde donde en los registros leer o cargar
La dirección de memoria se forma al sumar la dirección
constante de la instrucción y los contenidos del segundo
registro
Accediendo a la Memoria
MIPS tiene dos instrucciones básicas de transferencia de
datos para acceder a la memoria
28
lw
$t0, 4($s3) #load word from memory
sw
$t0, 8($s3) #store word to memory
32
(assume $s3 tiene 2410)
La instrucción de transferencia de datos debe especificar
De donde leer (load) o escribir (write) en memoria – memory
address
Desde donde en los registros leer o cargar
La dirección de memoria se forma al sumar la dirección
constante de la instrucción y los contenidos del segundo
registro
Memoria
Asumiendo que la variable h esta asociada con el
registro $s2, y la dirección base de arreglo A esta en
$s3, cual es el equivalente en asembler de?
A[12] = h + A[8]
Memoria
Asumiendo que la variable h esta asociada con el
registro $s2, y la dirección base de arreglo A esta en
$s3, cual es el equivalente en asembler de?
A[12] = h + A[8]
lw
$t0, 32($s3)
# Temp $t0 gets A[8]
add
$t0, $s2,$t0
# Temp $t0 gets h+A[8]
sw
$t0, 48($s3)
# Store h+A[8] into A[12]
Interconexión del Procesador y Memoria
La memoria se ve como un arreglo de ubicaciones de
almacenamiento con direcciones
Una dirección de memoria es un índice para el arreglo
read addr/
write addr
Processor
read data
Memory
write data
32 bits
numero posible de
ubicaciones?
Interconexión del Procesador y Memoria
La memoria se ve como un arreglo de ubicaciones de
almacenamiento con direcciones
Una dirección de memoria es un índice para el arreglo
read addr/ 32
write addr
Processor
read data 32
Memory
32write data
32 bits
? 232 → 230 words
ubicaciones
Tipos de datos MIPS
Bit: 0, 1
Bit String: secuencia de bits de un largo particular
4 bits is a nibble
8 bits is a byte
16 bits is a half-word
32 bits (4 bytes) is a word
64 bits is a double-word
Caracter:
ASCII 7 bit code
Decimal:
dígitos 0-9 codificados como 0000b a 1001b
dos dígitos decimales por cada byte de 8 bits
Integers: complemento 2's
Floating Point
Direcciones de Bytes
Dado que bytes de 8-bits son tan útiles, la mayoría de
las arquitecturas direccionan bytes individuales de la
memoria
Entonces, la dirección de memoria de una palabra
tiene que ser un múltiple de 4 (restricción de
alineamiento)
Procesadores MIPS generalmente pueden ser
configurados como Big o Little Endian.
Big Endian: byte de la izquierda es dirección de word
IBM 360/370, Motorola 68k, Sparc, HP PA
Little Endian: byte de la derecha es dirección de word
Intel 80x86, DEC Vax, DEC Alpha (Windows NT)
Direcionamiento: Endianess y Alineamiento
Big Endian: byte de la izquierda es dirección de word
Little Endian: byte de la derecha es dirección de word
little endian
msb
lsb
big endian
0
Aligned
Not
Aligned
1
2
3
Direcionamiento: Endianess y Alineamiento
Big Endian: byte de la izquierda es dirección de word
Little Endian: byte de la derecha es dirección de word
little endian byte 0
3
2
1
0
msb
0
big endian byte 0
lsb
1
2
3
0
Aligned
Not
Aligned
1
2
3
Direccionamiento de Memoria en MIPS
La dirección de memoria se forma sumando la parte
constante de la instrucción y el contenido del segundo
registro (base) (Asumir Little Endian)
$s3 holds 8
Memory
...0110
24
...0101
20
...1100
16
...0001
12
...0010
8
...1000
4
...0100
Data
0
Word Address
lw
$t0, 4($s3)
#que? se carga en $t0
sw
$t0, 8($s3)
#$t0 se almacena adonde?
Direccionamiento de Memoria en MIPS
La dirección de memoria se forma sumando la parte
constante de la instrucción y el contenido del segundo
registro (base)
$s3 holds 8
Memory
. . . 0001
lw
$t0, 4($s3)
sw
$t0, 8($s3)
...0110
24
...0101
20
...1100
16
...0001
12
...0010
8
...1000
4
...0100
Data
0
Word Address
. . . 0001
#que? se carga en $t0
#$t0 se almacena adonde?
en ubicación 16
Compilando con Loads and Stores
Si la variable b se almacena en $s2 y la dirección
base de un arreglo A esta en $s3, cual es el código
assembler MIPS para el siguiente código en C?
A[8] = A[2] - b
...
...
A[3]
$s3+12
A[2]
$s3+8
A[1]
$s3+4
A[0]
$s3
Compilando con Loads and Stores
Si la variable b se almacena en $s2 y la dirección
base de un arreglo A esta en $s3, cual es el código
assembler MIPS para el siguiente código en C?
A[8] = A[2] - b
...
...
A[3]
$s3+12
A[2]
$s3+8
A[1]
$s3+4
A[0]
$s3
lw
$t0, 8($s3)
sub
$t0, $t0, $s2
sw
$t0, 32($s3)
Compilando con un índice de un arreglo
Asumiendo que A es un arreglo de 50 elementos para
los cuales su base esta en $s4, y que las variables b,
c, i están en $s1, $s2, y $s3 respectivamente. Cual
es el código MIPS para la siguiente línea en C?
c = A[i] - b
add
$t1, $s3, $s3
#array index i is in $s3
add
$t1, $t1, $t1
#temp reg $t1 holds 4*i
Compilando con un índice de un arreglo
Asumiendo que A es un arreglo de 50 elementos para
los cuales su base esta en $s4, y que las variables b,
c, i están en $s1, $s2, y $s3, respectivamente, cual
es el código MIPS para la siguiente línea en C?
c = A[i] - b
add
$t1, $s3, $s3
#array index i is in $s3
add
$t1, $t1, $t1
#temp reg $t1 holds 4*i
add
$t1, $t1, $s4
#addr of A[i]
lw
$t0, 0($t1)
sub
$s2, $t0, $s1
Instrucciones MIPS hasta ahora
Category
Instr
Op Code
Example
Meaning
Arithmetic
add
0 and 32 add $s1, $s2, $s3
$s1 = $s2 + $s3
(R format)
subtract
0 and 34 sub $s1, $s2, $s3
$s1 = $s2 - $s3
Data
load word
35
lw
$s1, 100($s2)
$s1 = Memory($s2+100)
transfer
store word
43
sw $s1, 100($s2)
Memory($s2+100) = $s1
(I format)
Repaso: Organización MIPS
Instrucciones aritméticas – hacia/desde register file
Instrucciones load/store – hacia/desde memoria
Memory
Processor
1…1100
Register File
src1 addr
src1
data
32
5
src2 addr
32
5
registers
dst addr
($zero - $ra)
src2
5
write data
data
32
32
32 bits
32 ALU
32
read/write
addr
230
words
32
read data
32
write data
32
32
7
3
byte address
(little Endian)
6
2
5
1
32 bits
4
0
0…1100
0…1000
0…0100
0…0000
word address
(binary)
Nombres de registros
0
$zero constant 0 (Hdware)
16 $s0 callee saves
1
$at reserved for assembler
...
2
$v0 expression evaluation &
23 $s7
3
$v1 function results
24 $t8 temporary (cont’d)
4
$a0 arguments
25 $t9
5
$a1
26 $k0 reserved for OS kernel
6
$a2
27 $k1
7
$a3
28 $gp pointer to global area
8
$t0 temporary: caller saves
29 $sp stack pointer
(callee can clobber)
30 $fp frame pointer
...
15 $t7
(caller can clobber)
31 $ra return address (Hdware)
Representación Binaria Sin Signo (Unsigned)
Hex
Binary
Decimal
0x00000000
0x00000001
0x00000002
0x00000003
0x00000004
0x00000005
0x00000006
0x00000007
0x00000008
0x00000009
0…0000
0…0001
0…0010
0…0011
0…0100
0…0101
0…0110
0…0111
0…1000
0…1001
…
1…1100
1…1101
1…1110
1…1111
0
1
2
3
4
5
6
7
8
9
0xFFFFFFFC
0xFFFFFFFD
0xFFFFFFFE
0xFFFFFFFF
231 230 229
...
23 22 21
31 30 29
...
3
1 1 1
...
1 1 1 1
bit
1 0 0 0
...
0 0 0 0
-
232 - 1
232 - 4
232 - 3
232 - 2
232 - 1
2
1
20
valor del bit
0
posición
1
Representación Binaria con Signo (Signed)
-23 =
-(23 - 1) =
1011
y suma un 1
1010
complementa los bits
23 - 1 =
2’sc binary
1000
1001
1010
1011
1100
1101
1110
1111
0000
0001
0010
0011
0100
0101
0110
0111
decimal
-8
-7
-6
-5
-4
-3
-2
-1
0
1
2
3
4
5
6
7
Instrucción Aritmética en Machine Language
Instrucciones como registros y words de datos son de
32 bits de largo
Ejemplo:
Registros tienen números
add $t0, $s1, $s2
$t0=$8, $s1=$17, …
Formato de instrucción aritmética:
op
rs
000000 10001
rt
rd
10010
01000
shamt
00000
funct
100000
Para que son los nombres de los campos?
Instrucción Aritmética en Machine Language
Instrucciones como registros y words de datos son de
32 bits de largo
Ejemplo:
Registros tienen números
add $t0, $s1, $s2
$t0=$8, $s1=$17, …
Formato de instrucción aritmética:
op
rs
000000 10001
rt
rd
10010
01000
shamt
00000
funct
100000
Cuales son los nombres de los campos?
Nombres de los campos en MIPS
op
rs
rt
rd
shamt
funct
op
rs
rt
rd
shamt
6 bits
5 bits
5 bits
5 bits
5 bits
funct
6 bits
= 32 bits
Nombres de los campos en MIPS
op
rs
rt
rd
shamt
6 bits
5 bits
5 bits
5 bits
5 bits
funct
6 bits
= 32 bits
op
Opcode indicando la operación (instrucción)
rs
Dirección del primer registro (source) operando
rt
Dirección del segundo registro (source) operando
rd
Dirección del registro destino
shamt Cantidad de rotación (para instrucción de rotación)
funct Código de función que selecciona variante de la
operación especificada en opcode
Lenguaje de Maquina – Instruccion Load
Considere las instrucciones para load-word y store-word
Introduce un nuevo tipo de formato de instrucción
I-type para transferencia de datos
formato previo era R-type para registros
Ejemplo: lw $t0, 24($s2)
op
rs
35
18
100011
10010
rt
16 bit number
8
01000
24
0000000000011000
Lenguaje de Maquina – Instruccion Load
Considere las instrucciones para load-word y store-word
Introduce un nuevo tipo de formato de instrucción
I-type para transferencia de datos
formato previo era R-type para registros
Ejemplo: lw $t0, 24($s2)
op
rs
35
18
100011
10010
rt
16 bit number
8
01000
24
0000000000011000
Dirección de Memoria
Ejemplo:
lw $t0, 24($s2)
Memory
0xf f f f f f f f
2410 + $s2 =
0x00000002
0x12004094
$s2
El offset puede ser
positivo o negativo
data
0x0000000c
0x00000008
0x00000004
0x00000000
word address (hex)
Ubicación de Dirección de Memoria
Ejemplo:
lw $t0, 24($s2)
Memory
0xf f f f f f f f
2410 + $s2 =
0x00000002
. . . 1001 0100
+ . . . 0001 1000
. . . 1010 1100 =
0x120040ac
0x120040ac
0x12004094
$s2
El offset puede ser
positivo o negativo
data
0x0000000c
0x00000008
0x00000004
0x00000000
word address (hex)
Lenguaje de Maquina – Instruccion Store
Ejemplo: sw $t0, 24($s2)
op
rs
43
18
101011
10010
rt
16 bit number
8
01000
24
0000000000011000
Una dirección de 16-bits significa que acceso esta
limitado a ubicaciones de memoria dentro de una
región de ±213 o 8,192 words (±215 o 32,768 bytes) en
el rango de direcciones del registro base $s2
Lenguaje de Maquina – Instruccion Store
Ejemplo: sw $t0, 24($s2)
op
rs
43
18
101011
10010
rt
16 bit number
8
01000
24
0000000000011000
Una dirección de 16-bits significa que acceso esta
limitado a ubicaciones de memoria dentro de una
región de ±213 o 8,192 words (±215 o 32,768 bytes) en
el rango de direcciones del registro base $s2
Código Assembler
Recuerde el programa que se hizo anteriormente
A[8] = A[2] - b
lw
sub
sw
$t0, 8($s3)
$t0, $t0, $s2
$t0, 32($s3)
#load A[2] into $t0
#subtract b from A[2]
#store result in A[8]
Cual seria el código maquina para estas instrucciones?
Código Assembler
Recuerde el programa que se hizo anteriormente
A[8] = A[2] - b
lw
sub
sw
$t0, 8($s3)
$t0, $t0, $s2
$t0, 32($s3)
#load A[2] into $t0
#subtract b from A[2]
#store result in A[8]
El código MIPS es el siguiente:
lw
35
19
8
sub
0
8
18
sw
43
19
8
8
8
0
32
34
Repaso: Tipos de datos MIPS
Bit: 0, 1
Bit String: secuencia de bits de un largo particular
4 bits is a nibble
8 bits is a byte
16 bits is a half-word
32 bits (4 bytes) is a word
64 bits is a double-word
Caracter:
ASCII 7 bit code
Decimal:
dígitos 0-9 codificados como 0000b a 1001b
dos dígitos decimales por cada byte de 8 bits
Integers: complemento 2's
Floating Point
ASCII
La mayoría de las computadoras usan bytes de 8 bits para
representar caracteres con ASCII (American Std Code for
Info Interchange)
ASCII
Char
ASCII
Char
ASCII
Char
ASCII
Char
ASCII
Char
ASCII
Char
0
Null
32
space
48
0
64
@
96
`
112
p
1
33
!
49
1
65
A
97
a
113
q
2
34
“
50
2
66
B
98
b
114
r
3
35
#
51
3
67
C
99
c
115
s
36
$
52
4
68
D
100
d
116
t
37
%
53
5
69
E
101
e
117
u
38
&
54
6
70
F
102
f
118
v
39
‘
55
7
71
G
103
g
119
w
4
EOT
5
6
ACK
7
8
bksp
40
(
56
8
72
H
104
h
120
x
9
tab
41
)
57
9
73
I
105
i
121
y
10
LF
42
*
58
:
74
J
106
j
122
z
43
+
59
;
75
K
107
k
123
{
44
,
60
<
76
L
108
l
124
|
47
/
63
?
79
O
111
o
127
DEL
11
12
15
FF
Por eso necesitamos instrucciones para mover bytes
Leyendo y Guardando (Load/Store) Bytes
MIPS provee instrucciones para mover bytes
lb
$t0, 1($s3)
#load byte from memory
sb
$t0, 6($s3)
#store byte to
op
rs
rt
memory
16 bit number
Que 8 bits se leen y guardan?
load byte pone el byte de memoria en los 8 bits mas a la derecha
del registro destino
que pasa con los otros bits del registro?
store byte toma el bite de los 8 bits mas a la derecha del registro
y los escribe a un byte en la memoria
Ejemplo: Leyendo y Guardando Bytes
Dado el siguiente código cuales son los valores de
memoria y los registros después de ejecutarlo?
add $s3, $zero, $zero
lb
$t0, 1($s3)
sb
$t0, 6($s3)
Memory
00000000
24
00000000
20
00000000
16
10000010
12
01000402
8
FFFFFFFF
4
009012A0
0
Data
Que queda en $t0 si la
maquina es big Endian?
mem(4) = 0xFFFF90FF
$t0 = 0x00000090
Y si la maquina fuera little Endian?
Word
Address (Decimal)
mem(4) = 0xFF12FFFF
$t0 = 0x00000012
Repaso: Instrucciones MIPS hasta ahora
Category
Instr
Op Code
Example
Meaning
Arithmetic
add
0 and 32 add $s1, $s2, $s3
$s1 = $s2 + $s3
(R format)
subtract
0 and 34 sub $s1, $s2, $s3
$s1 = $s2 - $s3
Data
load word
35
lw
$s1, 100($s2)
$s1 = Memory($s2+100)
transfer
store word
43
sw $s1, 100($s2)
Memory($s2+100) = $s1
(I format)
load byte
32
lb
$s1, 101($s2)
$s1 = Memory($s2+101)
store byte
40
sb $s1, 101($s2)
Memory($s2+101) = $s1
Repaso: MIPS R3000 ISA
Categorías
Registers
Leer/Guardar (Load/Store)
Aritméticas (Computational)
Jump and Branch
Punto Flotante (Floating Point)
R0 - R31
coprocessador
PC
HI
Memory Management
Special
LO
3 Formatos: todos de 32 bits
6 bits
5 bits
5 bits
5 bits
rd
OP
rs
rt
OP
rs
rt
OP
5 bits
shamt
16 bit number
26 bit jump target
6 bits
funct
R format
I format
Descargar