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