SlideShare une entreprise Scribd logo
1  sur  83
ISA Instruction Set Architecture Cecilia Hernández [email_address]
Estructura de un Sistema Computacional
Traduciendo y ejecutando un programa Programa C Programa en lenguaje ensamblador Cód. Objeto: módulo en lenguaje de máquina Cod. Objeto: Bibliotecas Cod. Ejecutable: Prog. Leng. Máquina Memoria Compilador Ensamblador Linker Loader
Interfaz HW/SW
Convenciones ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Qué es una instrucción? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ejecución de instrucción de máquina ,[object Object],[object Object],[object Object],[object Object],[object Object]
Arquitectura de Conjunto de Instrucciones ISA ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
MIPS ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Aplicaciones del procesador MIPS
Almacenamiento en MIPS
Registros MIPS ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Convención de uso de registros MIPS $0  zero  constante cero $1  at   reservado para ensamblador $2  v0  evaluación de expresiones  y $3  v1  resultados de funciones $4  a0   argumentos a funciones $5  a1 $6  a2 $7  a3 $8   t0  variables temporales respaldadas por función .   que invoca .   (función invocada puede   .   sobreescribir) $15   t7 $16   s0  temporales respaldados por .  función invocada .  (función que invoca no respalda) . $23   s7 $24  t8  temporales (adicionales) $25  t9 $26   k0  reservados para sistema operativo $27   k1 $28   gp  puntero a variables globales $29   sp  puntero a tope del stack $30  fp  puntero a base del stack $31   ra  dirección de retorno de función
MIPS=RISC = Arquitectura load/store ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ejemplo ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Programando en lenguaje  ensamblador ,[object Object],[object Object],[object Object],[object Object]
Tipos de instrucciones en MIPS ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Aritmética entera ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Notación en SPIM ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Instrucciones aritméticas en SPIM ,[object Object],# rd = rs - rt rd, rs, rt sub # rt = rs + immed rt, rs, immediato addi # rd = rs + rt rd, rs, rt add Comentarios Operandos Código Operación
Instrucciones aritméticas ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ejemplos Add $8,$9,$10 #$8=$9+$10 Add $t0,$t1,$t2 #$t0=$t1+$t2 Sub $s2,$s1,$s0 #$s2=$s1-$s0 Addi $a0,$t0,20 #$a0=$t0+20 Addi $a0,$t0,-20 #$a0=$t0-20 Addi $t0,$0,0 #clear $t0 Sub $t5,$0,$t5 #$t5 = -$t5
Instrucciones lógicas ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Movimiento entre registros ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Acceso a memoria ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Instrucciones load/store ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Algunas pseudoinstrucciones move $4, $5 # $4    $5 # or $4, $zero, $5 li $4, 100 # $4    100 # ori $4, $zero, 100 la $4, LABEL32 # $4    LABEL # lui $4, LABEL 16bsuperiores # ori $4, $4, LABEL 16binferiores bgt $4, CTE, LABEL # if ($4 > CTE) goto LABEL # slti $at, $4, CTE+1 # beq $at, $zero, LABEL
Ejemplo int a, b, acum; … acum = acum + a * b; # Dirección de memoria de ‘a’ en rótulo DIR_A # Dirección de memoria de ‘b’ en rótulo DIR_B # Dirección de memoria ‘acum’ en rótulo DIR_ACUM la $v0, DIR_A  # cargar dirección de a la $v1, DIR_B  # cargar dirección de b lw $t0, 0($v0)  # leer a lw $t1, 0($v1)  # leer b mul $t2, $t0, $t1  # t2 = a * b la $v2, DIR_ACUM # cargar dirección de acum lw $t3, 0($v2) # leer acum add $t3, $t3, $t2 # $t3 = acum + a * b sw $t3, 0($v2) # guardar acum 10 2 DIR_A DIR_B DIR_ACUM 50 Memoria $v0 $v1 $v2 $t0 $t1 $t2 $t3 1000 1012 10 2 20 1024 50 70 70 1000 1004 1008 1012 1016 1020 1024 a b acum
Ejemplo typedef struct { int x; int y; } coord; coord c1, c2; … int dist; dist = abs(c2.x – c1.x) +  abs(c2.y – c1.y); # Dirección de memoria de ‘c1’ en rótulo DIR_C1 # Dirección de memoria de ‘c2’ en rótulo DIR_C2 # Dirección de memoria de ‘dist’ en rótulo DIR_DIST la $v0, DIR_C1 # cargar dirección de c1 la $v1, DIR_C2  # cargar dirección de c2 lw $t0, 0($v0)  # leer c1.x lw $t1, 0($v1)  # leer c2.x sub $t2, $t1, $t0  # t2 = c2.x – c1.x abs $t3, $t2 # t3 = abs(c2.x – c1.x) lw $t0, 4($v0)  # leer c1.y lw $t1, 4($v1)  # leer c2.y sub $t2, $t1, $t0  # t2 = c2.y – c1.y abs $t4, $t2 # t4 = abs(c2.y – c1.y) add $t3, $t3, $t4 # t3 = abs(c2.x – c1.x) + #  abs(c2.y – c1.y) la $v0, DIR_DIST # cargar dirección de dist sw $t3, 0($v0) # dist = abs(c2.x – c1.x) + #  abs(c2.y – c1.y) c1.x c1.y c2.x c2.y Direcciones de memoria DIR_C1 DIR_C1 + 4 DIR_C2 DIR_C2 + 4 DIR_DIST dist Memoria
Ejecución condicional de  instrucciones ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Instrucciones ISA MIPS   ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Ejemplo: add $1, $2, $3 slt $4, $1, $0 # if $1 < $0 then $4 = 1 # else #4 = 0
Algunas instrucciones de  comparación ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Instrucciones de salto MIPS ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Instrucciones de transferencia de control ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Saltos ,[object Object],[object Object],[object Object],[object Object],[object Object]
Instrucciones de salto MIPS ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ejemplo Código assembly para el siguiente código C: int a = 10, b = 5; int c; … if (a > b) c = a – b; else c = b – a; c = c + 10; Compilador asigna: a    $t0 b    $t1 c    $t2 li $t0, 10 # a = 10 li $t1, 5 # b = 5 sle $t3, $t0, $t1 # a <= b ? bgtz $t3, ELSE # if a <= b goto ELSE sub $t2, $t0, $t1 # c = a - b j FIN_IF # goto FIN_IF ELSE: sub $t2, $t1, $t0 # c = b - a FIN_IF: addi $t2, $t2, 10 # c = c + 10
Ejemplo Código assembly para el siguiente código C: i = 0; sum = 0; do { sum = sum + a[i] * b[i]; i++; } while (i < 100) li $t0, 0 # i = 0; li $t1, 0 # $t1 = 0 (sum temporal) la $t2, SUM # $t2 = dirección de sum sw $t1, 0($t2) # sum = 0 LOOP: la $t3, A # $t3 = dirección a[0] la $t4, B # $t4 = dirección b[0] sll $t5, $t0, 2  # $t5 = i*4 add $t6, $t3, $t5  # $t6 = dirección a[i] lw $t7, 0($t6)  # $t7 = a[i] add $t6, $t4, $t5  # $t6 = dirección b[i] lw $t8, 0($t6)  # $t8 = b[i] mul, $t8, $t7, $t8  # $t8 = a[i]*b[i] add $t1, $t1, $t8  # $t1 = sum + a[i]*b[i] la $t2, SUM sw, $t1, 0($t2)  # sum = sum + a[i] * b[i] add $t0, $t0, 1  # i = i + 1 slti $t7, $t0, 100  # i < 100? bne $t7, $zero, LOOP Vectores a y b y variable sum comienzan a partir de direcciones de memoria indicadas por rótulos A, B y SUM.  Variable i asignada a registro $t0. ¿Posible optimizar código?
Ejemplo (optimizado) Código assembly para el siguiente código C: i = 0; sum = 0; do { sum = sum + a[i] * b[i]; i++; } while (i < 100) li $t0, 0 # i = 0; li $t1, 0 # $t1 = 0 (sum temporal) la $t3, A # $t3 = dirección a[0] la $t4, B # $t4 = dirección b[0] LOOP: add $t6, $t3, $t0  # $t6 = dirección a[i] lw $t7, 0($t6)  # $t7 = a[i] add $t6, $t4, $t0  # $t6 = dirección b[i] lw $t8, 0($t6)  # $t8 = b[i] mul, $t8, $t7, $t8  # $t8 = a[i]*b[i] add $t1, $t1, $t8  # $t1 = sum + a[i]*b[i] add $t0, $t0, 4  # i = i + 1 slti $t7, $t0, 400  # i < 100? bne $t7, $zero, LOOP la $t2, SUM sw, $t1, 0($t2)  # sum = sum + a[i] * b[i] Vectores a y b y variable sum comienzan a partir de direcciones de memoria indicadas por rótulos A, B y SUM.  Variable i asignada a registro $t0.
Otras instrucciones ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Tabla resumen Syscall
Ensamblador MIPS ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Rótulos ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],LOOP: add $4, $4, $2 j LOOP  CONST = 2 … li $5, CONST .globl MAIN RES: .word 5 … la $t0, RES lw $t1, 0($t0)
Mapa de memoria ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Algunas directivas al ensamblador .data Texto que sigue representa datos almacenados en el heap .text Texto que sigue representa instrucciones almacenadas en área de texto (código) .kdata Texto que sigue representa datos en área de datos del kernel (sistema operativo) .ktext Texto que sigue representa código en área de kernel .globl LABEL Rótulo LABEL es global (visible a todo el programa) .ascii str Almacenar string de texto str en ASCII sin un NULL al final .asciiz str Almacenar string de texto str en ASCII con un NULL (0) al final .word w1 … wn Almacenar n palabras (32b) en posiciones consecutivas de memoria .half h1 … hn Almacenar n medias palabras (16b) en posiciones consecutivas de memoria .byte b1 … bn Almacenar n bytes (8b) en posiciones consecutivas de memoria
Ejemplo .data TEXTOSINULL: .ascii “texto 1” TEXTOCONUL: .asciiz “texto 2” DATOS: .word 16 124 1000 .text .globl MAIN MAIN: la $8, TEXTOSINUL la $9, TEXTOCONUL la $10, DATOS lw $11, 0($10) lw $12, 4($10) lw $13, 8($10)
Procedimientos ,[object Object],[object Object],[object Object]
Protocolo Procedimientos/funciones ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ejemplo procedimiento simple int len; char[20] str; … len = strlen(str);  … int strlen(char *str) { int len = 0; while (*str != 0) { str = str + 1; len = len + 1; } return len; } la $a0, str # $a0 = str jal STRLEN; # resultado retorna en $v0 STRLEN: li $v0, 0 # len = 0 WHILE: lb $t0, 0($a0) # $t0 = *str beq $t0, $zero, FIN_WHILE # if (*str == 0) goto FIN_W addi $a0, $a0, 1 # str = str + 1 addi $v0, $v0, 1 # len = len + 1 b WHILE # goto WHILE FIN_W: jr $ra # return len Utilizar convención estándar de uso de registros MIPS
Otro ejemplo procedimiento int i; int a[100], b[100] … res = punto(a, b, 100); … int prod_punto(int v1[], int v2[], int n) { int i = 0; suma = 0; do { suma = suma + v1[i] * v2[i]; i++; } while (i < n) return suma; } la $a0, A # $a0 = &(a[0]) la $a1, B # $a1 = &(b[0]) li $a2, 100 # $a2 = 100 jal PUNTO # resultado en $v0 la $t0, RES sw $v0, 0($t0) … PUNTO: li $t0, 0 # i = 0 li $v0, 0 # suma = 0 WHILE: sll $t1, $t0, 2 # $t1 = i*4 add $t2, $a0, $t1 # $t2 = &(v1[i]) lw $t3, 0($t2) # $t3 = v1[i] add $t2, $a1, $t1 # $t2 = &(v2[i]) lw $t4, 0($t2)  # $t4 = v2[i] mult $t3, $t3, $t4 # $t3 = v1[i] * v2[i] add $v0, $v0, $t3 # suma = suma +… addi $t0, $t0, 1 # i = i + 1 slt $t3, $t0, $a2 # i < n? bne $t3, $zero, WHILE jr $ra
Qué hacer cuando los registros no son suficientes? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Datos locales y procedimientos recursivos ,[object Object],[object Object],PROC1: move $t0, $a0 … la $s0, PROC1_MEM sw $t0, 0($s0) sw $ra, 4($s0) jal PROC2 lw $t0, 0($s0) lw $ra, 4($s0) … jr $ra Ahora PROC2 puede sobreescribir $t0 y $ra sin problemas PROC1_MEM $t0 $ra Problema: ¿Qué pasa si PROC1 es recursivo? Direcciones de memoria
Procedimientos y stacks ,[object Object],[object Object],[object Object],[object Object],A A A A A B B B C A: call B B: call C C: ret ret … …
Stacks de memoria ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Soporte para stacks ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Argumentos Registros salvados  por el llamado Variables locales Evaluación de expresiones (dinámico) FP SP
Ejemplo: Cadena de llamados Estructura de código ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],p1 p2 p3 p3 p3 Cadena de llamados ,[object Object],p3
p1 • • • p1 Cadena de llamados ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Operación del stack Stack Pointer $sp Frame Pointer $fp
Operación del stack  p1 p2 • • • p1 p2 Cadena de llamados ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Stack Pointer $sp Frame Pointer $fp
Operación del stack p1 p2 p3 • • • p1 p2 p3 Cadena de llamados ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Stack Pointer $sp Frame Pointer $fp
Operación del stack p1 p2 p3 • • • p1 p2 p3 Cadena de llamados ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],p3 p3 Stack Pointer $sp Frame Pointer $fp
Operación del stack p1 p2 p3 • • • p1 p2 p3 Cadena de llamados ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],p3 p3 p3 p3 Stack Pointer $sp Frame Pointer $fp
Operación del stack p1 p2 p3 • • • p1 p2 p3 Cadena de llamados ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],p3 p3 amI Stack Pointer $sp Frame Pointer $fp
Operación del stack p1 p2 p3 • • • p1 p2 p3 Cadena de llamados ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],p3 p3 Stack Pointer $sp Frame Pointer $fp
Operación del stack p1 p2 • • • p1 p2 Call Chain ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],p3 p3 p3 Stack Pointer $sp Frame Pointer $fp
Operación del stack p1 p2 p3 • • • p1 p2 Cadena de llamados ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],p3 p3 p3 p3 Stack Pointer $sp Frame Pointer $fp
Operación del stack p1 p2 • • • p1 p2 Cadena de llamados ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],p3 p3 p3 p3 Stack Pointer $sp Frame Pointer $fp
Operación del stack ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],p1 • • • p1 p2 Cadena de llamados p3 p3 p3 p3 Stack Pointer $sp Frame Pointer $fp
Stack (Pila) de Programa ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Operación push ,[object Object],[object Object],[object Object],antes después 46 -72  ??? 46 -72 127   ??? 8($sp) 4($sp) $sp 12($sp) 8($sp) 4($sp) $ sp 127  $6 127  $6
Operación pop ,[object Object],[object Object],[object Object],antes 46 -72  127 46 -72 127  ??? 8($sp) 4($sp) $ sp 12($sp) 8($sp) 4($sp) $sp 127  $6 453  $6 Pasa a ser basura despúes
Requerimientos llamados a procedimiento ,[object Object],[object Object],[object Object],[object Object],[object Object]
Mecanismo ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Convención uso de registros Dirección de retorno de función $ra $31 Puntero a la base del stack (Frame Pointer) $fp $30 Puntero al tope del stack (Stack Pointer) $sp $29 Puntero al heap (segmento datos global) $gp $28 Reservados al O.S. $k0-$k1 $26-$27 Temporales no salvados al llamar función $t8-$t9 $24-$25 Temporales salvados al llamar función $s0-$s7 $16-$23 Temporales no salvados al llamar función $t0-$t7 $8-$15 Argumentos en llamada función $a0-$a3 $4-$7 Evaluación expresiones y resultado funciones $v0-$v1 $2-$3 Reservado para temporal del ensamblador $at $1 Cero $zero $0 Uso Nombre  Registro
Tareas del que llama y procedimiento llamado en CALL ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Tareas del que llama y procedimiento llamado en RETURN ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ejemplo de un CALL ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ejemplo RETURN ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ejemplo: Factorial recursivo int factorial(int n) { if (n == 0) return 1; else return n * factorial(n-1); } FACT: bne  $a0, $0, L1  # saltar si n != 0 li  $v0, 1  # retornar 1 jr  $ra L1:  addiu  $sp, $sp, -12  # tamaño del nuevo stack es 12 bytes sw  $fp, 0($sp)  # almacenar $fp en el stack sw  $ra, 4($sp)  # almacenar $ra en el stack addiu  $fp, $sp, 8  # $fp apunta al principio del stack sw  $a0, 0($fp)  # almacenar n en el stack addiu  $a0, $a0, -1  # n - 1 jal   FACT  # resultado en $v0 lw  $a0, 0($fp)  # recuperar n lw  $ra, 4($sp)  # recuperar direccion de retorno lw  $fp, 0($sp)  # recuperar $fp addiu  $sp, $sp, 12  # restaurar stack original $sp mul  $v0, $v0, $a0  # n * fact(n-1) jr  $ra Mostrar ejemplos usando fp y no usando fp, usando ConTEXT Ejercicio: hacer dibujo con marcos de activación y cadena de llamados
Excepciones ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Atención de excepciones ,[object Object],[object Object],[object Object],[object Object],[object Object]
Atención de excepciones en MIPS ,[object Object],[object Object],[object Object]
Registro Causa
Registro de estado ,[object Object],[object Object]

Contenu connexe

Tendances

Equipo 6 comparaciones
Equipo 6 comparacionesEquipo 6 comparaciones
Equipo 6 comparaciones
gabo
 
Lenguaje ensamblador del microprocesador
Lenguaje ensamblador del microprocesadorLenguaje ensamblador del microprocesador
Lenguaje ensamblador del microprocesador
smfch
 
Programacion Lenguaje Assembler 25 10 07
Programacion Lenguaje Assembler 25 10 07Programacion Lenguaje Assembler 25 10 07
Programacion Lenguaje Assembler 25 10 07
Carlos Pastorino
 

Tendances (20)

Sintaxis del lenguaje ensamblador
Sintaxis del lenguaje ensambladorSintaxis del lenguaje ensamblador
Sintaxis del lenguaje ensamblador
 
Clase10 2-lenguaje ensamblador
Clase10 2-lenguaje ensambladorClase10 2-lenguaje ensamblador
Clase10 2-lenguaje ensamblador
 
Equipo 6 comparaciones
Equipo 6 comparacionesEquipo 6 comparaciones
Equipo 6 comparaciones
 
Data segment
Data segmentData segment
Data segment
 
Curso básico de ensamblador
Curso básico de ensambladorCurso básico de ensamblador
Curso básico de ensamblador
 
Lenguaje ensamblador del microprocesador
Lenguaje ensamblador del microprocesadorLenguaje ensamblador del microprocesador
Lenguaje ensamblador del microprocesador
 
Arranque de Sistema Operativo con Assembler
Arranque de Sistema Operativo con AssemblerArranque de Sistema Operativo con Assembler
Arranque de Sistema Operativo con Assembler
 
Programacion Lenguaje Assembler 25 10 07
Programacion Lenguaje Assembler 25 10 07Programacion Lenguaje Assembler 25 10 07
Programacion Lenguaje Assembler 25 10 07
 
Ejercicios tema3
Ejercicios tema3Ejercicios tema3
Ejercicios tema3
 
Mars
MarsMars
Mars
 
Arquitectura resumen capitulos 5 y 6 efrain saransig
Arquitectura resumen capitulos 5 y 6 efrain saransigArquitectura resumen capitulos 5 y 6 efrain saransig
Arquitectura resumen capitulos 5 y 6 efrain saransig
 
Lenguaje ensamblador
Lenguaje ensambladorLenguaje ensamblador
Lenguaje ensamblador
 
Libreria c++
Libreria c++Libreria c++
Libreria c++
 
UNIDAD 2 PROGRAMACIÓN BASICA
UNIDAD 2 PROGRAMACIÓN BASICAUNIDAD 2 PROGRAMACIÓN BASICA
UNIDAD 2 PROGRAMACIÓN BASICA
 
Assembler
AssemblerAssembler
Assembler
 
Librerias Básicas y sus Funciones Lenguaje de Programación C
Librerias Básicas y sus Funciones Lenguaje de Programación CLibrerias Básicas y sus Funciones Lenguaje de Programación C
Librerias Básicas y sus Funciones Lenguaje de Programación C
 
bibliotecas c++
bibliotecas c++bibliotecas c++
bibliotecas c++
 
Lenguaje ensamblador
Lenguaje ensambladorLenguaje ensamblador
Lenguaje ensamblador
 
Uso de las clases iostream
Uso de las clases iostreamUso de las clases iostream
Uso de las clases iostream
 
Mis preguntas del blog y las ultimas .l.
Mis preguntas del blog y las ultimas .l.Mis preguntas del blog y las ultimas .l.
Mis preguntas del blog y las ultimas .l.
 

En vedette

Gioconda.Folleto Y Poemas
Gioconda.Folleto Y PoemasGioconda.Folleto Y Poemas
Gioconda.Folleto Y Poemas
Diver Bitácora
 
Periodismo
PeriodismoPeriodismo
Periodismo
minmaru
 
ئىنساننىڭ دىنغا مۇھتاج بولۇشى
ئىنساننىڭ دىنغا مۇھتاج  بولۇشىئىنساننىڭ دىنغا مۇھتاج  بولۇشى
ئىنساننىڭ دىنغا مۇھتاج بولۇشى
Abdullah Baspren
 

En vedette (20)

Accesibilidad DiM
Accesibilidad DiMAccesibilidad DiM
Accesibilidad DiM
 
Presentacion Corporacion Region
Presentacion Corporacion RegionPresentacion Corporacion Region
Presentacion Corporacion Region
 
Gioconda.Folleto Y Poemas
Gioconda.Folleto Y PoemasGioconda.Folleto Y Poemas
Gioconda.Folleto Y Poemas
 
AREVA, rapport semestriel 30 Juin 2008
AREVA, rapport semestriel 30 Juin 2008AREVA, rapport semestriel 30 Juin 2008
AREVA, rapport semestriel 30 Juin 2008
 
Les Flors
Les FlorsLes Flors
Les Flors
 
Periodismo
PeriodismoPeriodismo
Periodismo
 
p20 + m - Presentación de Noemí Pastor, Idoia Llano y María Salido
p20 + m  - Presentación de Noemí Pastor, Idoia Llano y María Salidop20 + m  - Presentación de Noemí Pastor, Idoia Llano y María Salido
p20 + m - Presentación de Noemí Pastor, Idoia Llano y María Salido
 
Charla a Consejo para la Transparencia, 27 de noviembre de 2013
Charla a Consejo para la Transparencia, 27 de noviembre de 2013Charla a Consejo para la Transparencia, 27 de noviembre de 2013
Charla a Consejo para la Transparencia, 27 de noviembre de 2013
 
Ana,Victor Y Dori Se Van(Por Ahora)
Ana,Victor  Y Dori Se Van(Por Ahora)Ana,Victor  Y Dori Se Van(Por Ahora)
Ana,Victor Y Dori Se Van(Por Ahora)
 
Marco general para el diseño de un plan de estudios. Grado de Ingeniería Info...
Marco general para el diseño de un plan de estudios. Grado de Ingeniería Info...Marco general para el diseño de un plan de estudios. Grado de Ingeniería Info...
Marco general para el diseño de un plan de estudios. Grado de Ingeniería Info...
 
ئىنساننىڭ دىنغا مۇھتاج بولۇشى
ئىنساننىڭ دىنغا مۇھتاج  بولۇشىئىنساننىڭ دىنغا مۇھتاج  بولۇشى
ئىنساننىڭ دىنغا مۇھتاج بولۇشى
 
Primera parte de los medios visuales
Primera parte de los medios visualesPrimera parte de los medios visuales
Primera parte de los medios visuales
 
Blogs en educación
Blogs en educaciónBlogs en educación
Blogs en educación
 
Primeras Jornadas de Profesores EOI
Primeras Jornadas de Profesores EOIPrimeras Jornadas de Profesores EOI
Primeras Jornadas de Profesores EOI
 
Mejor Pps 2008
Mejor Pps 2008Mejor Pps 2008
Mejor Pps 2008
 
Sincronizacion
SincronizacionSincronizacion
Sincronizacion
 
Trendzine elan012012
Trendzine elan012012 Trendzine elan012012
Trendzine elan012012
 
Riesgos laborales
Riesgos laboralesRiesgos laborales
Riesgos laborales
 
elearning Medicina Universidad de Alcalá
elearning Medicina Universidad de Alcaláelearning Medicina Universidad de Alcalá
elearning Medicina Universidad de Alcalá
 
Bac2006quelniveau
Bac2006quelniveauBac2006quelniveau
Bac2006quelniveau
 

Similaire à I S A

07-MIPSVHL CIRCUITOS TEORÍA ELECTRÓNICA DIGITAL.pdf
07-MIPSVHL CIRCUITOS TEORÍA ELECTRÓNICA DIGITAL.pdf07-MIPSVHL CIRCUITOS TEORÍA ELECTRÓNICA DIGITAL.pdf
07-MIPSVHL CIRCUITOS TEORÍA ELECTRÓNICA DIGITAL.pdf
LuisVargasVelazquez
 
Lenguaje ensamblador basico
Lenguaje ensamblador basicoLenguaje ensamblador basico
Lenguaje ensamblador basico
Gustavo Davila
 
Lenguajes de interfaz
Lenguajes de interfazLenguajes de interfaz
Lenguajes de interfaz
Xavi Flores
 
MODOS DE DIRECIONAMIENTO DE LA MEMORIA DE PROGRAMA
MODOS DE DIRECIONAMIENTO DE LA MEMORIA DE PROGRAMAMODOS DE DIRECIONAMIENTO DE LA MEMORIA DE PROGRAMA
MODOS DE DIRECIONAMIENTO DE LA MEMORIA DE PROGRAMA
gbermeo
 

Similaire à I S A (20)

07-MIPSVHL CIRCUITOS TEORÍA ELECTRÓNICA DIGITAL.pdf
07-MIPSVHL CIRCUITOS TEORÍA ELECTRÓNICA DIGITAL.pdf07-MIPSVHL CIRCUITOS TEORÍA ELECTRÓNICA DIGITAL.pdf
07-MIPSVHL CIRCUITOS TEORÍA ELECTRÓNICA DIGITAL.pdf
 
Lenguaje ensamblador basico
Lenguaje ensamblador basicoLenguaje ensamblador basico
Lenguaje ensamblador basico
 
Microcomputadoras al detalle
Microcomputadoras al detalleMicrocomputadoras al detalle
Microcomputadoras al detalle
 
Unidad 2 arquitectura del computador
Unidad 2 arquitectura del computadorUnidad 2 arquitectura del computador
Unidad 2 arquitectura del computador
 
asm_mododir2.pdf
asm_mododir2.pdfasm_mododir2.pdf
asm_mododir2.pdf
 
Asm mododir2
Asm mododir2Asm mododir2
Asm mododir2
 
Esamblador8086
Esamblador8086Esamblador8086
Esamblador8086
 
Mars
MarsMars
Mars
 
Unidad I.pdf
Unidad I.pdfUnidad I.pdf
Unidad I.pdf
 
Lenguajes de interfaz
Lenguajes de interfazLenguajes de interfaz
Lenguajes de interfaz
 
Unidadi. lenguajes de interfaz
Unidadi.   lenguajes de interfazUnidadi.   lenguajes de interfaz
Unidadi. lenguajes de interfaz
 
MODOS DE DIRECIONAMIENTO DE LA MEMORIA DE PROGRAMA
MODOS DE DIRECIONAMIENTO DE LA MEMORIA DE PROGRAMAMODOS DE DIRECIONAMIENTO DE LA MEMORIA DE PROGRAMA
MODOS DE DIRECIONAMIENTO DE LA MEMORIA DE PROGRAMA
 
Lenguaje ensamblador
Lenguaje ensambladorLenguaje ensamblador
Lenguaje ensamblador
 
Registros
RegistrosRegistros
Registros
 
Microporcesadores registro
Microporcesadores registroMicroporcesadores registro
Microporcesadores registro
 
Registros
RegistrosRegistros
Registros
 
Fundamento de computadores- Motorola 68000
Fundamento de computadores- Motorola 68000Fundamento de computadores- Motorola 68000
Fundamento de computadores- Motorola 68000
 
Generación código intermedio 2
Generación código intermedio 2Generación código intermedio 2
Generación código intermedio 2
 
Microcomputadoras al detalle
Microcomputadoras al detalleMicrocomputadoras al detalle
Microcomputadoras al detalle
 
Microcomputadoras al detalle
Microcomputadoras al detalleMicrocomputadoras al detalle
Microcomputadoras al detalle
 

Plus de Stefano Salvatori (20)

Salida a Volcán Copahue Febrero 2011
Salida a Volcán Copahue Febrero 2011Salida a Volcán Copahue Febrero 2011
Salida a Volcán Copahue Febrero 2011
 
Salida a Aguas Calientes abril 2011
Salida a Aguas Calientes abril 2011Salida a Aguas Calientes abril 2011
Salida a Aguas Calientes abril 2011
 
Sistema de capas
Sistema de capasSistema de capas
Sistema de capas
 
Enumeracion de Goedel
Enumeracion de GoedelEnumeracion de Goedel
Enumeracion de Goedel
 
Maquinas Abstractas
Maquinas AbstractasMaquinas Abstractas
Maquinas Abstractas
 
Intro
IntroIntro
Intro
 
Pipelining
PipeliningPipelining
Pipelining
 
C P U Uniciclo
C P U  UnicicloC P U  Uniciclo
C P U Uniciclo
 
Mips1
Mips1Mips1
Mips1
 
Exc Int
Exc IntExc Int
Exc Int
 
DesempeñO
DesempeñODesempeñO
DesempeñO
 
Mips
MipsMips
Mips
 
Memoria I
Memoria  IMemoria  I
Memoria I
 
Multiciclo
MulticicloMulticiclo
Multiciclo
 
Hebras
HebrasHebras
Hebras
 
Semaforos
SemaforosSemaforos
Semaforos
 
Planificacion Procesos Gral
Planificacion Procesos GralPlanificacion Procesos Gral
Planificacion Procesos Gral
 
Memoria Soporte Hw
Memoria Soporte HwMemoria Soporte Hw
Memoria Soporte Hw
 
Hebras En Accion
Hebras En AccionHebras En Accion
Hebras En Accion
 
Administracion de Memoria
Administracion de MemoriaAdministracion de Memoria
Administracion de Memoria
 

Dernier

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Dernier (11)

PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 

I S A

  • 1. ISA Instruction Set Architecture Cecilia Hernández [email_address]
  • 2. Estructura de un Sistema Computacional
  • 3. Traduciendo y ejecutando un programa Programa C Programa en lenguaje ensamblador Cód. Objeto: módulo en lenguaje de máquina Cod. Objeto: Bibliotecas Cod. Ejecutable: Prog. Leng. Máquina Memoria Compilador Ensamblador Linker Loader
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 12.
  • 13. Convención de uso de registros MIPS $0 zero constante cero $1 at reservado para ensamblador $2 v0 evaluación de expresiones y $3 v1 resultados de funciones $4 a0 argumentos a funciones $5 a1 $6 a2 $7 a3 $8 t0 variables temporales respaldadas por función . que invoca . (función invocada puede . sobreescribir) $15 t7 $16 s0 temporales respaldados por . función invocada . (función que invoca no respalda) . $23 s7 $24 t8 temporales (adicionales) $25 t9 $26 k0 reservados para sistema operativo $27 k1 $28 gp puntero a variables globales $29 sp puntero a tope del stack $30 fp puntero a base del stack $31 ra dirección de retorno de función
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22. Ejemplos Add $8,$9,$10 #$8=$9+$10 Add $t0,$t1,$t2 #$t0=$t1+$t2 Sub $s2,$s1,$s0 #$s2=$s1-$s0 Addi $a0,$t0,20 #$a0=$t0+20 Addi $a0,$t0,-20 #$a0=$t0-20 Addi $t0,$0,0 #clear $t0 Sub $t5,$0,$t5 #$t5 = -$t5
  • 23.
  • 24.
  • 25.
  • 26.
  • 27. Algunas pseudoinstrucciones move $4, $5 # $4  $5 # or $4, $zero, $5 li $4, 100 # $4  100 # ori $4, $zero, 100 la $4, LABEL32 # $4  LABEL # lui $4, LABEL 16bsuperiores # ori $4, $4, LABEL 16binferiores bgt $4, CTE, LABEL # if ($4 > CTE) goto LABEL # slti $at, $4, CTE+1 # beq $at, $zero, LABEL
  • 28. Ejemplo int a, b, acum; … acum = acum + a * b; # Dirección de memoria de ‘a’ en rótulo DIR_A # Dirección de memoria de ‘b’ en rótulo DIR_B # Dirección de memoria ‘acum’ en rótulo DIR_ACUM la $v0, DIR_A # cargar dirección de a la $v1, DIR_B # cargar dirección de b lw $t0, 0($v0) # leer a lw $t1, 0($v1) # leer b mul $t2, $t0, $t1 # t2 = a * b la $v2, DIR_ACUM # cargar dirección de acum lw $t3, 0($v2) # leer acum add $t3, $t3, $t2 # $t3 = acum + a * b sw $t3, 0($v2) # guardar acum 10 2 DIR_A DIR_B DIR_ACUM 50 Memoria $v0 $v1 $v2 $t0 $t1 $t2 $t3 1000 1012 10 2 20 1024 50 70 70 1000 1004 1008 1012 1016 1020 1024 a b acum
  • 29. Ejemplo typedef struct { int x; int y; } coord; coord c1, c2; … int dist; dist = abs(c2.x – c1.x) + abs(c2.y – c1.y); # Dirección de memoria de ‘c1’ en rótulo DIR_C1 # Dirección de memoria de ‘c2’ en rótulo DIR_C2 # Dirección de memoria de ‘dist’ en rótulo DIR_DIST la $v0, DIR_C1 # cargar dirección de c1 la $v1, DIR_C2 # cargar dirección de c2 lw $t0, 0($v0) # leer c1.x lw $t1, 0($v1) # leer c2.x sub $t2, $t1, $t0 # t2 = c2.x – c1.x abs $t3, $t2 # t3 = abs(c2.x – c1.x) lw $t0, 4($v0) # leer c1.y lw $t1, 4($v1) # leer c2.y sub $t2, $t1, $t0 # t2 = c2.y – c1.y abs $t4, $t2 # t4 = abs(c2.y – c1.y) add $t3, $t3, $t4 # t3 = abs(c2.x – c1.x) + # abs(c2.y – c1.y) la $v0, DIR_DIST # cargar dirección de dist sw $t3, 0($v0) # dist = abs(c2.x – c1.x) + # abs(c2.y – c1.y) c1.x c1.y c2.x c2.y Direcciones de memoria DIR_C1 DIR_C1 + 4 DIR_C2 DIR_C2 + 4 DIR_DIST dist Memoria
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37. Ejemplo Código assembly para el siguiente código C: int a = 10, b = 5; int c; … if (a > b) c = a – b; else c = b – a; c = c + 10; Compilador asigna: a  $t0 b  $t1 c  $t2 li $t0, 10 # a = 10 li $t1, 5 # b = 5 sle $t3, $t0, $t1 # a <= b ? bgtz $t3, ELSE # if a <= b goto ELSE sub $t2, $t0, $t1 # c = a - b j FIN_IF # goto FIN_IF ELSE: sub $t2, $t1, $t0 # c = b - a FIN_IF: addi $t2, $t2, 10 # c = c + 10
  • 38. Ejemplo Código assembly para el siguiente código C: i = 0; sum = 0; do { sum = sum + a[i] * b[i]; i++; } while (i < 100) li $t0, 0 # i = 0; li $t1, 0 # $t1 = 0 (sum temporal) la $t2, SUM # $t2 = dirección de sum sw $t1, 0($t2) # sum = 0 LOOP: la $t3, A # $t3 = dirección a[0] la $t4, B # $t4 = dirección b[0] sll $t5, $t0, 2 # $t5 = i*4 add $t6, $t3, $t5 # $t6 = dirección a[i] lw $t7, 0($t6) # $t7 = a[i] add $t6, $t4, $t5 # $t6 = dirección b[i] lw $t8, 0($t6) # $t8 = b[i] mul, $t8, $t7, $t8 # $t8 = a[i]*b[i] add $t1, $t1, $t8 # $t1 = sum + a[i]*b[i] la $t2, SUM sw, $t1, 0($t2) # sum = sum + a[i] * b[i] add $t0, $t0, 1 # i = i + 1 slti $t7, $t0, 100 # i < 100? bne $t7, $zero, LOOP Vectores a y b y variable sum comienzan a partir de direcciones de memoria indicadas por rótulos A, B y SUM. Variable i asignada a registro $t0. ¿Posible optimizar código?
  • 39. Ejemplo (optimizado) Código assembly para el siguiente código C: i = 0; sum = 0; do { sum = sum + a[i] * b[i]; i++; } while (i < 100) li $t0, 0 # i = 0; li $t1, 0 # $t1 = 0 (sum temporal) la $t3, A # $t3 = dirección a[0] la $t4, B # $t4 = dirección b[0] LOOP: add $t6, $t3, $t0 # $t6 = dirección a[i] lw $t7, 0($t6) # $t7 = a[i] add $t6, $t4, $t0 # $t6 = dirección b[i] lw $t8, 0($t6) # $t8 = b[i] mul, $t8, $t7, $t8 # $t8 = a[i]*b[i] add $t1, $t1, $t8 # $t1 = sum + a[i]*b[i] add $t0, $t0, 4 # i = i + 1 slti $t7, $t0, 400 # i < 100? bne $t7, $zero, LOOP la $t2, SUM sw, $t1, 0($t2) # sum = sum + a[i] * b[i] Vectores a y b y variable sum comienzan a partir de direcciones de memoria indicadas por rótulos A, B y SUM. Variable i asignada a registro $t0.
  • 40.
  • 42.
  • 43.
  • 44.
  • 45. Algunas directivas al ensamblador .data Texto que sigue representa datos almacenados en el heap .text Texto que sigue representa instrucciones almacenadas en área de texto (código) .kdata Texto que sigue representa datos en área de datos del kernel (sistema operativo) .ktext Texto que sigue representa código en área de kernel .globl LABEL Rótulo LABEL es global (visible a todo el programa) .ascii str Almacenar string de texto str en ASCII sin un NULL al final .asciiz str Almacenar string de texto str en ASCII con un NULL (0) al final .word w1 … wn Almacenar n palabras (32b) en posiciones consecutivas de memoria .half h1 … hn Almacenar n medias palabras (16b) en posiciones consecutivas de memoria .byte b1 … bn Almacenar n bytes (8b) en posiciones consecutivas de memoria
  • 46. Ejemplo .data TEXTOSINULL: .ascii “texto 1” TEXTOCONUL: .asciiz “texto 2” DATOS: .word 16 124 1000 .text .globl MAIN MAIN: la $8, TEXTOSINUL la $9, TEXTOCONUL la $10, DATOS lw $11, 0($10) lw $12, 4($10) lw $13, 8($10)
  • 47.
  • 48.
  • 49. Ejemplo procedimiento simple int len; char[20] str; … len = strlen(str); … int strlen(char *str) { int len = 0; while (*str != 0) { str = str + 1; len = len + 1; } return len; } la $a0, str # $a0 = str jal STRLEN; # resultado retorna en $v0 STRLEN: li $v0, 0 # len = 0 WHILE: lb $t0, 0($a0) # $t0 = *str beq $t0, $zero, FIN_WHILE # if (*str == 0) goto FIN_W addi $a0, $a0, 1 # str = str + 1 addi $v0, $v0, 1 # len = len + 1 b WHILE # goto WHILE FIN_W: jr $ra # return len Utilizar convención estándar de uso de registros MIPS
  • 50. Otro ejemplo procedimiento int i; int a[100], b[100] … res = punto(a, b, 100); … int prod_punto(int v1[], int v2[], int n) { int i = 0; suma = 0; do { suma = suma + v1[i] * v2[i]; i++; } while (i < n) return suma; } la $a0, A # $a0 = &(a[0]) la $a1, B # $a1 = &(b[0]) li $a2, 100 # $a2 = 100 jal PUNTO # resultado en $v0 la $t0, RES sw $v0, 0($t0) … PUNTO: li $t0, 0 # i = 0 li $v0, 0 # suma = 0 WHILE: sll $t1, $t0, 2 # $t1 = i*4 add $t2, $a0, $t1 # $t2 = &(v1[i]) lw $t3, 0($t2) # $t3 = v1[i] add $t2, $a1, $t1 # $t2 = &(v2[i]) lw $t4, 0($t2) # $t4 = v2[i] mult $t3, $t3, $t4 # $t3 = v1[i] * v2[i] add $v0, $v0, $t3 # suma = suma +… addi $t0, $t0, 1 # i = i + 1 slt $t3, $t0, $a2 # i < n? bne $t3, $zero, WHILE jr $ra
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73. Convención uso de registros Dirección de retorno de función $ra $31 Puntero a la base del stack (Frame Pointer) $fp $30 Puntero al tope del stack (Stack Pointer) $sp $29 Puntero al heap (segmento datos global) $gp $28 Reservados al O.S. $k0-$k1 $26-$27 Temporales no salvados al llamar función $t8-$t9 $24-$25 Temporales salvados al llamar función $s0-$s7 $16-$23 Temporales no salvados al llamar función $t0-$t7 $8-$15 Argumentos en llamada función $a0-$a3 $4-$7 Evaluación expresiones y resultado funciones $v0-$v1 $2-$3 Reservado para temporal del ensamblador $at $1 Cero $zero $0 Uso Nombre Registro
  • 74.
  • 75.
  • 76.
  • 77.
  • 78. Ejemplo: Factorial recursivo int factorial(int n) { if (n == 0) return 1; else return n * factorial(n-1); } FACT: bne $a0, $0, L1 # saltar si n != 0 li $v0, 1 # retornar 1 jr $ra L1: addiu $sp, $sp, -12 # tamaño del nuevo stack es 12 bytes sw $fp, 0($sp) # almacenar $fp en el stack sw $ra, 4($sp) # almacenar $ra en el stack addiu $fp, $sp, 8 # $fp apunta al principio del stack sw $a0, 0($fp) # almacenar n en el stack addiu $a0, $a0, -1 # n - 1 jal FACT # resultado en $v0 lw $a0, 0($fp) # recuperar n lw $ra, 4($sp) # recuperar direccion de retorno lw $fp, 0($sp) # recuperar $fp addiu $sp, $sp, 12 # restaurar stack original $sp mul $v0, $v0, $a0 # n * fact(n-1) jr $ra Mostrar ejemplos usando fp y no usando fp, usando ConTEXT Ejercicio: hacer dibujo con marcos de activación y cadena de llamados
  • 79.
  • 80.
  • 81.
  • 83.