Professional Documents
Culture Documents
Sw
Fw y Hw
Seccin de Datos
Interfaz HW/SW
swap (int v[], int k) { int tmp; tmp=v[k]; v[k]=v[k+1]; v[k+1]=tmp; Programa Assembler } swap: muli $2,$5,4 add $2,$4,$2 lw $15,0($2) Compilador C lw $16,4($2) sw $16,0($2) sw $15,4($2) Programa Lenguaje Mquina jr $31 000100 00101 00010 0000000000000100
000000 100011 100011 101011 101011 000000 00100 00010 00010 00010 00010 11111 00010 01111 10000 10000 01111 00000
Programa C
Ensamblador
00010 00000 000001 0000000000000000 0000000000000100 0000000000000000 0000000000000100 00000 00000 001000
Convenciones
UNIX
MS-DOS
P.c : archivo fuente en lenguaje C P.s : archivo fuente en lenguaje ensamblador P.o : archivo objeto P.a : biblioteca estticamente linkeada P.so : biblioteca dinmicamente linkeada a.out : archivo ejecutable por defecto
P.C : archivo fuente en lenguaje C P.ASM : archivo fuente en lenguaje ensamblador P.OBJ : archivo objeto P.LIB : biblioteca estaticamente linkeada P.DLL : biblioteca dinmicamente linkeada P.EXE: archivo ejecutable
Qu es una instruccin?
Donde se encuentran los operandos necesarios para ejecutar la operacin Cdigo de operacin Cuntos operandos son necesarios, tipos, tamaos, ubicacin Registros (enteros, punto flotante, PC) Direccin de memoria Constantes
Operandos
CPU ejecuta instrucciones de un programa ciclo Instrucciones especifican operaciones sobre operandos y generan resultados Datos pueden encontrarse en memoria (RAM, ROM) o en registros internos al procesador Instrucciones pueden tambin modificar el flujo de control (saltos, llamadas a procedimiento) Instrucciones pueden crear excepciones
Leer Instruccin
Decodificar
Leer Operandos
Ejecutar Instruccin
Almacenar Resultados
Visin del programador de bajo nivel o del compilador Elementos que definen la ISA
Operaciones (instrucciones)
suma, multiplicacin, saltos, entrada/salida Entero, punto flotante, strings 0,1,2,3 operandos, residentes en memoria o registros internos Complemento a 2, punto flotante IEEE
Tipos de datos
MIPS
Parti como proyecto de investigacin en Stanford y luego form compaa MIPS, que posteriormente compr Silicon Graphics Proviene de mquinas DEC MIPS es RISC Actualmente usados en mercados de sistemas encrustrados o embebidos
Routers CISCO, modems cable (modula seales de comunicacin sobre infraestructura de TV cable), impresoras laser, Sony playstation 2, computadores handheld http://www.mips.com/content/Markets/MIPSBased/content_html
Almacenamiento en MIPS
CPU $0 $1 . . . $31 HI LO PC ALU Coprocesador 1 $f0 $f1 . . . $f31 Mult/Div Enteros Aritmtica FP
Memoria
Registros MIPS
Aritmtica entera y lgica clculo de direcciones, operaciones de propsito especfico como Puntero al Stack (pila)
Un banco de registros punto flotante. Registros de 32 bits direccionados $f1, $f2,$f31 usados para aritmtica punto flotante 2 registros de 32 bits (HI, LO) usados para multiplicacin y divisin Un registro Contador de Programas (PC) Registro de estado (coprocesador 0) almacena causa de excepcin datos relacionados a excepcin
$4 $5 $6 $7 $8 . . .
a0 a1 a2 a3 t0
argumentos a funciones
$26 k0 $27 k1 variables temporales respaldadas por funcin que invoca (funcin invocada puede sobreescribir) $28 gp $29 sp $30 fp $31 ra
puntero a variables globales puntero a tope del stack puntero a base del stack direccin de retorno de funcin
$15 t7
A excepcin de enteros pequeos que pueden estar en la misma instruccin, como se ver ms adelante (caso de instrucciones con componente immediato) Implica que variables deben estar loaded en registros (si vienen de la memoria) antes de ejecutar otro tipo de instrucciones
Las nicas instrucciones que accesan la memoria son del tipo load/store
Se necesitan instrucciones explcitas para realizar operaciones de load y store Resultados obtenidos de otras operaciones deben ser stored en memoria
Ejemplo
x=y+z w=x+y
load y en registro ry load z en registro rz rx <- ry + rz store rx en x, no borra el resultado en rx rt <- rx + ry store rt en w
Usar muchos comentarios para describir lo que se esta haciendo Usar words en lugar de bytes en lo posible La siguiente direccin a dato expresado en words es direccin + 4 Direcciones de words son divisibles por 4
Aritmticas
Operaciones con enteros (con y sin signo) Operaciones con punto flotante Ands, ors, entre otros Desplazamiento de bits (izquierda, derecha) Variables son cargadas en registros (load)
Lgicas y de desplazamiento
Load/store
Aritmtica entera
Nmeros pueden ser con o sin signo Instrucciones aritmticas (+,-,/,*) existen para ambos tipos de enteros (diferenciado por cdigo de operacin)
add, addu, sub, subu addi, addiu, subi, subiu mult, multu, div, divu
Notacin en SPIM
Cdigo operacin
rd, rs, rt
rt, rs, immediato
Instrucciones aritmeticas, lgicas, comparaciones Instrucciones aritmticas, lgicas, load/store, saltos condicionales
Cdigo operacin
Cdigo operacin
immediato
Instrucciones de salto absoluto rd siempre es el registro destino rs siempre es el registro fuente (de slo lectura) rt puede ser fuente o destino depende del cdigo de operacin Immediato es una constante de 16 bits (con o sin signo)
Donde:
addi
# rt = rs + immed
sub
rd, rs, rt
# rd = rs - rt
Instrucciones aritmticas
add $1,$2,$3 sub $1,$2,$3 addi $1,$2,100 addu $1,$2,$3 subu $1,$2,$3 addiu $1,$2,100 mult $2,$3 multu$2,$3 div $2,$3 divu $2,$3 abs $1, $2 #$1 = $2 + $3. Posible overflow #$1 = $2 $3. Posible overflow #$1 = $2 + 100. Posible overflow #$1 = $2 + $3. Suma sin signo sin overflow #$1 = $2 $3. Resta sin signo sin overflow #$1 = $2 + 100. Suma sin signo sin overflow #HI, LO = $2 x $3 #HI, LO = $2 x $3. Producto sin signo #LO = $2 $3 (cuociente) #HI = $2 mod $3 (resto) #LO = $2 $3 (cuociente sin signo) #HI = $2 mod $3 (resto) #$1 = |$2|. Valor absoluto
Ejemplos
Add Add Sub
Addi Addi Addi Sub
Instrucciones lgicas
and $1,$2,$3 or $1,$2,$3 xor $1,$2,$3 nor $1,$2,$3 andi $1,$2,10 ori $1,$2,10 xori $1, $2,10 sll $1,$2,10 srl $1,$2,10 sra $1,$2,10 sllv $1,$2,$3 srlv $1,$2, $3 srav $1,$2, $3 #$1 = $2 && $3 #$1 = $2 || $3 #$1 = ~($2 || $3) #$1 = ~($2 || $3) #$1 = $2 && 10 #$1 = $2 || 10 #$1 = ~$2 && ~10 #$1 = $2 << 10. Desplazamiento lgico #$1 = $2 >> 10. Desplazamiento lgico #$1 = $2 >> 10. Desplazamiento aritmtico #$1 = $2 << $3. Desplazamiento lgico #$1 = $2 >> $3. Desplazamiento lgico #$1 = $2 >> $3. Desplazamiento aritmtico
Acceso a memoria
Store
lw rt,rs,offset sw $1, 100($2)
Instrucciones load/store
sw $3, 500($2) sh $3, 500($2) sb $3, 500($2) lw $3, 500($2) lh $3, 500($2) lhu $3, 500($2) lb $3, 500($2) la $3, Label # Mem(500+$2) $3. Almacena 32b # Mem(500+$2) $3. Almacena 16b # Mem(500+$2) $3. Almacena 8b # $3 Mem(500+$2). Carga 32b # $3 Mem(500+$2). Carga 16b # $3 Mem(500+$2). # Carga 16b sin signo # $3 Mem(500+$2). Carga 8b
# $3 Address. Carga la direccin # efectiva asociada a Label en $3 Direccin efectiva: nmero que indica direccin del operando en memoria
Algunas pseudoinstrucciones
move $4, $5 # $4 $5 # or $4, $zero, $5 # $4 100 # ori $4, $zero, 100 # $4 LABEL # lui $4, LABEL16bsuperiores # ori $4, $4, LABEL16binferiores # if ($4 > CTE) goto LABEL # slti $at, $4, CTE+1 # beq $at, $zero, LABEL
li $4, 100
la $4, LABEL32
Ejemplo
# Direccin de memoria de a en rtulo DIR_A # Direccin de memoria de b en rtulo DIR_B # Direccin de memoria acum en rtulo DIR_ACUM la $v0, DIR_A la $v1, DIR_B # cargar direccin de a # cargar direccin de b
# leer a # leer b
# t2 = a * b # cargar direccin de acum # leer acum # $t3 = acum + a * b # guardar acum
mul $t2, $t0, $t1 la $v2, DIR_ACUM lw $t3, 0($v2) add $t3, $t3, $t2 sw $t3, 0($v2)
a
1000 1004 1008 1012 1016 1020 1024
Memoria 10 DIR_A
b
2
70 50
10 2 20
$t3
70 50
DIR_B
DIR_ACUM
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);
Memoria DIR_C1 DIR_C1 + 4 DIR_C2 c1.x c1.y
# Direccin de memoria de c1 en rtulo DIR_C1 # Direccin de memoria de c2 en rtulo DIR_C2 # Direccin de memoria de dist en rtulo DIR_DIST la $v0, DIR_C1 la $v1, DIR_C2 lw $t0, 0($v0) lw $t1, 0($v1) sub $t2, $t1, $t0 abs $t3, $t2 lw $t0, 4($v0) lw $t1, 4($v1) sub $t2, $t1, $t0 abs $t4, $t2 add $t3, $t3, $t4 Direcciones de memoria # cargar direccin de c1 # cargar direccin de c2 # leer c1.x # leer c2.x # t2 = c2.x c1.x # t3 = abs(c2.x c1.x) # leer c1.y # leer c2.y # t2 = c2.y c1.y # t4 = abs(c2.y c1.y) # t3 = abs(c2.x c1.x) + # abs(c2.y c1.y) # cargar direccin de dist # dist = abs(c2.x c1.x) + # abs(c2.y c1.y)
DIR_C2 + 4
DIR_DIST
c2.x c2.y
dist
Ej. Estructuras tipo if-else, for, while, switch-case Tpicamente saltos, pero tambin escritura a registro Comparacin en la instruccin bgt r1, r2, ADDR # if r1 > r2 goto ADDR Registro de condicin (MIPS) cmp r1, r2, r3 # r3 = signo (r1-r2) bgtz r1, ADDR # if r1 > 0 goto ADDR
Instrucciones de comparacin
Resultado es VERDADERO o FALSO Resultado de comparacin se almacena en registro destino FALSO regDest = 0 VERDADERO regDest = 1
Ejemplo:
add $1, $2, $3 slt $4, $1, $0 # if $1 < $0 then $4 = 1 # else #4 = 0
Saltos condicionales
beq $1,$2,CLabel bne $1,$2,CLabel bgez $1, Clabel bgtz, $1, Clabel blez, $1, Clabel bltz $1, Clabel bge $1,$2,CLabel bgt $1,$2,CLabel bgtu $1,$2,CLabel ble $1,$2,CLabel blt $1,$2,CLabel bltu $1,$2,CLabel # if ($1==$2) goto CLabel ; # if ($1!=$2) goto CLabel ; # if ($1 >=0) goto Clabel # if ($1 >0) goto Clabel # if ($1<=0) goto Clabel # if ($1<0) goto CLabel # if ($1>=$2) goto CLabel ; # if ($1>$2) goto CLabel ; # if ($1>$2) goto CLabel ; # Comparacin sin signo # if ($1<=$2) goto CLabel ; # if ($1<$2) goto CLabel ; # if ($1<$2) goto CLabel ; # Comparacin sin signo
Registro de contador de programa Program Counter (PC) Almacena direccin de siguiente instruccin a ejecutar Por defecto, instruccin fsicamente siguiente a la actual (PC PC + 4) Modificacin del flujo de control de un programa Tipos de salto (especificacin de direccin destino) Absoluto: instruccin especifica directamente direccin destino Relativo: instruccin especifica desplazamiento respecto de instruccin actual Tipos de salto (ejecucin condicional) Incondicional: salto se realiza de todas formas Condicional: salto se realiza slo si se cumple una condicin La mayora de las ISA usan dos tipos de salto jump: absoluto e incondicional branch: relativo y condicional
Saltos
Salto a procedimiento: almacena direccin de retorno Retorno de procedimiento: retorna a instruccin siguiente a la que hizo el salto a procedimiento Llamado a sistema: salta a direccin predeterminada y pasa a modo supervisor Retorno de excepcin o llamado a sistema: retorna a instruccin que provoc excepcin o llamado a sistema, y restaura modo usuario
Saltos absolutos
j CLabel # PC CLabel
Saltos a procedimiento
jal CLabel # $ra PC; PC CLabel; bgezal $1, CLabel # if ($1>=0) $ra = PC; PC = Clabel
Recordar que, durante la ejecucin de una instruccin, PC contiene la direccin de la siguiente instruccin a ejecutar $ra = $31
Saltos indexados
jr $ra jalr $1, $2 # PC $ra # $2 PC + 4; PC $1
Ejemplo
Cdigo assembly para el siguiente cdigo C: int a = 10, b = 5; int c; if (a > b) c = a b; else c = b a; c = c + 10;
li $t0, 10 li $t1, 5 sle $t3, $t0, $t1 bgtz $t3, ELSE sub $t2, $t0, $t1 j FIN_IF ELSE: sub $t2, $t1, $t0 # a = 10 #b=5 # a <= b ? # if a <= b goto ELSE #c=a-b # goto FIN_IF #c=b-a
FIN_IF:
# c = c + 10
Ejemplo
Posible optimizar cdigo?
Cdigo assembly para el siguiente cdigo C: i = 0; sum = 0; do { sum = sum + a[i] * b[i]; i++; } while (i < 100)
LOOP:
li $t0, 0 li $t1, 0 la $t2, SUM sw $t1, 0($t2) la $t3, A la $t4, B sll $t5, $t0, 2 add $t6, $t3, $t5 lw $t7, 0($t6) add $t6, $t4, $t5 lw $t8, 0($t6) mul, $t8, $t7, $t8 add $t1, $t1, $t8 la $t2, SUM sw, $t1, 0($t2) add $t0, $t0, 1
# i = 0; # $t1 = 0 (sum temporal) # $t2 = direccin de sum # sum = 0 # $t3 = direccin a[0] # $t4 = direccin b[0] # $t5 = i*4 # $t6 = direccin a[i] # $t7 = a[i] # $t6 = direccin b[i] # $t8 = b[i] # $t8 = a[i]*b[i] # $t1 = sum + a[i]*b[i]
Vectores a y b y variable sum comienzan a partir de direcciones de memoria indicadas por rtulos A, B y SUM. Variable i asignada a registro $t0.
slti $t7, $t0, 100 # i < 100? bne $t7, $zero, LOOP
Ejemplo (optimizado)
li $t0, 0 li $t1, 0 la $t3, A la $t4, B LOOP: add $t6, $t3, $t0 lw $t7, 0($t6) # i = 0; # $t1 = 0 (sum temporal) # $t3 = direccin a[0] # $t4 = direccin b[0] # $t6 = direccin a[i] # $t7 = a[i]
Cdigo assembly para el siguiente cdigo C: i = 0; sum = 0; do { sum = sum + a[i] * b[i]; i++; } while (i < 100)
Vectores a y b y variable sum comienzan a partir de direcciones de memoria indicadas por rtulos A, B y SUM. Variable i asignada a registro $t0.
slti $t7, $t0, 400 # i < 100? bne $t7, $zero, LOOP la $t2, SUM sw, $t1, 0($t2)
Otras instrucciones
syscall Llamado a sistema: syscall (cdigo en registro $v0) break Excepcin: break #cdigo nop No hace nada: nop eret (MIPS32, anterior rfe) Retorno de excepcin: eret Restaura registro de estado y mscara de interrupciones Instrucciones de coprocesadores y punto flotante Instrucciones al TLB Instrucciones para acceso no alineado a memoria Pseudoinstrucciones Instrucciones assembly que no existen en el lenguaje de mquina Ejemplos: li, la Ensamblador las traduce a una o ms instrucciones de mquina (las que s se pueden ejecutar)
Ensamblador MIPS
Mnemnicos
Entregan informacin al ensamblador sobre cmo traducir el cdigo assembly Texto que representa valores constantes o direcciones de memoria Instrucciones assembly que se traducen a unas pocas instrucciones de mquina
Rtulos (labels)
Pseudoinstrucciones
Rtulos
Ejemplo
add $4, $4, $2 j LOOP
LOOP:
RES:
.globl MAIN
Mapa de memoria
Texto
Heap
Heap 0x1000 0000 Segmento de Texto 0x0040 0000 Reservado 0x0000 0000
Stack
Reservado
.text
Texto que sigue representa instrucciones almacenadas en rea de texto (cdigo) .kdata Texto que sigue representa datos en rea de datos del kernel (sistema operativo) .ktext
Texto que sigue representa cdigo en rea de kernel .globl LABEL Rtulo 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 la $8, TEXTOSINUL la $9, TEXTOCONUL la $10, DATOS lw $11, 0($10) lw $12, 4($10) lw $13, 8($10)
MAIN:
Procedimientos
Son un componente importante en la estructura y modularidad de programas Llamado y retorno requiere un protocolo del que llama y el que es llamado Protocolo est basado en convencin
Protocolo Procedimientos/funciones
Cada mquina y compilador tiene su propio protocolo Protocolo esta determinado por HW y SW Instruccin jal es HW Usar registro $29 como $sp es SW (convencin) Protocolo est determinado por una secuencia de pasos que se siguen por cada llamado y retorno En RISC HW realiza instrucciones sencillas SW controla (compilador/ensamblador) controla secuencia de instrucciones Registros utilizados $ra $a0-$a3 $v0-$v2 $29 para puntero a stack Instrucciones jal, jr
STRLEN: li $v0, 0 WHILE: lb $t0, 0($a0) beq $t0, $zero, FIN_WHILE addi $a0, $a0, 1 addi $v0, $v0, 1 b WHILE jr $ra
# len = 0 # $t0 = *str # if (*str == 0) goto FIN_W # str = str + 1 # len = len + 1 # goto WHILE # return len
Algunas preguntas
Qu hacer cuando hay ms de 4 argumentos? Qu hacer cuando el valor de retorno utiliza ms de dos palabras (ej. una estructura)?
En general, qu hacer cuando se nos acaban los registros que estamos utilizando?
Respuesta: el nico lugar donde pueden almacenarse estos datos es la memoria Alternativa 1: almacenarlos en rea de memoria global asociada al procedimiento
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
$ra
PROC1_MEM
$t0
Direcciones de memoria
Procedimientos y stacks
Alternativa 2: definir un rea de memoria asociada a cada activacin de cada procedimiento Estructura dinmica de llamado a procedimientos asemeja una pila (stack) Retornan en el sentido inverso en el que fueron invocados Memoria para almacenamiento de datos locales tambin se estructura como un stack
A:
call B B: call C C:
A A B A B C A B A
ret
ret
Stacks de memoria
Direccin de retorno Argumentos Variables locales Valor de retorno Registros salvados por el procedimiento
FP Apunta al tope del stack Usado para agregar y sacar datos a stack
Argumentos
Apunta a base del bloque de activacin (stack frame) Usado para accesar variables locales y argumentos sin removerlos del stack PUSH POP CALL RETURN En el lenguaje de mquina: VAX, Intel, registros e instrucciones especficas Por convencin de software: MIPS
Operaciones
Variables locales
SP
Cadena de llamados
p1
p2 p3 p3() { p3(); } p3 p3 p3
Procedimiento p3 es recursivo
Cadena de
p1
p1
p1
Cadena de llamados
p1 p2 Frame Pointer $fp Stack Pointer $sp
p2
p1
Cadena de llamados
p1 p2 p3 Stack Pointer $sp Frame Pointer $fp
p2
p3
p1
Cadena de llamados
p1
p2 p2 p3 p3 p3
p3
p1
Cadena de llamados
p1
p3
p3
p1
Cadena de llamados
p1
p2 p2 p3 p3 amI p3
p3
p1
Cadena de llamados
p1 p2 p3 p3 p3 Stack Pointer $sp Frame Pointer $fp
p2
p3
p1
Call Chain
p1 p2 p3 p3 p3 Frame Pointer $fp Stack Pointer $sp
p2
p1
Cadena de llamados
p1 p2 p3 p3 p3 p3 Stack Pointer $sp Frame Pointer $fp
p2
p3
p1
Cadena de llamados
p1 p2 p3 p3 p3 p3 Frame Pointer $fp Stack Pointer $sp
p2
Cadena de
p1 p2 p3 p3
p1
p3
p3
Cada programa en ejecucin (proceso) tiene un stack Stack: estructura de datos dinmica accesada en LIFO Stack de programa automticamente asignada por el SO Al comienzo del proceso el registro $sp ($29 en MIPS) es automticamente cargado a un punto de la primera entrada vaca al tope del stack
Despus de eso queda a manos del programador el uso del stack Para asignar una nueva entrada (al hacer push), decrementar $sp Para liberar espacio en el tope del stack (al hacer pop), incrementar $sp
Operacin push
Una instruccin para manipular dato : sw $6, 0($sp) Una instruccin para ajustar el puntero al stack : subu $sp, $sp, 4
46
-72 ???
8($sp)
4($sp) $sp
46
-72 127 ???
12($sp)
8($sp) 4($sp) $sp 127 $6
127
$6
antes
despus
Operacin pop
Una instruccin para ajustar el puntero a stack : addu $sp, $sp, 4 Una instruccin para manipular el dato : lw $6, 0($sp)
46 -72 127 8($sp) 4($sp) $sp 46 -72 127 ??? 127 $6 12($sp) 8($sp) 4($sp) $sp 453 $6
Pasa a ser
basura
despes
antes
El que llama debe pasar la direccin de retorno al que es llamado (procedimiento) El que llama debe pasar los parmetros al procedimiento El que llama debe guardar el contenido de los registros que podran ser usados por el procedimiento El procedimiento debe guardar la direccin de retorno (si es que llama a otro procedimiento o el mismo si es recursivo) El procedimiento debe proporcionar almacenamiento de stack para su propio uso
Mecanismo
Jal target
Para pasar parmetros ($a0 $a3, a lo ms 4) Mantener el valor de $sp Retornando valores de funcin en $v0, $v1
Salvar registros para ser usados por procedimientos Salvar informacin acerca del que llama (direccin de retorno) Pasar parmetros si se necesita Asignando datos locales para el procedimiento llamado
El que llama
Procedimiento
Salva contenido de registros volatiles ($t0$t9) teniendo contenidos que deben ser guardados Poner a lo ms 4 argumentos en $a0$a3 Si hay ms de 4 argumentos, poner el resto en el stack Llamar a jal instruccin
Salva $ra en stack Salva cualquier registro no voltil ($s0$s7) que se usar
Procedimiento
El que llama
Restaura cualquier registro no voltil ($s0$s7) que ha usado Restaura $ra Pone resultados de funcin en $v0, $v1 Retorna al que llama con instruccin jr $ra
Restaura cualquier registro voltil que ha salvado Examina $v0 y $v1 si lo necesita
Ejemplo de un CALL
Asumir que los argumentos en $t0 y $t3 y que se desea salvar los contenidos en $t6 y $t7
move move subu sw sw jal $a0,$t0 $a1,$t3 $sp,$sp,8 $t6,8($sp) $t7,4($sp) target # argumento 1 en $a0 # argumento 2 en $a1 #espacio para 2 temps en stack #salvar $t6 en stack #salvar $t7 en stack
Ejemplo RETURN
# # # # #
tamao del nuevo stack es 12 bytes almacenar $fp en el stack almacenar $ra en el stack $fp apunta al principio del stack almacenar n en el stack
$a0, $a0, -1 FACT $a0, $ra, $fp, $sp, 0($fp) 4($sp) 0($sp) $sp, 12
# n - 1 # resultado en $v0 # # # # recuperar recuperar recuperar restaurar n direccion de retorno $fp stack original $sp
# n * fact(n-1)
Mostrar ejemplos usando fp y no usando fp, usando ConTEXT Ejercicio: hacer dibujo con marcos de activacin y cadena de llamados
Excepciones
Condiciones especiales que cambian el flujo de ejecucin normal del programa Tipos de excepciones
Interrupcin
Generada en forma externa al procesador, tpicamente por dispositivo de E/S como interfaz de red o disco
Efecto colateral (implcito o explcito) de ejecucin de instruccin
Trap
Ej. Divisin por cero, acceso ilegal a memoria, instruccin invlida, syscall, break.
Atencin de excepciones
Tpicamente
Almacenar estado del procesador (PC, registro de condicin, mscara de interrupciones, etc.) Transferir control al sistema operativo Pasar a modo de ejecucin supervisor Sistema operativo atiende excepcin, restaura el estado y retorna al programa de usuario
Registro Causa
Registro de estado
Excepciones e interrupciones causan al procesador MIPS saltar a una porcin de cdigo a la direccin 0x80000180 (en modo kernel) llamado exception handler o manejador de interrupciones Este cdigo examina causa de excepcin y salta al punto apropiado de la rutina de atencin de la excepcin que ocurri ( en el SO).