Está en la página 1de 18

“Ciencia y Tecnología al Servicio del País”

22-I

Facultad de Ingeniería Eléctrica y


Electrónica
Curso: Introducción a la Computación

Docente: Carolyn Rojas Vargas

Ciclo Académico
Lenguaje
Emsamblador II
LENGUAJE ENSAMBLADOR

Accesos a memoria
Los datos se han de traer de memoria principal a los
registros para poder trabajar con ellos.
Los resultados pueden necesitar volcarse a memoria. MP
Para traer un dato hay que hacer una lectura sobre MIPS R2000
memoria, instrucción lw (load word) $8
Para volcar un dato hay que hacer una escritura sobre $10 D
memoria, instrucción sw (store word)
$17 = 0
Formato:
lw $8, D($17) # $8=contenido de D+$17
sw $10, D($17) # En dir. D+$17 almacena $10
D+$17  dirección efectiva
LENGUAJE ENSAMBLADOR

PROGRAM ejemplo
VAR Como acedemos al elemento i del vector:
x,k,i: Suponemos i almacenada en $17
INTEGER;
lw $10, Vinicio($17) # $17 se le llama reg.
V: ARRAY[0..999] OF INTEGER;
indice
BEGIN

x:=k-(V[i]+V[i]); MP
MIPS R2000

V[i+1]:=k+V[i]; $10
… $17 = i V (dir. inicio)
END.
... $17

V[i]
LENGUAJE ENSAMBLADOR

Direccionamiento de la memoria Memoria Principal


3 2 1 0
 Direccionamiento por palabra,
7 6 5 4
media palabra y byte.
11 10 9 8
 Palabras (32 bits, 4bytes): 0, 4, 8, ···
12, …232-4
D+1 D
 Medias pal. (16 bits, 2bytes): 0, 2, D+6 D+4
4, 6, …2 -2
32
D+8 *Con D múltiplo de 4
 Bytes (8 bits, 1bytes): 0, 1, 2, 3, … Dir.

232-1 Dir. Dir.


1 Media Palabra 0
1 Byte 0
0
2 (Half-Word 0) 1
Palabra 0
3 Media Palabra 2 2 Byte 1
2
(Word 0)
4 (Half-Word 2)
3 Byte 2 3
5 Media Palabra 4 4
6 (Half-Word 4) 4 Byte 3
5
Palabra 4
(Word 4) 6 5 Byte 4 6
7 7
6Byte 5 6
8 8
7
9 9
8
.... ....
9
....
LENGUAJE ENSAMBLADOR

 Del ejemplo: Para acceder a V[i], siendo V un vector de


palabras, $17 debe contener i*4 y no i.

V[i] ? Elemento número i del vector V. V


Para codificar: V[i+1]:=V[i]+k;
? Vector de palabras.
V[i] ? Palabra número i. lw $10, Vinicio($17) # $17  i*4
¿Qué dirección tendrá V[i]? add $10, $18, $10 # $18 contiene k
Dir.
add $17, $17, $21 # $21 contiene 4
V-1
V = V[0] = V sw $10, Vinicio($17) # V[i+1]:=k+V[i]
V+1

V+2
V[1] =
V+3

V[i] = V+(i*4)
V+4
V+(i*4)+1
....
V+
(i*4)+2
V+(i*4)+3
....
LENGUAJE ENSAMBLADOR

Modos de acceder a los operandos de una instrucción. Repercuten en el modo de acceder a los datos.
 Modo real: Sumar algo al contenido de un registro.

 Modo virtual: Según sea el algo:

 Direccionamiento a registro
 Direccionamiento inmediato
 Direccionamiento base o desplazamiento
 Direccionamiento relativo a PC

Direccionamiento a registro
 El dato esta ubicado en el registro sub $8, $10, $22
lw $10, Vinicio($17)
LENGUAJE ENSAMBLADOR

Direccionamiento inmediato
 El operando es un valor constante
 Inicializaciónes o operaciones con ctes.
 Instrucciones en versión inmediata:
addi $17, $17, 4 # inmediate add

Direccionamiento base o desplazamiento


 Normalmente se emplea para accesos a memoria
 La dirección efectiva se obtiene sumando una cantidad más el
contenido de un registro
 La cantidad se codifica con la instrucción.
 Dos posibles interpretaciones:

 lw $10, Vinicio($17) #Acceso al valor $17/4


 lw $10, 12($16) #Acceso al valor 3
#En $16 esta Vinicio
LENGUAJE ENSAMBLADOR

Direccionamiento relativo al contador de


programa
 Normalmente usado en saltos.
bne $21, $8, seguir # Ir a seguir
si $8<>$21
 seguir es una etiqueta
 La dirección de salto se calcula como un valor añadido (o restado)
al contador de programa actual
 Este valor lo calcula el ensamblador:
etiqueta: addi $5, $8, 78
LENGUAJE ENSAMBLADOR

INSTRUCCIONES DE BIFURCACIÓN O SALTO


Tipos:
 Salto incondicional

 Salto condicional

Salto incondicional

 Instrucción: j (jump)
 Operando: Dirección destino. Valor concreto o etiqueta

j 2300 # Salta a la dirección 2300


j etiqueta #Salta a la dirección de la etiqueta
LENGUAJE ENSAMBLADOR

Salto condicional
 Salta si se produce alguna condición

 Implementa IF…THEN…ELSE

beq $7, $12, etiqueta #Salta si $7 = $12


bne $7, $12, etiqueta #Salta si $7<>$12

Comparación de desigualdad:
slt $8, $19, $22 # set on less than Si $19<$22 entonces $8=1 sino $8=0

Para realizar un salto si x < y (x  $8, y  $9)


slt $10, $8, $9
bne $10, $0, menor

MIPS: El registro $0 es de solo lectura y siempre contiene un 0.


LENGUAJE ENSAMBLADOR

Algunas codificaciones sencillas: BUCLE REPEAT – UNTIL (REPETIR – HASTA)


SENTENCIA IF (SI) Variables: g, h, i, j  $17 - $20
Suponemos i, j, a, h  $16 - $19 A es un vector de enteros (de palabras)
Suponemos (como ocurre en C) que A=&A[0]=Ainicio

REPETIR
g:=g+A[i];
SI (i=j)ENTONCES a:=a+h; i:=i+j;
a:=a+j; HASTA (i=h)
bne $16, $17, L1 bucle:
add $18, $18, $19 multi $9,
L1: add $18, $18, $19, 4
$17
lw
$8,
A($
9)
add $17, $17, $8
add $19, $19, $20
LENGUAJE ENSAMBLADOR

SENTENCIA WHILE (MIENTRAS)


Suponemos i, x  $22 - $23
i:=1
MIENTRAS (i<35) HACER
x:= x-2;
i:= i+5;
FIN DEL MIENTRAS
x:= x+18;

addi $22, $0, 1


bucle: slti $10, $22, 35
beq $10,
$0, salir addi
$23, $23, -2 addi
$22, $22, 5
j bucle
salir: addi $15,
$15, 18
# Mostrar el número mayor de un arreglo.

Ejercicio 7 .data
# Declarar etiquetas
a: .word 20,30,115,1,62,41,12
n: .word 7
max: .word 0
.text
.globl main
main:
li $t0, 0
li $s0, 0
lw $s1, n #CARGA N EN EL REGISTRO sl
m1:
bge $t0, $s1, m3
mul $t1, $t0, 4 #LENGUAJE DE DESPLAXAMIENTO CON T1 Y T0
lw $t2, a($t1)
ble $t2, $s0, m2 #COMPARACION CON EL REGISTRO T2 Y S0
move $s0,$t2

m2:
addi $t0, $t0, 1 #COMPARA VALORES DEL CONTADOR
b m1 #LINEAS DE COMANDO PREDETERMINADAS

m3:
move $a0, $s0 #FINALIZA PROCESO DE REGISTROS

li $v0,1
syscall
li $v0,10
syscall
# Encontrar el factorial de un numero
.text

Ejercicio 8
.globl main
main:
li $v0,4
la $a0,msg1
syscall

li $v0,5
syscall

move $t0,$v0
lb $a0,fact
move $t1,$a0
lb $a0,i
move $t2,$a0

Bucle:
bgt $t2,$t0,fin
mul $t1,$t1,$t2
addi $t2,$t2,1
j Bucle

fin:
li $v0,4
la $a0,msg2
syscall
li $v0,1
move $a0,$t1
syscall

.data
msg1: .asciiz "Ingrese el número: "
msg2: .asciiz "El factorial es:"
fact: .byte 1
i: .byte 1
# Ingresar dos edades y mostrar la mayor de ellas mayor1:

Ejercicio 9 .data
msg1: .asciiz "Ingrese la primera edad: \n"
li $v0,4
la $a0,msg3
syscall
msg2: .asciiz "Ingrese la segunda edad : \n"
msg3: .asciiz "El mayor es : " li $v0,1
msg4: .asciiz " \nHasta pronto" move $a0,$t0
syscall
j fin
.text
.globl main mayor2:
main: li $v0,4
li $v0,4
la $a0,msg3
la $a0,msg1
syscall syscall
li $v0,5
syscall li $v0,1
move $t0,$v0 move $a0,$t1
li $v0,4 syscall
la $a0,msg2 j fin
syscall fin:
li $v0,5
li $v0,4
syscall
move $t1,$v0 la $a0,msg4
bgt $t0,$t1,mayor1 syscall
bgt $t1,$t0,mayor2
Arquitectura MIPS

¡MUCHAS GRACIAS!

También podría gustarte