Sie sind auf Seite 1von 29

ICEE1012

Programacin en Lenguaje
Assembly de MIPS

Basado en el Capitulo 2 del texto: Computer Organization and Design, David Patterson y John Hennessy
Semestre Otoo 2017 ICE1012 Sistemas Digitales II
Semestre Otoo 2017 ICE1012 Sistemas Digitales II
Ejemplo 1: Operandos de Memoria

Cdigo C:
g = h + A[8];
g en $s1, h en $s2, direccin base de A en $s3
Cdigo MIPS compilado:
ndice 8 requiere offset de 32
4 bytes por palabra

lw $t0, 32($s3) # load word


add $s1, $s2, $t0

offset registro base

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Ejemplo 2: Operandos de Memoria

Cdigo :
A[12] = h + A[8];
h en $s2, direccin base de A en $s3
Cdigo MIPS compilado :
ndice 8 requiere offset de 32
ndice 12 requiere offset de 48
lw $t0, 32($s3) # load word
add $t0, $s2, $t0
sw $t0, 48($s3) # store word

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


La Constante Cero

El registro 0 ($zero) de MIPS es la constante 0


No se puede escribir en l
til para operaciones frecuentes
p.e., mover entre registros
add $t2, $s1, $zero

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Operaciones Condicionales
Salto a una instruccin rotulada si una condicin
es verdadera
De lo contrario, continua secuencialmente
beq rs, rt, L1
si (rs == rt) salte a instruccin rotulada L1;
bne rs, rt, L1
si (rs != rt) salte a instruccin rotulada L1;
j L1
salto incondicional a instruccin rotulada L1

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Declaracin If
Cdigo C:
if (i==j) f = g+h;
else f = g-h;
f, g, en $s0, $s1,
Cdigo MIPS compilado:
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
Exit: El Assembler calcula las direcciones

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Declaracin Loop
Cdigo C:
while (save[i] == k) i += 1;
i en $s3, k en $s5, direccin a guardar en $s6
Cdigo MIPS compilado:
Loop: sll $t1, $s3, 2
add $t1, $t1, $s6
lw $t0, 0($t1)
bne $t0, $s5, Exit
addi $s3, $s3, 1
j Loop
Exit:
Semestre Otoo 2017 ICE1012 Sistemas Digitales II
Ms Operaciones Condicionales
Resultado en 1 si una condicin es verdadera
De lo contrario, es 0
slt rd, rs, rt
if (rs < rt) rd = 1; else rd = 0;
slti rt, rs, constant
if (rs < constant) rt = 1; else rt = 0;
Se utiliza en combinacin con beq, bne
slt $t0, $s1, $s2 # si ($s1 < $s2)
bne $t0, $zero, L # salto a L

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Uso de Registros
$a0 $a3: argumentos (registros 4 7)
$v0, $v1: resultado valores (registros 2 and 3)
$t0 $t9: temporales
Pueden ser modificados por el programa llamado
$s0 $s7: guardados
Deben ser guardados/recuperados por el programa
llamado
$gp: puntero global para datos estticos (reg. 28)
$sp: puntero de stack (stack pointer (reg. 29))
$fp: puntero de trama (frame pointer (reg. 30))
$ra: direccin de retorno (return address (reg. 31)
Semestre Otoo 2017 ICE1012 Sistemas Digitales II
Instrucciones para Llamados de
Procedimientos
Llamada Procedimiento: salto y vnculo
jal ProcedureLabel
Direccin de la siguiente instruccin puesta en $ra
Saltos a direcciones puntuales
Retorno de Procedimiento: registro de salto
jr $ra
Copia $ra al contador de programa
Puede tambin ser utilizado para saltos calculados
e.g., para declaraciones case/switch

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Ejemplo Procedimiento Leaf
Cdigo C:
int leaf_example (int g, h, i, j)
{ int f;
f = (g + h) - (i + j);
return f;
}
Argumentos g, , j en $a0, , $a3
f en $s0 (por lo tanto, se necesita guardar $s0 en el
stack)
Resultado en $v0

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Ejemplo Procedimiento Leaf
Cdigo MIPS:
leaf_example:
addi $sp, $sp, -4 Guarda $s0 en el stack
sw $s0, 0($sp)
add $t0, $a0, $a1
Cuerpo del procedimiento
add $t1, $a2, $a3
sub $s0, $t0, $t1
add $v0, $s0, $zero Resultado

lw $s0, 0($sp) Recupera $s0


addi $sp, $sp, 4
jr $ra Retorno

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Procedimientos Non-Leaf
Procedimientos que llaman a otros procedimientos
Para llamadas anidadas, el que llama necesita
guardar en el stack:
Su direccin de retorno
Cualquier argumento y variables temporales que se
necesitaran despus del llamado
Recuperar del stack despus del llamado

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Ejemplo Procedimientos Non-Leaf
Cdigo C:
int fact (int n)
{
if (n < 1) return (1);
else return (n * fact(n - 1));
}
Argumento n en $a0
Resultado en $v0

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Ejemplo Procedimientos Non-Leaf
Cdigo MIPS:
fact:
addi $sp, $sp, -8 # ajusta stack para 2 tems
sw $ra, 4($sp) # guarda direccin de retorno
sw $a0, 0($sp) # guarda argumento
slti $t0, $a0, 1 # testea para n < 1
beq $t0, $zero, L1 # salta a L1 si n >= 1
addi $v0, $zero, 1 # si n < 1, resultado es 1
addi $sp, $sp, 8 # saca 2 tems del stack
jr $ra # y retorna
L1: addi $a0, $a0, -1 # si n >= 1, decrementa n
jal fact # llamada recursiva para (n-1)
lw $a0, 0($sp) # recupera n original
lw $ra, 4($sp) # y direccin de retorno
addi $sp, $sp, 8 # saca 2 tems del stack
mul $v0, $a0, $v0 # multiplica para obtener
# resultado
jr $ra # y retorna
Semestre Otoo 2017 ICE1012 Sistemas Digitales II
Operaciones de Byte/Halfword

Podran utilizar operaciones bitwise


Cargar/guardar byte/halfword MIPS
Procesamiento de cadenas de caracteres (string) es
un caso comn
lb rt, offset(rs) lh rt, offset(rs)
Extensin de signo a 32 bits en rt
lbu rt, offset(rs) lhu rt, offset(rs)
Cero extendido a 32 bits en rt
sb rt, offset(rs) sh rt, offset(rs)
Almacena slo en lado derecho el byte/halfword

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Ejemplo Copia de String

Cdigo C (simple):
String terminado en Null
void strcpy (char x[], char y[])
{ int i;
i = 0;
while ((x[i]=y[i])!='\0')
i += 1;
}
Direcciones de x, y en $a0, $a1
i en $s0

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Ejemplo Copia de String
Cdigo MIPS:
strcpy:
addi $sp, $sp, -4 # ajusta stack para 1 tem
sw $s0, 0($sp) # guarda $s0
add $s0, $zero, $zero # i = 0
L1: add $t1, $s0, $a1 # direccin de y[i] en $t1
lbu $t2, 0($t1) # $t2 = y[i]
add $t3, $s0, $a0 # direccin de x[i] en $t3
sb $t2, 0($t3) # x[i] = y[i]
beq $t2, $zero, L2 # salir del loop si y[i] == 0
addi $s0, $s0, 1 # i = i + 1
j L1 # siguiente iteracin del loop
L2: lw $s0, 0($sp) # recupera $s0 guardado
addi $sp, $sp, 4 # sacar 1 tem del stack
jr $ra # y retorna

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Pseudo Instrucciones de Assembler
La mayora de las instrucciones de assembler
representan una a una instrucciones de mquina
Pseudo instrucciones: ficcin de la imaginacin
del assembler
move $t0, $t1 add $t0, $zero, $t1
blt $t0, $t1, L slt $at, $t0, $t1
bne $at, $zero, L
$at (register 1): registro temporal del assembler

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


Ejemplo Sort en C
Ilustra el uso de instrucciones de lenguaje
assembly para una parte de la funcin sort en
C
Procedimiento Swap (leaf)
void swap(int v[], int k)
{
int temp;
temp = v[k];
v[k] = v[k+1];
v[k+1] = temp;
}
v en $a0, k en $a1, temp en $t0

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


El procedimiento Swap
swap: sll $t1, $a1, 2 # $t1 = k * 4
add $t1, $a0, $t1 # $t1 = v+(k*4)
# (direccin de v[k])
lw $t0, 0($t1) # $t0 (temp) = v[k]
lw $t2, 4($t1) # $t2 = v[k+1]
sw $t2, 0($t1) # v[k] = $t2 (v[k+1])
sw $t0, 4($t1) # v[k+1] = $t0 (temp)
jr $ra # retorna a rutina llamante

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


El procedimiento Sort en C
Non-leaf (llama a swap)
void sort (int v[], int n)
{
int i, j;
for (i = 0; i < n; i += 1) {
for (j = i 1;
j >= 0 && v[j] > v[j + 1];
j -= 1) {
swap(v,j);
}
}
}
v en $a0, k en $a1, i en $s0, j en $s1
Semestre Otoo 2017 ICE1012 Sistemas Digitales II
El Cuerpo del Procedimiento
move $s2, $a0 # guarda $a0 en $s2
Mueve
move $s3, $a1 # guarda $a1 en $s3
parmetros
move $s0, $zero # i = 0
for1tst: slt $t0, $s0, $s3 # $t0 = 0 si $s0 $s3 (i n) Loop externo
beq $t0, $zero, exit1 # ir a exit1 si $s0 $s3 (i n)
addi $s1, $s0, 1 # j = i 1
for2tst: slti $t0, $s1, 0 # $t0 = 1 si $s1 < 0 (j < 0)
bne $t0, $zero, exit2 # ir a exit2 si $s1 < 0 (j < 0)
sll $t1, $s1, 2 # $t1 = j * 4
add $t2, $s2, $t1 # $t2 = v + (j * 4) Loop interno
lw $t3, 0($t2) # $t3 = v[j]
lw $t4, 4($t2) # $t4 = v[j + 1]
slt $t0, $t4, $t3 # $t0 = 0 si $t4 $t3
beq $t0, $zero, exit2 # ir a exit2 if $t4 $t3
move $a0, $s2 # 1er parmetro de swap es v (antiguo $a0)
move $a1, $s1 # 2do parmetro de swap es j Pasa
jal swap # llama procedimiento swap parmetros
addi $s1, $s1, 1 # j = 1 y llama
j for2tst # salta a test loop interno Loop interno
exit2: addi $s0, $s0, 1 # i += 1
j for1tst # salta a test loop externo Loop externo
Semestre Otoo 2017 ICE1012 Sistemas Digitales II
El Procedimiento Completo
sort: addi $sp,$sp, 20 # hace espacio en stack para 5 registros
sw $ra, 16($sp) # guarda $ra en el stack
sw $s3,12($sp) # guarda $s3 en el stack
sw $s2, 8($sp) # guarda $s2 en el stack
sw $s1, 4($sp) # guarda $s1 en el stack
sw $s0, 0($sp) # guarda $s0 en el stack
# cuerpo del procedimiento

exit1: lw $s0, 0($sp) # recupera $s0 del stack
lw $s1, 4($sp) # recupera $s1 del stack
lw $s2, 8($sp) # recupera $s2 del stack
lw $s3,12($sp) # recupera $s3 del stack
lw $ra,16($sp) # recupera $ra del stack
addi $sp,$sp, 20 # recupera puntero de stack
jr $ra # retorna a rutina llamante

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


MARS 4.5
MIPS Assembly and Runtime Simulator
Release 4.5, Agosto 2014
Ensambla y simula la ejecucin de programas en
assembly language del procesador MIPS
MARS ensambla y simula 155 instrucciones bsicas del
conjunto de instrucciones MIPS-32, aproximadamente 370
seudo-instrucciones, 17 funciones syscall principalmente
para consola y E/S de archivos, definido por SPIM y 22
syscall adicionales para otros usos como MIDI de salida,
generacin de nmeros aleatorios, etc.
Puede utilizarse desde una lnea de comandos o a travs
de su entorno de desarrollo integrado (IDE)
http://courses.missouristate.edu/kenvollmar/mars/

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


MARS - Edit

Semestre Otoo 2017 ICE1012 Sistemas Digitales II


MARS - Execute

Semestre Otoo 2017 ICE1012 Sistemas Digitales II

Das könnte Ihnen auch gefallen