Fundamentos y Arquitectura de Computadores (ITTSE – UV) F. Micó REGISTROS DEL MIPS R2000/R3000 Nombre $zero $v0 - $v1 $a0 - $a3 $t0 - $t7 $s0 - $s7 $t8 - $t9 $ra Código del registro 0 2–3 4–7 8 – 15 16 – 23 24 – 25 31 Uso Valor constante 0 Valores de retorno para las llamadas al sistema Argumentos para las llamadas al sistema Resultados temporales Valores que se quieren mantener a lo largo del programa Resultados temporales Dirección de retorno MODOS DE DIRECCIONAMIENTO Las instrucciones del MIPS R2000/R3000 principalmente utilizan registros y números a la hora de operar con los datos. A veces es necesario acceder a la memoria para encontrar los operandos. El procesador MIPS R2000/R3000 solo ofrece un modo de direccionamiento para el acceso a memoria: num(rx)con el que se obtiene una dirección sumando el contenido del registro rx y el valor inmediato num. El simulador permite otros modos de direccionamiento para el acceso a memoria. Estos modos solo se pueden utilizar con instrucciones que hagan referencia a una dirección. Formato (registro) num num (registro) Cálculo de la dirección La dirección está en el registro El valor inmediato representa una dirección La dirección es la suma del contenido del registro más el valor inmediato etiqueta La etiqueta indica la dirección etiqueta ± num La dirección se calcula sumándole num a la dirección que representa la etiqueta etiqueta ± num (registro) La dirección se calcula sumándole a la dirección que representa la etiqueta el contenido del registro y el valor inmediato num FORMATOS DE LAS INSTRUCCIONES DEL MIPS R2000/R3000 Tres son los diferentes formatos de instrucciones utilizados por el MIPS R2000/R3000. Formato tipo R: co 6 rs 5 rt 5 rd 5 desp 5 func 6 1 Fundamentos y Arquitectura de Computadores (ITTSE – UV) F. Micó En este formato las instrucciones sólo utilizan registros. Los campos que componen este formato de instrucciones son: • co: código de operación • rs: primera referencia a un registro fuente • rt: segunda referencia a un registro fuente • rd: referencia a un registro destino • desp: valor numérico utilizado en las instrucciones de desplazamiento • func: campo de función utilizado para seleccionar una variante del código de operación. Ejemplo: add $t0,$t1,$t2 0 000000 codificación: 0x012A4020 9 01001 10 01010 rs 5 rd 5 8 01000 0 00000 32 100000 Formato tipo I: co 6 num 16 En este formato las instrucciones utilizan dos registros y un número de 16 bits. Los campos que componen este formato de instrucciones son: • co: código de operación • rs: referencia a un registro fuente • rd: referencia a un registro destino • num: valor numérico Ejemplo: ori $t0,$t1,1 13 001101 codificación: 0x35280001 9 01001 8 01010 1 0000000000000001 Formato tipo J: co 6 etiqueta 26 Este formato solo se utiliza con instrucciones de salto incondicional. En este formato las instrucciones no utilizan ningún registro. Los campos que componen este formato de instrucciones son: • co: código de operación • etiqueta: nombre asignado a la dirección de la siguiente instrucción a ejecutar 2 Fundamentos y Arquitectura de Computadores (ITTSE – UV) F. Micó LAS LLAMADAS AL SISTEMA Cód. Servicio Argumentos servicio Escribir entero 1 $a0 = entero Escribir coma flotante 2 $f12 = coma flotante de simple precisión Escribir coma flotante 3 $f12 = coma flotante de doble precisión $a0 = dir a partir de la Escribir cadena 4 cual tenemos la cadena Pedir entero 5 Pedir coma flotante de 6 simple precisión Pedir coma flotante de 7 doble precisión $a0 = dir a partir de la cual se guardará la Pedir cadena 8 cadena, $a1 = longitud máxima permitida Terminar programa 10 DIRECTIVAS Directiva .align n .ascii “cad1”, … .asciiz “cad1”, … .byte b1,… .data [dir] .double d1, … .float f1, … .globl etiqueta .half h1, … .space n .text [dir] .word w1, … Valor devuelto $v0 = entero $f0 = coma flotante $f0 = coma flotante $v0 = longitud de la cadena introducida Uso Alinea los datos que siguen a la siguiente dirección múltiplo de 2n Guarda cadenas sin terminación nula Guarda cadenas con terminación nula en cada una de ellas Guarda valores enteros de 1 byte Todo lo que siga esta directiva se guarda como dato a partir de dir. Si no se especifica dir, por defecto dir = 0x10010000 Guarda valores de coma flotante de doble precisión Guarda valores de coma flotante de simple precisión Declara etiqueta como global para todos los archivos Guarda valores enteros de 2 bytes Reserva n bytes contiguos en la memoria Todo lo que siga esta directiva se guarda como instr. a partir de dir. Si no se especifica dir, por defecto dir = 0x00400000 Guarda valores enteros de 4 bytes TABLA ASCII 30 40 50 60 70 80 90 100 00 0 @ P ` p Ç 01 1 A Q a q ü 02 2 B R b r 03 3 C S c s 04 4 D T d t 05 5 E U e u 06 6 F V f v 07 7 G W g w 08 8 H X h x 09 9 I Y i y 0a : J Z j z 0b ; K [ k { 0c < L \ l | 0d = M ] m } 0e > N ^ n ~ 0f ¿ O _ o ⌂ æ é Æ â ô ä ö à ò å û ç ù ê ÿ ë Ö è Ü ï ø î £ ì Ø Ä × Å ƒ É á í ó ú ñ Ñ ª º ¿ ® ¬ ½ ¼ ¡ « » 3 Fundamentos y Arquitectura de Computadores (ITTSE – UV) F. Micó REPERTORIO DE INSTRUCCIONES UTILIZADO CON EL SIMULADOR PCSPIM Leyenda: R I J Ps Formato de instrucción tipo R Formato de instrucción tipo I Formato de instrucción tipo J Pseudoinstrucción Para las pseudoinstrucciones: rdest Como destino hay que utilizar un registro entero rori Como origen hay que utilizar un registro entero ori Como origen se puede utilizar un registro entero o un valor inmediato entero fdest Como destino hay que utilizar un registro de coma flotante Instrucción Tipo Campos Instrucciones con registros de propósito general enteros Sumas add rd, rs, rt R 0 rs rt rd addu rd, rs, rt R 0 rs rt rd addi rd, rs, num I 0x8 rs rd addiu rd, rs, num I 0x9 rs rd add rdest, rori1, ori2 Ps addu rdest, rori1, ori2 Ps Valor absoluto abs rdest, rori Ps Restas sub rd, rs, rt R 0 rs rt rd subu rd, rs, rt R 0 rs rt rd sub rdest, rori1, ori2 Ps subu rdest, rori1, ori2 Ps Comentarios 0 0 num num 0x20 0x21 rd = rs + rt (con signo) rd = rs + rt (sin signo) rd = rs + num (con signo) rd = rs + num (sin signo) rdest = rori1 + ori2 (con signo) rdest = rori1 + ori2 (sin signo) rdest = | rori | 0 0 0x22 0x23 rd = rs – rt (con signo) rd = rs – rt (sin signo) rdest = rori1 - ori2 (con signo) rdest = rori1 - ori2 (sin signo) 4 Fundamentos y Arquitectura de Computadores (ITTSE – UV) Instrucción Tipo Negación neg rdest, rori Ps Multiplicación mult rs, rt R multu rs, rt R mul rdest, rori1, ori2 Ps División div rs, rt R divu rs, rt R div rdest, rori1, ori2 Ps rem rdest, rori1, ori2 Ps Lógicas and rd, rs, rt R andi rd, rs, num I and rdest, rori1, ori2 Ps or rd, rs, rt R ori rd, rs, num I or rdest, rori1, ori2 Ps xor rd, rs, rt R xori rd, rs, num I xor rdest, rori1, ori2 Ps nor rd, rs, rt R not rdest, rori Ps Desplazamientos lógicos y rotación sll rd, rt, desp R sllv rd, rt, rs R F. Micó Campos Comentarios rdest = - rori 0 0 rs rs rt rt 0 0 0 0 0x18 0x19 hi = rs x rt 63-32 , lo = rs x rt 31-0 (con signo) hi = rs x rt 63-32 , lo = rs x rt 31-0 (sin signo) rdest = rori1 x ori2 0 0 rs rs rt rt 0 0 0 0 0x1a 0x1b lo = rs / rt , hi = rs % rt (con signo) lo = rs / rt , hi = rs % rt (sin signo) rdest = rori1 / ori2 rdest = rori1 % ori2 0 0xc rs rs rt rd rd 0 num 0x24 0 0xd rs rs rt rd rd 0 num 0x25 0 0xe rs rs rt rd rd 0 num 0x26 0 rs rt rd 0 0x27 rd = rs and rt rd = rs and num rdest = rori1 and ori2 rd = rs or rt rd = rs or num rdest = rori1 or ori2 rd = rs xor rt rd = rs xor num rdest = rori1 xor ori2 rd = rs nor rt rdest = not rori a la izquierda 0 0 rt 0 rs rt rd rd desp 0 0 0x4 rd = bits rt desplazados desp posiciones rd = bits rt desplazados rs posiciones 5 Fundamentos y Arquitectura de Computadores (ITTSE – UV) Instrucción Tipo sll rdest, rori1, ori2 Ps rol rdest, rori1, ori2 Ps Desplazamientos lógicos y rotación a la derecha srl rd, rt, desp R 0 0 srlv rd, rt, rs R 0 rs srl rdest, rori1, ori2 Ps ror rdest, rori1, ori2 Ps Desplazamientos aritméticos a la derecha sra rd, rt, desp R 0 0 srav rd, rt, rs R 0 rs sra rdest, rori1, ori2 Ps Comparaciones slt rd, rs, rt R 0 rs sltu rd, rs, rt R 0 rs slti rd, rs, num I 0xa rs sltiu rd, rs, num I 0xb rs seq rdest, rori1, ori2 Ps sge rdest, rori1, ori2 Ps sgeu rdest, rori1, ori2 Ps sgt rdest, rori1, ori2 Ps sgtu rdest, rori1, ori2 Ps sle rdest, rori1, ori2 Ps sleu rdest, rori1, ori2 Ps slt rdest, rori1, ori2 Ps sltu rdest, rori1, ori2 Ps sne rdest, rori1, ori2 Ps F. Micó Campos Comentarios rdest = bits rori1 desplazados ori2 posic. rdest = bits rori1 rotados ori2 posiciones rt rt rd rd desp 0 0x2 0x6 rd = bits rt desplazados desp posiciones rd = bits rt desplazados rs posiciones rdest = bits rori1 desplazados ori2 posic. rdest = bits rori1 rotados ori2 posiciones rt rt rd rd desp 0 0x3 0x7 rd = bits rt desplazados desp posiciones rd = bits rt desplazados rs posiciones rdest = bits rori1 desplazados ori2 posic. rt rt rd rd rd rd 0x2a 0x2b rd = 1 si rs < rt (con signo) rd = 1 si rs < rt (sin signo) rd = 1 si rs < num (con signo) rd = 1 si rs < num (sin signo) rdest = 1 si rori1 = ori2 rdest = 1 si rori1 ≥ ori2 (con signo) rdest = 1 si rori1 ≥ ori2 (sin signo) rdest = 1 si rori1 > ori2 (con signo) rdest = 1 si rori1 > ori2 (sin signo) rdest = 1 si rori1 ≤ ori2 (con signo) rdest = 1 si rori1 ≤ ori2 (sin signo) rdest = 1 si rori1 < ori2 (con signo) rdest = 1 si rori1 < ori2 (sin signo) rdest = 1 si rori1 ≠ ori2 0 0 num num 6 Fundamentos y Arquitectura de Computadores (ITTSE – UV) Instrucción Saltos incondicionales j etiqueta jal etiqueta jalr rs, rd jr rs b etiqueta Saltos condicionales beq rs, rt, etiqueta bgez rs, etiqueta bgtz rs, etiqueta blez rs, etiqueta bltz rs, etiqueta bne rs, rt, etiqueta beqz rori, etiqueta bge rori1,ori2, etiqueta bgeu rori1,ori2, etiqueta bgt rori1,ori2, etiqueta bgtu rori1,ori2, etiqueta ble rori1,ori2, etiqueta bleu rori1,ori2, etiqueta blt rori1,ori2, etiqueta bltu rori1,ori2, etiqueta bnez rori, etiqueta beq rori1,ori2,etiqueta bne rori1,ori2,etiqueta Tipo F. Micó Campos J J R R Ps 0x2 0x3 0 0 I I I I I I Ps Ps Ps Ps Ps Ps Ps Ps Ps Ps Ps Ps 0x4 0x1 0x7 0x6 0x1 0x5 rs rs 0 0 etiqueta etiqueta rd 0 0 0 rs rt offset rs 0x1 offset rs 0 offset rs 0 offset rs 0 offset rs rt offset (offset = etiqueta – posición actual) Comentarios 0x9 0x8 Salta a etiqueta Salta a etiqueta , $ra = dir. sig. instr. Salta a dir. en rs , rd = dir. instr. sig. Salta a dir. en rs Salta a etiqueta Salta a etiqueta si rs = rt Salta a etiqueta si rs ≥ 0 Salta a etiqueta si rs > 0 Salta a etiqueta si rs ≤ 0 Salta a etiqueta si rs < 0 Salta a etiqueta si rs ≠ rt Salta a etiqueta si rori = 0 Salta a etiqueta si rori1 ≥ ori2 (con signo) Salta a etiqueta si rori1 ≥ ori2 (sin signo) Salta a etiqueta si rori1 > ori2 (con signo) Salta a etiqueta si rori1 > ori2 (sin signo) Salta a etiqueta si rori1 ≤ ori2 (con signo) Salta a etiqueta si rori1 ≤ ori2 (sin signo) Salta a etiqueta si rori1 < ori2 (con signo) Salta a etiqueta si rori1 < ori2 (sin signo) Salta a etiqueta si rori ≠ 0 Salta a etiqueta si rori1 = ori2 Salta a etiqueta si rori1 ≠ ori2 7 Fundamentos y Arquitectura de Computadores (ITTSE – UV) Instrucción Tipo F. Micó Campos Comentarios Instrucciones de acceso a memoria lb rd, num(rs) I 0x20 rs rd num Carga 1 byte de dir = num + rs a rd (con) lbu rd, num(rs) I 0x24 rs rd num Carga 1 byte de dir = num + rs a rd (sin) sb rt, num(rs) I 0x28 rs rt num Almacena 1 byte de rt en dir = num + rs lh rd, num(rs) I 0x21 rs rd num Carga 2 bytes de dir = num + rs a rd (con) lhu rd, num(rs) I 0x25 rs rd num Carga 2 bytes de dir = num + rs a rd (sin) sh rt, num(rs) I 0x29 rs rt num Almacena 2 bytes de rt en dir = num + rs lw rd, num(rs) I 0x23 rs rd num Carga 4 bytes de dir = num + rs a rd sw rt, num(rs) I 0x2b rs rt num Almacena 4 bytes de rt en dir = num + rs (Nota: Se recuerda que el segundo operando se puede sustituir por cualquier modo de direccionamiento – En ese caso se están utilizando pseudoinstrucciones – ver tabla correspondiente) Transferencia de datos lui rd, num I 0xf 0 rd num Carga num en los bits más sign. de rd li rdest, num Ps Pone num en rdest la rdest, etiqueta Ps Pone la dirección etiqueta en rdest move rdest, rori Ps rdest = rori Otros syscall R 0 0 0 0 0 0xc Llamada al sistema nop R 0 0 0 0 0 0 Ninguna operación Instrucciones con registros de propósito general de coma flotante Aritméticas add.s fd, fs, ft R 0x11 0x10 ft fs fd add.d fd, fs, ft R 0x11 0x11 ft fs fd sub.s fd, fs, ft R 0x11 0x10 ft fs fd sub.d fd, fs, ft R 0x11 0x11 ft fs fd 0 0 1 1 fd = fs + ft (simple precisión) fd = fs + ft (doble precisión) fd = fs - ft (simple precisión) fd = fs - ft (doble precisión) 8 Fundamentos y Arquitectura de Computadores (ITTSE – UV) Instrucción mul.s fd, fs, ft mul.d fd, fs, ft div.s fd, fs, ft div.d fd, fs, ft neg.s fd, fs neg.d fd, fs abs.s fd, fs abs.d fd, fs Transferencia mov.s fd, fs mov.d fd, fs l.s fdest, dirección Tipo R R R R R R R R R R Ps l.d fdest,dirección Ps s.s fdest, dirección Ps s.d fdest, dirección Ps F. Micó 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x10 0x11 0x10 0x11 0x10 0x11 0x10 0x11 Campos ft fs ft fs ft fs ft fs 0 fs 0 fs 0 fs 0 fs 0x11 0x11 0x10 0x11 0 0 fs fs fd fd fd fd fd fd fd fd 2 2 3 3 7 7 5 5 fd fd 6 6 Comentarios fd = fs x ft (simple precisión) fd = fs x ft (doble precisión) fd = fs / ft (simple precisión) fd = fs / ft (doble precisión) fd = - fs (simple precisión) fd = - fs (doble precisión) fd = | fs | (simple precisión) fd = | fs | (doble precisión) fd = fs (simple precisión) fd = fs (doble precisión) Carga un número en coma flotante de simple precisión desde etiqueta al registro fdest Carga un número en coma flotante de doble precisión desde etiqueta al registro fdest Guarda a partir de etiqueta el número en coma flotante de simple precisión que hay en fdest Guarda a partir de etiqueta el número en coma flotante de doble precisión que hay en fdest 9