Lenguaje ensamblador del DLX • • • • El procesador DLX Modos de direccionamiento Formato de instrucciones Instrucciones DLX – – – – • • • Transferencia de datos Aritméticas y lógicas Saltos y bifurcaciones Operaciones en punto flotante Sintaxis del ensamblador Directivas del ensamblador Ejemplo de programa en ensamblador Estructura de Computadores (FI: 2º II) Ensamblador DLX 1 El procesador DLX • Diseñado con filosofía RISC – – – – Arquitectura de carga/almacenamiento Repertorio de instrucciones sencillo Diseño de la segmentación eficiente Instrucciones fáciles de implementar en hardware: Instrucciones de longitud fija y pocos modos de direccionamiento – Eficiencia como objeto del compilador – Incluir en el hardware todo aquello que no sea rentable hacerlo en software • Registros – 32 registros de propósito general (GPRs) de 32 bits • R0, R1, ... R31; el valor de R0 siempre es cero – 32 registros de punto flotante (FPR) • F0,F1,.... F31: 32 registros de 32 bits en simple precisión • F0, F2,... F30: 16 registros de 64 bits en doble precisión (parejas par-impar) – Registros especiales para acceder a información sobre el estado • Flags (indicadores) de cero: FPSR (flag de cero • Pueden transferirse a y desde registros enteros Estructura de Computadores (FI: 2º II) Ensamblador DLX 2 El procesador DLX • Direcciones de memoria de 32 bits – Modelo de memoria “BIG-ENDIAN” • Tamaño de las transferencias de datos – Entre GPRs y memoria • 8, 16 y 32 bits – Entre FPRs y memoria • 32 y 64 bits • Datos e instrucciones alineados en memoria – La dirección de memoria donde se ubica un dato ha de ser múltiplo de su tamaño. Objeto Bien alineado Mal alineado Byte 0,1,2,3,4,5,6,.. (nunca) Media palabra 0,2,4,6,8, ... 1,3,5,7, ... Palabra (4 bytes) 0,4,8,... 1,2,3,5,6,7,9,10,11,... Doble palabra 0,8, .. 1,2,3,4,5,6,7,9,10,11,12,13,14,15,.... Estructura de Computadores (FI: 2º II) Ensamblador DLX 3 El procesador DLX • Estructura segmentada – Etapa IF • Búsqueda de instrucción – Etapa ID • Decodificación de la instrucción y lectura de registros – Etapa EX • Ejecución: Operación o cálculo de dirección efectiva • Unidades funcionales: – intEX: Unidad principal entera » Carga-almacenamiento, operaciones enteras (excepto multiplicación y división) y saltos – faddEX: Sumador FP – fmulEX: Multiplicador FP y entero – fdivEX: Divisor FP y entero – Etapa MEM • Carga o almacenamiento de datos en memoria – Etapa WB • Almacenamiento de resultados en registros. Se realizan en la primera mitad del ciclo de reloj. La instrucción que está en la etapa de ID puede leer estos datos en la segunda mitad del ciclo. Estructura de Computadores (FI: 2º II) Ensamblador DLX 4 Modos de direccionamiento • Para DATOS: – Registro-registro (R-R) • add r1,r2,r3 – Inmediato (R-I) • addi r1,r3,#5 – Registro base + desplazamiento (R-I) • lw • r1, inm16(reg) Para CÓDIGO: – Relativo al contador de programa (PC) • beq • j r1,r2,loop ; desplazamiento en 16 bits (especifica bytes) dirección ; desplazamientos de 26 bits (especifica bytes) – Indirecto por registro • jr • jalr r2 r5 Estructura de Computadores (FI: 2º II) Ensamblador DLX 5 Formato de las instrucciones Sólo tres tipos de formatos: • Formato R: add rd,rs1,rs2 op 6 bits 000000 rs1 5 bits 01010 rs2 5 bits 11111 rd 5 bits 00011 func 11 bits 00000 Instrucciones tipo R Todas las instrucciones DLX de 32 bits 100000 0x015f1820 add R3,R10,R31 Codifica: Operaciones de ALU registro-registro: rd <- rs1 op rs2; el campo de “func” codifica la operación a realizar por el camino de datos: add, sub, .... • Formato I: lw rd,inmediato(rs1) op 6 bits 100011 rs1 5 bits rd 5 bits Inmediato 16 bits 00011 00101 0000000000100000 Instruciones de carga e inmediatas Todas las instrucciones DLX de 32 bits 0x8c650020 lw $5,32($3) Codifica: carga y almacenamiento de bytes, palabras y medias palabras; todos los inmediatos ( rd <- rs1 op inmediato); saltos condicionales (rs1 es el registro, rd no usado); saltos indirectos por registro “jr” y salta y enlaza por registro “jalr” (rd=0; rs1 =destino; inmediato=0) • Formato J: j dirección op 6 bits 000010 Dirección objetivo 26 bits 11111111111111111111110100 Instrucciones de bifurcación Todas las instrucciones DLX de 32 bits 0x0bfffff4 0x10c: j 0x100 Bifurcación “j” y bifurcación y enlace “jal”; trap y retorno de excepción Estructura de Computadores (FI: 2º II) Ensamblador DLX 6 Instrucciones DLX: Transferencias de datos • • • • • • • • • • • • • • • • • • LB Rd,Adr LBU Rd,Adr LH Rd,Adr LHU Rd,Adr LW Rd,Adr LF Fd,Adr LD Dd,Adr SB Adr,Rs SH Adr,Rs SW Adr,Rs SF Adr,Fs SD Adr,Fs MOVI2FP Fd,Rs MOVI2FP Rd,Fs MOVF Fd,Fs MOVD Dd,Ds MOVI2S SR,Rs MOVS2I Rs,SR Estructura de Computadores (FI: 2º II) Load byte (sign extension) Load byte (unsigned) Load halfword (sign extension) Load halfword (unsigned) Load word Load single-precision Floating point Load double-precision Floating point Store byte tore halfword Store word Store single-precision Floating point Store double-precision Floating point Move 32 bits from integer registers to FP registers Move 32 bits from FP registers to integer registers Copy one Floating point register to another register Copy a double-precision pair to another pair Copy a register to a special register (not implemented!) Copy a special register to a GPR ( not implemented!) Ensamblador DLX 7 Instrucciones DLX: Carga-almacenamiento Estructura de Computadores (FI: 2º II) Ensamblador DLX 8 Instrucciones DLX: Aritméticas • ADD Rd,Ra,Rb Add • • ADDI Rd,Ra,Imm ADDU Rd,Ra,Rb Add immediate (all immediates are 16 bits) Add unsigned • ADDUI Rd,Ra,Imm Add unsigned immediate • SUB Rd,Ra,Rb Subtract • SUBI Rd,Ra,Imm Subtract immediate • SUBU Rd,Ra,Rb Subtract unsigned • SUBUI Rd,Ra,Imm Subtract unsigned immediate • MULT Rd,Ra,Rb Multiply signed • • MULTU Rd,Ra,Rb DIV Rd,Ra,Rb Multiply unsigned Divide signed • DIVU Rd,Ra,Rb Divide unsigned Estructura de Computadores (FI: 2º II) Ensamblador DLX 9 Instrucciones DLX: Lógicas • • • • • • • • • • • • • • • • • • AND Rd,Ra,Rb ANDI Rd,Ra,Imm OR Rd,Ra,Rb ORI Rd,Ra,Imm XOR Rd,Ra,Rb XORI Rd,Ra,Imm LHI Rd,Imm SLL Rd,Rs,Rc SRL Rd,Rs,Rc SRA Rd,Rs,Rc SLLI Rd,Rs,Imm SRLI Rd,Rs,Imm SRAI Rd,Rs,Imm S__ Rd,Ra,Rb S__I Rd,Ra,Imm S__U Rd,Ra,Rb S__UI Rd,Ra,Imm NOP Estructura de Computadores (FI: 2º II) And And immediate Or Or immediate Xor Xor immediate LOad high immediate Shift left logical Shift right logical Shift right arithmetic Shift left logical 'immediate' bits Shift right logical 'immediate' bits Shift right arithmetic 'immediate' bits Set conditional : "__" may be EQ, NE, LT, GT, LE or GE Set conditional immediate: "__" ídem de ídem Set conditional unsigned: "__" ídem de ídem Set conditional unsig. immediate: "__" ídem de ídem No operation Ensamblador DLX 10 Instrucciones DLX: Control • • • BEQZ Rt,Dest BNEZ Rt,Dest BFPT Dest • BFPF Dest • • • • • • J Dest JR Rx JAL Dest JALR Rx TRAP Imm RFE Dest Branch if GPR equal to zero; 16-bit offset from PC Branch if GPR not equal to zero; 16-bit offset from PC Test comparison bit in the FP status register (true) and branch; 16-bit offset from PC Test comparison bit in the FP status register (false) and branch; 16-bit offset from PC Jump: 26-bit offset from PC Jump: target in register Jump and link: save PC+4 to R31; target is PC-relative Jump and link: save PC+4 to R31; target is a register Transfer to operating system at a vectored address ; see Traps. Return to user code from an execption; restore user mode (not mplemented!) Estructura de Computadores (FI: 2º II) Ensamblador DLX 11 Instrucciones DLX: Punto flotante • • • • • • • • • • • • • • • ADDD Dd,Da,Db ADDF Fd,Fa,Fb SUBD Dd,Da,Db SUBF Fd,Fa,Fb MULTD Dd,Da,Db MULTF Fd,Fa,Fb DIVD Dd,Da,Db DIVF Fd,Fa,Fb CVTF2D Dd,Fs CVTD2F Fd,Ds CVTF2I Fd,Fs CVTI2F Fd,Fs CVTD2I Fd,Ds CVTI2D Dd,Fs __D Da,Db • __F Fa,Fb Estructura de Computadores (FI: 2º II) Add double-precision numbers Add single-precision numbers Subtract double-precision numbers Subtract single -precision numbers. Multiply double-precision Floating point numbers Multiply single-precision Floating point numbers Divide double-precision Floating point numbers Divide single-precision Floating point numbers Converts from type single-precision to type double-precision Converts from type double-precision to type single-precision Converts from type single-precision to type integer Converts from type integer to type single-precision Converts from type double-precision to type integer Converts from type integer to type double-precision Double-precision compares: "__" may be EQ, NE, LT, GT, LE or GE; sets comparison bit in FP status register Single-precision compares: "__" may be EQ, NE, LT, GT, LE or GE; sets comparison bit in FP status register Ensamblador DLX 12 Sintaxis del ensamblador • Líneas de comentarios – Todo lo que haya a partir del simbolo “;” hasta el final de línea se ignora. • Directivas – Secuencia de caracteres, (_) y (.) que no empiezan por un número. • Etiquetas – Se declaran colocándolas al principio de línea y terminadas en (:). • Número decimales y hexadecimales – Números en base 10 por defecto. – Hexadecimales o en base 16 precedidos por 0x. • Cadenas o strings – Las cadenas están encerradas entre dos comillas (“). – Caracteres especiales: • \n • \t • \” Nueva línea Tab Comillas Estructura de Computadores (FI: 2º II) Ensamblador DLX 13 Directivas del ensamblador • .align n • .ascii "string1","..." • .asciiz "string1","..." • .byte byte1,byte2,... • .data [address] • .double number1,... • .global label • .space size • .text [address] • .word word1,word2,... Estructura de Computadores (FI: 2º II) Ensamblador DLX 14 Ejemplo Prompt: PrintfFormat: PrintfPar: PrintfValue: main: ; ;;;;; Finish: .data .asciiz .asciiz .align .word .space "An integer value >1 : " "Factorial = %g\n\n" 2 PrintfFormat 8 .text .global main ;*** Read value from stdin into R1 addi r1,r0,Prompt jal InputUnsigned ;*** write result to stdout sd PrintfValue,f2 addi r14,r0,PrintfPar trap 5 ;*** end trap 0 Estructura de Computadores (FI: 2º II) Ensamblador DLX 15