ArqComp d10

Anuncio
Fundamentos de Computadores
Tema 3
LENGUAJE
ENSAMBLADOR
INTRODUCCIÓN ____________________________________1
Uso de un lenguaje ensamblador _____________________3
Inconvenientes del lenguaje ensamblador ______________3
Elección de un lenguaje ensamblador _________________3
ARQUITECTURA DEL µP MIPS R2000 _________________4
Simulador de MIPS R2000: SPIM ____________________5
INSTRUCCIONES BASICAS___________________________7
Empleo de variables temporales ______________________8
Operandos ________________________________________8
Accesos a memoria _________________________________9
Accesos a estructuras de datos ______________________10
Direccionamiento de la memoria ____________________11
MODOS DE DIRECCIONAMIENTO ___________________13
Direccionamiento a registro ________________________13
Direccionamiento inmediato ________________________13
Direccionamiento base o desplazamiento ______________14
Direccionamiento relativo al contador de programa ____14
INSTRUCCIONES DE BIFURCACIÓN O SALTO ________15
Salto incondicional ________________________________15
Salto condicional__________________________________16
FORMATO DE LAS INSTRUCCIONES_________________19
Formato R _______________________________________19
Formato I________________________________________20
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
Contenido - I
Formato J _______________________________________21
JUEGO DE INSTRUCCIONES ________________________22
USO DE REGISTROS Y MEMORIA ___________________28
Registros de la CPU _______________________________28
Distribución de la memoria _________________________30
PROGRAMACIÓN EN ENSAMBLADOR _______________31
EJEMPLOS ________________________________________33
PROGRAMACIÓN MEDIANTE SUBRUTINAS __________39
Paso de parámetros _______________________________41
Preservación de registros ___________________________41
EJEMPLOS ________________________________________42
MANEJO DE DATOS EN COMA FLOTANTE ___________47
Instrucciones para coma flotante ____________________47
LLAMADAS AL SISTEMA ___________________________50
EJEMPLO _________________________________________51
PROGRAMAS RECURSIVOS _________________________52
Estructura de la pila _______________________________52
Diseño (ejemplo factorial) __________________________53
REGULARIDAD Y ORTOGONALIDAD_________________54
EJEMPLOS: _______________________________________55
Programa que detecta cadenas capicuas.______________55
Cálculo de la serie de fibonazzi. _____________________55
Conversión a formato IEEE 754. ____________________55
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
Contenido - II
INTRODUCCIÓN
◊ Instrucción: Palabra de un lenguaje que especifica
alguna acción.
◊ Juego de instrucciones: Cto. de todas las
instrucciones que forman un lenguaje.
◊ Lenguaje Máquina: Lenguaje de programación que
entiende un ordenador directamente.
◊ Lenguaje Ensamblador: Abstracción de lenguaje
máquina para hacerlo más fácil de programar.
◊ Lenguaje de Alto Nivel: Lenguaje de programación
abstracto más cercano al lenguaje humano natrual.
Lenguaje de
Alto Nivel
Compilador
Lenguaje
Ensamblador
Ensamblador
Lenguaje
Máquina
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
1
Lenguaje de alto nivel (C):
int suma(int a, int b)
{
c=a+b;
}
Lenguaje Ensamblador:
suma: lw $16, O($22)
lw $17, O($23)
add $15, $16, $17
sw $15, O($21)
jr $31
Lenguaje Máquina:
01010000110011101010100010010101
01111010010101010100010111010110
01010010111011010101010101010101
10101011101100100101110101100100
01011010101100100111110100010101
01101010101110101101010101010101
10101001000101011110101010010101
01101011000101010101001011011011
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
2
Uso de un lenguaje ensamblador
• Velocidad
• Tamaño
• Carencia de compiladores
Inconvenientes del lenguaje ensamblador
• Dependientes de la máquina
• Programas más largos (factor de expansión)
• Depuración difícil.
• Compiladores muy optimos.
Elección de un lenguaje ensamblador
CISC
1970
1980
1990
CISC: Complex Instruction Set Comp.
RISC: Reduced Instruction Set Comp.
RISC
680X0, 80X86
RX000, PowerPC, Sparc, Alpha
MIPS R2000
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
3
ARQUITECTURA DEL µP MIPS R2000
Simple y regular.
Bus de datos: 32bits
Bus de direcciones: 32bits → 4Gb de direccionamiento
MIPS
R2000
Coprocesador
Matemático
R2010
Memoria
Principal
Bus del Sistema
$0
$1
$2
$3
·
·
·
$31
hi
lo
UAL
Status
Cause
EPC
BadVAddr
MMU
con TLB
Coprocesador 0
PC
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
4
$0
$1
$2
$3
·
·
·
Unidad de
división
Unidad de
multiplicación
$31
Coprocesador 1
• FPU. Números en coma flotante IEEE 754
• Modo Usuario y Modo Núcleo
• Unidad de control cableada y segmentada
• Cache externa separada para datos y programa.
Simulador de MIPS R2000: SPIM
◊ Programa capaz de ejecutar programas para MIPS
R2000 y R3000.
◊ Máquina virtual.
◊ Instrucciones Reales y pseudoinstrucciones.
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
5
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
6
INSTRUCCIONES BASICAS
Instrucción aritmética:
En lenguaje de alto nivel:
c:=a+b (PASCAL)
Sobre MIPS R2000:
add c, a, b
• c ← operando destino
• a ← primer operando fuente
• b ← segundo operando fuente
• La instrucción add SIEMPRE debe tener 3 op.
Para sumar más operandos:
g:=a+b+c+d+e+f
add g,a,b
# g:=a+b
add g,g,c
# g:=a+b+c
add g,g,d
# g:=a+b+c+d
add g,g,e
# g:=a+b+c+d+e
add g,g,f
# g:=a+b+c+d+e+f
(Factor de expansión)
Operación de resta o substracción:
sub c,a,b
#c:=a-b
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
7
Empleo de variables temporales
Variables internas no necesarias para el resultado pero si
para los cálculos intermedios.
Para generar:
f:=(g+h)-(i+j)+(k-l)
add t0,g,h
# t0 variable temporal
add t1,i,j
# t1 variable temporal
sub t2,k,l
# t2 variable temporal
sub f,t0,t1
# El orden de las anteriores
add f,f,t2
# instr. no importa
Operandos
Los operandos en lenguaje máquina deben estar situados
en los registros del procesador.
Registros de 32 bits
• R2000 ⇒ 32 registros de 32 bits + hi + ho + PC
• R2010 ⇒ 32 registros de 32 bits
• Memoria Principal ⇒ 4Gb como máximo
El compilador debe asignar las variables a los registros.
Por ejemplo f → $16, g → $17, h → $18, etc.
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
8
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.
Para traer un dato hay que hacer una lectura sobre
memoria, instrucción lw (load word)
Para volcar un dato hay que hacer una escritura sobre
memoria, instrucción sw (store word)
Formato:
lw $8, D($17)
# $8=contenido de D+$17
sw $10, D($17) # En dir. D+$17 alamcena $10
D+$17 → dirección efectiva
MP
MIPS R2000
$8
$10
D
$17 = 0
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
9
Accesos a estructuras de datos
PROGRAM ejemplo
VAR
x,k,i: INTEGER;
V: ARRAY[0..999] OF INTEGER;
BEGIN
…
x:=k-(V[i]+V[i]);
…
V[i+1]:=k+V[i];
…
END.
Como acedemos al elemento i del vector:
Suponemos i almacenada en $17
lw $10, Vinicio($17) # $17 se le llama reg. indice
MIPS R2000
MP
$10
$17 = i
V (dir. inicio)
...
$17
V[i]
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
10
Direccionamiento de la memoria
◊ Direccionamiento por palabra, media palabra y byte.
◊ Palabras (32 bits, 4bytes): 0, 4, 8, 12, …232-4
◊ Medias pal. (16 bits, 2bytes): 0, 2, 4, 6, …232-2
◊ Bytes (8 bits, 1bytes): 0, 1, 2, 3, …232-1
Memoria Principal
3
7
11
2
6
10
···
1
5
9
0
4
8
D+1
D
D+4
D+8
D+6
*Con D múltiplo de 4
Palabra 0
(Word 0)
Dir.
Media Palabra 0
0
(Half-Word 0)
1
2
3
4
Palabra 4
(Word 4)
5
6
Media Palabra 2
(Half-Word 2)
Media Palabra 4
(Half-Word 4)
Dir.
Byte 0
0
Byte 1
1
2
3
4
5
6
Byte 2
Byte 3
Byte 4
Byte 5
Dir.
0
1
2
3
4
5
6
7
7
7
8
8
8
9
....
9
....
9
....
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
11
• 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 ? Vector de palabras.
V[i] ? Palabra número i.
¿Qué dirección tendrá V[i]?
Dir.
V-1
V = V[0] =
V
V+1
V+2
V+3
V[1] =
V+4
....
V[i] =
V+(i*4)
V+(i*4)+1
V+(i*4)+2
V+(i*4)+3
....
Para codificar: V[i+1]:=V[i]+k;
lw $10, Vinicio($17) # $17 → i*4
add $10, $18, $10
add $17, $17, $21
# $18 contiene k
# $21 contiene 4
sw $10, Vinicio($17) # V[i+1]:=k+V[i]
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
12
MODOS DE DIRECCIONAMIENTO
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)
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
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
13
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)
⇒lw $10, 12($16)
#Acceso al valor $17/4
#Acceso al valor 3
#En $16 esta Vinicio
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
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
14
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
j etiqueta
#Salta a la dirección 2300
#Salta a la dirección de la etiqueta
⇒Instrucción: jr (jump register)
⇒Operando: Registro que contiene la dir. de salto.
Direccionamiento indirecto a registro
jr $12
#Salta a dirección indicada por $12
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
15
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.
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
16
Algunas codificaciones sencillas:
SENTENCIA IF (SI)
Suponemos i, j, a, h → $16 - $19
SI (i=j)ENTONCES a:=a+h;
a:=a+j;
bne $16, $17, L1
add $18, $18, $19
L1: add $18, $18, $17
BUCLE REPEAT – UNTIL (REPETIR – HASTA)
Variables: g, h, i, j → $17 - $20
A es un vector de enteros (de palabras)
Suponemos (como ocurre en C) que A=&A[0]=Ainicio
REPETIR
g:=g+A[i];
i:=i+j;
HASTA (i=h)
bucle:
multi $9, $19, 4
lw $8, A($9)
add $17, $17, $8
add $19, $19, $20
bne $19, $18, bucle
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
17
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;
bucle:
salir:
addi $22, $0, 1
slti $10, $22, 35
beq $10, $0, salir
addi $23, $23, -2
addi $22, $22, 5
j bucle
addi $15, $15, 18
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
18
FORMATO DE LAS INSTRUCCIONES
◊ Cada instrucción ocupa 32 bits (1 palabra)
◊ 3 tipos de codificaciones
→ decodificador de instrucciones más simple
Formato R
• Instrucciones con todos los operandos en registros
• Campos de la instrucción:
6 bits
5 bits
5 bits
5 bits
5 bits
6 bits
◊ 1º y último: Tipo de operación a realizar
◊ 2º: Primer operando fuente
◊ 3º: Segundo operando fuente
◊ 4º: Destino
◊ 5º: Desplazamiento en op. de desplazamiento
op
rf1
rf2
rd
desp
func
Por ejemplo:
add $15, $2, $3
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
19
000000
00010
00011
01111
00000
100000
Formato I
• Instrucciones de carga/almacenamiento
• Instrucciones de salto condicional
• Instrucciones con datos inmediatos
• Se utilizan 16 bits para codificar dato o desplazamiento
• Formato:
op
rf
rd
inm
6 bits
5 bits
5 bits
16 bits
◊ Carga: lw $3, Ainicio($13)
◊ Salto condicional: beq $1,$2, salir
◊ El desplazamiento de salir son palabras
◊ salir lo calcula el compilador
◊ Si el salto excede el desplazamiento máximo:
beq $18, $19, Etiqueta
bne $18, $19, aux
j etiqueta
aux: ……
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
20
Formato J
◊ Instrucciones de salto incondicional (no todas)
◊ Formato:
op
dirección
6 bits
26 bits
◊ dirección expresada en palabras
◊ Salto máximo 228 bytes = 256Mb
◊ Salto mayor: Instrucción jr → registro con dirección.
◊ Programas no relocalizables
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
21
JUEGO DE INSTRUCCIONES
• Instrucciones reales
• Pseudoinstrucciones (ρ)
ARITMÉTICO-LÓGICAS:
add Rdest, Rsrc1, Src2 Suma (con signo)
addi Rdest, Rsrc1, Imm Suma inmediata (c.s.)
addu Rdest, Rsrc1,
Suma (sin signo)
Src2
addiu Rdst, Rsrc1, Imm Suma inmediata (s.s.)
sub Rdest, Rsrc1, Src2 Resta (con signo)
subu Rdest, Rsrc1,
Resta (sin signo)
Src2
div RSrc1, RSrc2
divu RSrc1, RSrc2
División (con signo)
División (sin signo)
cociente en registro lo - resto en reg. hi
mult Rsrc1, Rsrc2
multu Rsrc1, Rsrc2
Multiplicación (c.s.)
Multiplicación (s.s.)
parte baja resultado en reg. lo - alta en reg. hi
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
22
nor Rdst, Rsrc1, Src2
or Rdst, Rsrc1, Src2
ori Rdst, Rsrc1, Imm
and Rdst, Rsrc1, Src2
andi Rdst, Rsrc1, Imm
xor Rdst, Rsrc1, Src2
xori Rdst, Rsrc1, Imm
Nor (Or negada)
Or
Or
AND lógico
AND inmediata
Xor (Or exclusiva)
Xor inmediata
Sll Rdst, Rsrc1, Src2
srl Rdst, Rsrc1, Src2
sra Rdst, Rsrc1, Src2
Desplazamiento a izq.
Desp. a derecha
Desp. aritmético dcha.
En Src2 esta el núm. de bits a desplazar
MANIPULACIÓN DE CONSTANTES
li Rdst, Imm
Rdst ← Imm (ρ)
lui Rdst, Imm
Rdst(parte alta)
←Imm
COMPARACIÓN
slt Rdst,Rsrc1, Src2
slti Rdst, Rsrc1, Imm
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
<
< inmediata
23
sltu Rdst,Rsrc1, Src2 < (sin signo)
sltui Rdst, Rsrc1, Imm < inmediata (sin
signo)
Rdst=1 si Rsrc1<Src2(o Imm), en otro caso Rdst=0
SALTO CONDICIONAL E INCONDICIONAL
Saltos condicionales: Campo 16 bits con signo
215-1 instrucciones hacia adelante y 215-1 hacia atrás
Salto incondicional: Campo con 26 bits.
beq Rsrc1, Rsrc2, Etq Salto si igual
bne Rsrc1, Rsrc2, Etq Salto si distinto
bgtz Rsrc, Etiq
bgez Rsrc, Etiq
bgezal Rsrc, Etiq
bltz Rsrc, Etiq
blez Rsrc, Etiq
blezal Rsrc, Etiq
Salto si > 0
Salto si >= 0
Salto y enlaza si >= 0
Salto si < 0
Salto si <= 0
Salto y enlaza si <= 0
j etiqueta
jal etiqueta
Salto incondicional
Salto incond. y enlaza
jalr Rsrc
jr Rsrc
S. inc. a reg. y enlaza
Salto incond. a reg.
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
24
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
25
CARGA
la Rdest, ident
lb Rdest, dirección
lbu Rdest, dirección
lh Rdest, dirección
lhu Rdest, dirección
lw Rdest, dirección
ld Rdest, dirección
ALMACENAMIENTO
sb Rsrc, dirección
sh Rsrc, dirección
sw Rsrc, dirección
sd Rsrc, dirección
Carga dirección (ρ)
Carga byte (ext.
signo)
Carga byte (sin ext.)
Carga media-pal.(ext.)
Carga media-pal.(s.e.)
Carga palabra
Carga doble palabra(ρ)
Almacena byte bajo
Alm. media-pal. baja
Alm. palabra
Alm. doble palabra
En las instrucciones de carga y almacenamiento:
• Direcciones para bytes: cualquiera.
• Direcciones para medias pal.: múltiplos de dos (pares).
• Dir. para palabras: múltiplos de 4.
• Dir. para dobles palabras: múltiplos de 8.
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
26
MOVIMIENTO
move Rdest, Rsrc
Rdest ← Rsrc (ρ)
mfhi Rdest
Rdest ← hi
mflo Rdest
Rdest ← lo
mthi Rdest
hi ← Rdest
mtlo Rdest
lo ← Rdest
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
27
USO DE REGISTROS Y MEMORIA
Registros de la CPU
◊ 32 registros de propósito general
◊ $n → registro n
◊ $0=0 siempre
◊ Identificadores y usos convenidos (tabla)
• $1, $26, $27 ⇒ el ensamblador y S.O.
• $4-$7 ⇒ Paso primeros 4 arg. a subrutinas
• $8-$15, $24, $25 ⇒ Temporales
• $16-$23 ⇒ Valores preservados en llamadas
• $29 ⇒ Puntero de pila
• $30 ⇒ Puntero de marco
• $31 ⇒ Dirección de retorno (jal)
• $28 ⇒ Puntero a datos globales (64K): heap
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
28
Número Nombre Uso
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$zero
$at
$v0
$v1
$a0
$a1
$a2
$a3
$t0
$t1
$t2
$t3
$t4
$t5
$t6
$t7
$s0
$s1
$s2
$s3
$s4
$s5
$s6
$s7
$t8
$t9
$k0
$k1
$gp
$sp
$fp
$ra
Constante 0
Reservado para el ensamblador
Evaluación de expresiones
Evaluación de expresiones
Argumento 1
Argumento 2
Argumento 3
Argumento 4
Temporal (no preservado entre llamadas)
Temporal (no preservado entre llamadas)
Temporal (no preservado entre llamadas)
Temporal (no preservado entre llamadas)
Temporal (no preservado entre llamadas)
Temporal (no preservado entre llamadas)
Temporal (no preservado entre llamadas)
Temporal (no preservado entre llamadas)
Salvado temporalmente (preservado entre llamadas)
Salvado temporalmente (preservado entre llamadas)
Salvado temporalmente (preservado entre llamadas)
Salvado temporalmente (preservado entre llamadas)
Salvado temporalmente (preservado entre llamadas)
Salvado temporalmente (preservado entre llamadas)
Salvado temporalmente (preservado entre llamadas)
Salvado temporalmente (preservado entre llamadas)
Temporal (no preservado entre llamadas)
Temporal (no preservado entre llamadas)
Reservado para el núcleo del S.O.
Reservado para el núcleo del S.O.
Puntero al área global (global pointer)
Puntero de pila (stack pointer)
Puntero de marco (frame pointer)
Dirección de retorno (return address)
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
29
Distribución de la memoria
◊ Organización convencional
◊ 3 partes:
• Segmento de código: 0x400000 (text segment)
• Segmento de datos: 0x10000000 (data segment)
• Segmento de pila: 0x7FFFFFFF (stack segment) $29
Segmento de pila
0x7FFFFFFF
Datos dinámicos
Datos estáticos
Segmento código
Reservado
0x10000000
0x00400000
0x00000000
◊ Ordenamiento de los bytes:
• Little endian
31
2
1 00
3
• Big endian
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
30
31
1
2 30
0
PROGRAMACIÓN EN ENSAMBLADOR
◊ 1 instrucción por línea
◊ 4 campos:
• Etiqueta (opcional)
• Código operación
• Operandos
• Comentario (opcional)
◊ Identificadores: Caracteres alfanuméricos + ‘_’ + ‘.’
◊ Palabras reservadas
◊ Etiquetas = identificador+’:’
◊ Directivas: Instrucciones SOLO para el ensamblador
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
31
Directiva
Alinea el siguiente dato en 2n bytes. Con n=0, se
desactiva la alineación de .half, .word, .float,
.double hasta la siguiente directiva .data
.ascii “str”
Almacena la cadena str en memoria sin car. nulo.
.asciiz “str”
Almacena str en memoria + car. número 0 (NULL)
.byte b1, …,bn
Almacena los bn en bytes de memoria consecutiva
.data <addr>
Almacena los elementos declarados a
continuación de la directiva a partir de la dir.
ADDR en el segmento de datos. Si no aparece se
toma la dir. por defecto.
.double d1, …,dn Almacena los dn doble words de coma flotante (64
bits) consecutivamente en memoria.
.end
Fin del programa
.float f1, …,fn Almacena los fn valores de coma flotante (32 bits)
consecutivamente en memoria.
.global símbolo Símbolo declarado como global. Se puede
referenciar desde otros archivos.
.half h1, …,hn
Alamcena las hn medias palabras (16 bits)
consecutivamente en memoria.
.space n
n bytes reservados en el segmento de datos
.text <addr>
Almacena los elementos declarados tras esta
directiva en el segmento de código a partir de la
dirección ADDR. Estos elementos solo pueden ser
palabras (.word) o instrucciones. Si no aparece
ADDR se toma la dirección por defecto.
.word w1, …,wn
Almacena las wn palabras (32 bits) en posiciones
consecutivas de memoria.
.align n
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
32
EJEMPLOS
Ejemplo 1:
Suma de los primeros 200 números.
En PASCAL:
i:=0; suma:=0;
REPETIR
i:=i+1;
suma:=suma+1;
HASTA QUE(i>=200)
i → $8, suma → $9
.data 0x10000000
.text
.global __start
__start: addi $8,$0,0
addi $9,$0,0
repeat: addi $8,$8,1
add $9,$9,$8
slti $10,$8,200
bne $10,$0,repeat
.end
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
#seg. de datos
#seg. Código
#Inicio del prog.
#i:=0
#suma:=0
#i:=i+1
#suma:=suma+i
#$10:=1 si i<200
#Si $10=1 ir rep.
33
Ejemplo 2:
Programa que cuenta la longitud de la palabra
“Fundamentos”+NULL almacenada a partir de la dirección
0x10000000. En $21 se debe almacenar la cadena.
.data 0x10000000
#Seg. de datos
.asciiz “Fundamentos”
.text
.global inicio #En SPIM __start
inicio: lui $20, 0x1000
ori $20, 0x0000
addi $21, $0, 0
bucle: lb $19, 0($20)
beq $0, $19, fin
addi $20, $20, 1
addi $21, $21, 1
j bucle
fin:
.end
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
#Carga parte alta
#Carga parte baja
#Inicializamos a 0
#Lectura byte de la cad.
#Si es 0 (NULL), fin
#Inc. para leer sig. car
#Inc. longitud
34
Ejemplo 3:
Programa que copia la longitud de la palabra
“Fundamentos” + NULL almacenada a partir de la dirección
0x10000000 a la dirección 0x100020A0
.data 0x10000000
#Seg. de datos
.asciiz “Fundamentos”
.data 0x100020A0
#Dirección destino
.space 12 (11+1)
#Espacio para copia
.text
.global inicio
#En SPIM __start
inicio: lui $20, 0x1000
ori $20, 0x0000
lui $21, 0x1000
ori $21, 0x20A0
bucle: lb $19, 0($20)
sb $19, 0($21)
beq $0, $19, fin
addi $20, $20, 1
addi $21, $21, 1
j bucle
fin:
.end
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
#Carga parte alta
#Carga parte baja
#Parte alta destino
#Parte baja destino
#Lectura byte de la cad.
#Copiamos caracter
#Si es 0 (NULL), fin
#Inc. para leer sig. car
#Siguiente car. destino
35
EJEMPLO 4:
Programa que cuenta los bits a 1 en una palabra de 32 bits
Palabra en registro $20. Resultado en registro $21.
.data 0x10000000
.text
.global __start
inicio: add $21, $0, $0
beq $20, $0, fin
addi $18, $0, 1
rotar: beq $18, $0, fin
and $19, $20, $18
sll $18, $18, 1
beq $19, $0, rotar
addi $21, $21, 1
j rotar
fin
.end
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
#Contador a 0
#Si no hay 1’s, fin
#Ponemos 1 en $18
#32 desplazamientos
#Extraer bit i-essimo
#Desplazar a la izq.
#Bit 0, no contamos
#Incrementamos cuenta
36
EJEMPLO 5:
Programa en ensamblador que concatene dos cadenas
acabadas en NULL.
El algoritmo debe copiarlas en una cadena destino.
Primero copia una y después copia la segunda a
continuación.
Para referenciar una posición de memoria usaremos
etiquetas en lugar de usar lui y ori. Las etiquetas apuntan
al inicio de las cadenas. Las direcciones las genera el
ensamblador.
cad1:
cad2:
dest:
.data 0x10000000
.asciiz “ensamblador”
.asciiz “ejemplo”
.space 19
.text
.global __start
inicio: add $16,$0,$0
lcad1: lb $17, cad1($16)
beq $17,$0,flcad1
sb $17,dest($16)
addi $16,$16,1
j lcad1
flcad: add $18,$0,$0
lcad2: lb $17,cad2($18)
sb $17,dest($16)
beq $17,$0, fin
addi $16,$16, 1
addi $18, $18, 1
j lcad2
fin:
.end
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
#Leer caracter cad. 1
#Si es 0, leer cad. 2
#Copiamos a destino
#Incrementamos indice
#Seguir leyendo cad. 1
#Lectura seg. cadena
#Leer carácter
#Copiar a destino
#Con NULL acabamos
#Incrementamos indice 1
#Inc. indice 2
37
EJEMPLO 6:
Dado un vector de 6 enteros de 32 bits en 0x10000000, no
indique cuantos elementos son mayores, menores e
iguales que el último elemento. Ubicar el resultado en
memoria, después de los elementos del vector y del
número de elementos.
.data 0x10000000
vector: .word 34, 21, 10, 5, 3, 10
nelem: .word 6
mayor: .word 0
menor: .word 0
igual: .word 0
.text
.global __start
inicio: lw $20,nelem($0)
addi $16,$0,4
mult $20,$16
mflo $16
addi $16,$16,-4
lw $8,vector($16)
add $18,$0,$0
bucle: addi $20,$20,-1
lw $21,vector($18)
addi $18,$18,4
si:
slt $7,$21,$8
bne $7,$0,ent
j snsa
ent:
lw $9,menor($0)
addi $9,$9,1
sw $9,menor($0)
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
#Leemos núm. elementos
#Tamaño en bytes
#Movemos lo a $16
#Indice última coponente
#Referencia en $8
#Indice para vector
#Dec. número elementos
#Leemos elemento vector
#Inc. indice
#$21<$8?
#Es menor, ir a ent
#No menor, igual o may?
#Leer menores
#Incrementar menores
#Escribir
38
j finb
snsa:
igua:
finb:
fin:
beq $21,$8,igua
lw $9,mayor($0)
addi $9,$9,1
sw $9,mayor($0)
j finb
lw $9,igual($0)
addi $9,$9,1
sw $9,igual($0)
beq $20,$0,fin
j bucle
.end
#Son iguales?
#Mayor. Leer mayores
#Leemos iguales
PROGRAMACIÓN MEDIANTE
SUBRUTINAS
◊ MIPS da soporte a las subrutinas mediante la
instrucción jal (jump and link).
◊ Almacena en $31 la dirección de retorno (PC)
◊ Sintaxis: jal Dirección
◊ Para finalizar: jr $31
$31:=D (PC+4)
PC:=rutina
rutina
D-4
D
jal rutina
instrucción
jr $31
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
39
◊ Llamadas anidadas?
• Solución: Usar la pila ($29)
• Almacenar en pila: Apilar o push
• Sacar de pila: Desapilar o pop
Por ejemplo:
Prog.
principal
Rutina 1
Rutina 2
Rutina 3
El compilador generará:
inicio: ……
jal Rut1
…
j fin
Rut1:
…
addi $29,$29,-4
sw $31, 0($29)
jal Rut2
lw $31,0($29)
addi $29,$29,4
…
jr $31
Rut2:
…igual que Rut1…
Rut3:
…
#Apilar
#Guardar dir. retorno
#Recuperar dirección
#Desapilar
#No hace falta apilar porque no
#hay llamada a subrutina
jr $31
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
40
fin:
.end
Paso de parámetros
◊ Por convención se usan $4, $5, $6, $7
◊ Para más parámetros se usa la pila
Preservación de registros
◊ Con rutinas anidadas, que pasa con $4…$7?
◊ Solución: Usar la pila
◊ Cuando se llama a una subrutina, que ocurre con los
valores actuales de los registros?
◊ Dos convenios:
• Guardar invocadora (caller save).
• Guardar invocada (callee save).
◊ En MIPS se usa el convenio callee save.
Guardar
Salto
Restaurar
Guardar
Rutina
Salto
Rutina
Restaurar
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
41
EJEMPLOS
Uso de subrutinas
PROCEDURE intercambia(var v:vector;k:integer);
VAR temp:integer;
BEGIN
temp:=v[k];
v[k]:=v[k+1];
v[k+1]:=temp;
END.
Registros: $15←temp, $4←v, $5←k
Algoritmo de ordenamiento de la burbuja
PROCEDURE ordena(var v:vector; n:integer);
VAR i,j:integer;
BEGIN
FOR i:=0 TO n-1 DO
BEGIN
j:=i-1;
WHILE(j>=0) AND (v[j]>v[j+1]) DO
BEGIN
intercambia(v,j);
j:=j-1;
END;
END;
END.
Registros: $19←i, $17←j, $4←v, $5←n
PASOS A SEGUIR:
1.Generar cuerpo de la rutina
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
42
2.Salvar los registros usados
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
43
Rutina de intercambio de elementos del vector:
1.- Cuerpo:
2
addi $14,$0,4
mult $5,$14
mflo $2
add $2,$4,$2
lw $15, 0($2)
lw $16, 4($2)
sw $16, 0($2)
sw $15, 4($2)
#$14=4
#lo=k*4
#$2=lo (k*4)
#$2=v+(k*4) v[k]
#$15(temp)=v[k]
#$16=v[k+1]
#v[k]=$16=v[k+1]
#v[k+1]=$15=temp
2.- Salvado de registros ($2,$14,$15,$16)
inter: addi $29,$29,-16
1
sw $2, 0($29)
sw $14, 4($29)
sw $15, 8($29)
sw $16, 12($29)
#Espacio para 4 pal
#Apilar $2
#Apilar $14
#Apilar $15
#Apilar $16
Recuperación de registros y retorno de subrutina
3
lw $2, 0($29)
lw $14, 4($29)
lw $15, 8($29)
lw $16, 12($29)
addi $29,$29,16
jr $31
#Desapila $2
#Desapila $14
#Desapila $15
#Desapila $16
#Vaciar pila
#Fin de subrutina
Rutina de ordenamiento de la burbuja:
• Necesita guardar los parámetros en otros registros
• Hay que implementar dos bucles anidados
• El bucle interno tiene dos condiciones
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
44
1.-Cuerpo:
ordena: (4)…Apilar registros usados
5
add $18,$4,$0
#Copia parámetro v
add $20,$5,$0
#Copia parámetro n
add $19,$0,$0
#i:=0
addi $21,$0,4
#$21=4
for:
slt $8,$19,$20
#$8=0 si i>=n
beq $8,$0,exitf
#Salir si i>=n
addi $17,$19,-1
#j:=i-1
while: slti $8,$17,0
#S8=1 si j<0
bne $8,$0,exitw
#Salir si j<0
mult $17,$21
#lo=j*4
mflo $15
#$15=lo (j*4)
add $16,$18,$15
#$16=v+j
lw $24,0($16)
#$24=v[j]
lw $25,4($16)
#$25=v[j+1]
slt $8,$25,$24
#$8=0 si $25>=$24
beq $8,$0,exitw
#Salir si v[j+1]>=v[j]
add $4,$18,$0
add $5,$17,$0
jal inter
#Parámetro v=v
#Parámetro k=j
addi $17,$17,-1
#j:=j-1
j while
#Repetir bucle while
exitw: addi $19,$19,1
#i:=i+1
j for
#Repetie bucle for
exitf: (6)…Desapilar todos los registros apilados
jr $31
#Retorno de subrutina
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
45
2.-Apilar - desapilar: $8,$15-$21, $24, $25, $31: total 11
4
6
addi $29,$29,-44
sw $8,0($29)
…
sw $31,40($29)
#Espacio para 11 pal.
#Apilar $8
lw $8,0($29)
…
addi $29,$29,44
#Desapilar $8
#Apilar $31
#Liberar espacio pila
Programa principal que llama a la rutina de la burbuja
v:
.data
.word
.word
.word
0x10000000
0x10000004
72,50,8
20,15
#Dirección vector
#Vector
.text
.global inicio
inicio: lw $4,v($0)
addi $5,$0,5
jal ordena
j fin
#Inicializa parámetro v
#Inicializa parámetro n
#Burbuja
#Salto al final
……CODIGO DE LAS RUTINAS……
fin:
.end
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
46
MANEJO DE DATOS EN COMA
FLOTANTE
◊ Standar IEEE 754
◊ Formatos simple (32 bits) y doble precisión (64 bits)
◊ Datos manejados por FPU
◊ 32 registros de 32 bits.
◊ Doble precisión: 2 registros consecutivos.
◊ Instrucciones de coma flotante SOLO con reg. pares
◊ Registro de control y estado
◊ Idea similar a procesador: carga y almacenamiento
◊ Operaciones en FPU y µP simultáneas
◊ Instrucciones con sufijo d (doble) y s (simple)
Instrucciones para coma flotante
FRdest, FRsrc1 y FRsrc2 registros de FPU PARES ($fn)
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
47
add.λ FRdest, FRsrc1, FRsrc2
λ ⇒ d (doble precisión) ó s (simple precisión)
sub.λ FRdest, FRsrc1, FRsrc2
abs.λ FRdest, FRsrc
Valor absoluto de FRsrc
mult.λ FRdest, FRsrc1, FRsrc2
div.λ FRdest, FRsrc1, FRsrc2
l.λ FRdest, direccion (ρ)
s.λ FRdest, direccion (ρ)
Carga y almacenamiento
mfc1 Rdest,FRscr
Mueve dato de FPU a CPU
mtc1 Rsrc,FRdest
Mueve dato de CPU a FPU
mfc1.d Rdest,FRscr (ρ)
Mueve datos de FRscr y FRscr+1 a Rdest y Rdest+1
mtc1.d Rsrc,FRdest (ρ)
Idem pero de CPU a FPU
c.x.λ FRscr1,FRscr2
Comparación de FRscr1 y FRscr2. Se activa el bit
correspondiente del reg. de estado del coprocesador. El bit
depende de la condición x: eq, neq, lt, le, gt, ge.
bc1t direccion #Salto si TRUE
bc1f direccion #Salto si FALSE
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
48
Ejemplo:
Suma de los elementos de un vector en coma flotante de
simple precisión. El vector empieza en 0x10000004.
.data 0x10000000
tam:
.word 4
vector: .float 3.1415, 2.7182
.float 1.0e+2, 6.5e-1
res:
.float 0.0
.text
.globl __start
inicio: addi $15,$0,0
#Indice
addi $17,$0,0
#Contador
lw $16,tam($0)
#Tamaño del vector
mtc1 $0, $f2
#0 a f2 (temporal)
bucle: l.s $f4,vector($15)#Leemos elem $15 vector
add.s $f2,$f2,$f4 #Sumamos elemento
addi $15,$15,4
#Increm. indice
addi $17,$17,1
#Increm. contador
slt $8,$17,$16
#Final?
bne $8,$0,bucle
#$8=1 implica $17<$16
s.s $f2,res($0)
#Almacenar resultado
fin:
.end
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
49
LLAMADAS AL SISTEMA
◊ Son llamadas al sistema operativo
◊ Facilitan la tarea del programador
◊ Ofrecen servicios como imprimir por pantalla o
introducir números y caracteres por teclado
◊ syscall
• Tipo de llamada en $2 ($v0)
• Parámetros en $4…$7 ($f12 con coma flotante)
• Ejecutar syscall.
• El resultado se devuelve en $2 o $f0
Servicio
Código
Parámetros
print_int
print_float
print_double
print_string
read_int
read_float
read_double
read_string
1
2
3
4
5
6
7
8
$4=entero
$f12=float
$f12=doble
$4=dir. cadena
sbrk
exit
9
10
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
$4=dir. buffer,
$5= longitud
$4=desplazam.
Resultado
$2 ← entero
$f0 ← float
$f0 ← doble
$2 ← dirección
50
EJEMPLO
Programa que calcula la potencia de dos números: ab
Para ensamblador, deberemos imprimir las cadenas y leer
los datos que el usuario introduzca con llamadas al
sistema.
.data 0x10000000
.asciiz “\nDame la base real:”
.asciiz “\nDame el exponente entero:”
.asciiz “\nEl resultado es:”
.text
.global inicio
inicio: addi $2,$0,4
#Código impresión
la $4, cad1
#dirección de cadena1
syscall
#Impresión
addi $2,$0,6
#Cod. lectura float
syscall
#Lectura base
addi $2,$0,4
#Cod. impresión
la $4, cad2
#dirección cadena2
syscall
#Impresión
addi $2,$0,5
#Cod. lectura entero
syscall
#Lectura exponente
cad1:
cad2:
cad3:
pot:
mfc1 $4,$f0
add $5,$0,$2
jal pot
mtc1 $2,$f12
addi $2,$0,4
la $4,cad3
syscall
addi $2,$0,2
syscall
addi $2,$0,10
syscall
.end
#Pasamos la base a $4
#Exponente en $5
#Llamada a rutina
#Resultado de $2 a $f12
#Código impresión
#Dirección cadena3
#Impresión
#Escritura float
#Escribimos $f12
#Cod. salida programa
addi $29,$29,-12
sw $9,0($29)
#Hacemos sitio en pila
#Apila $9
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
51
for:
exif:
s.s $f4, 4($29)
#Apila $f4
s.s $f6, 8($29)
#Apila $f6
addi $9,$0,2
#i:=2
mtc1 $4,$f4
#aux:=base
mtc1 $4,$f6
#$f6:=base
slt $10,$5,$9
#¿i>exponente?
bne $10,$0,exif
#salir si i>exponente
mul.s $f4,$f4,$f6 #aux:=aux*base
addi $9,$9,1
#i:=i+1
j for
mfc $2,$f4
#Devolvemos res en $2
lw $9,0($29)
#Desapilar $9
l.s $f4, 4($29)
#Desapilar $f4
l.s $f6, 8($29)
#Desapilar $f6
addi $29,$29, 12
#Restaurar pila
jr $31
#Fin subrutina
PROGRAMAS RECURSIVOS
◊ Rutina que se llama a si misma
◊ En cada llamada se usan los mismos registros y
direcciones de memoria
◊ Uso adecuado de la pila
Estructura de la pila
• Es necesario almacenar en la pila cierta información
• MIPS ofrece un modelo para hacer las llamadas de una
forma uniforme, que indica la estructura que debe tener
la pila:
1.Argumentos de la subrutina (más de 4)
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
52
2.Registros que se modifican en la subrutina y cuyo
valor se debe mantener
3.Variables locales.
$fp ($30)
+
Argumento 5
Argumento 6
...
Registros
guardados
Variables locales
$sp ($29)
-
Diseño (ejemplo factorial)
FUNCTION factorial(n:integer):integer;
BEGIN
IF(n<>0)THEN factorial:=n*factorial(n-1);
ELSE factorial:=1;
END;
Cada llamada debe guardar su propia pila. Suponemos
que tenemos el entero en $2 y que ya lo hemos leido del
usuario. El parámetro de factorial lo pasamos en $4:
……
addi $4,$2,0
jal fact
#Inicialización y lectura
#Parámetro introducido a $4
#Llamada principal
#Imprimir y terminar
addi $29,$29,-8
sw $4,4($29)
sw $31,0($29)
#Espacio para 2 palabras
#Almacena parámetro ($4)
#Almacena dir. retorno
……
fact:
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
53
lw $2,4($29)
bgtz $2,seguir
addi $2,$0,1
j volver
seguir: lw $3,4($29)
addi $4,$3,-1
jal fact
lw $3,4($29)
mult $2,$3
mflo $2
volver: lw $31,0($29)
addi $29,$29,8
jr $31
#Lectura argumento n ¿?
#Si n>0 llamarse
#Un 1 como resultado
#fin de recursión
#Lectura argumento n
#Parámetro n-1
#Llamada recursiva
#Lectura argumento n
#n*factorial(n-1) ($2)
#Resultado parcial
#Dirección de retotno
#Restaurar pila
#Retorno
REGULARIDAD Y ORTOGONALIDAD
◊ Regularidad: Conjunto de instrucciones uniformes sin
casos especiales. Simplifica la programación.
◊ Ortogonalidad: Cualquier operación se puede usar
con cualquier operando y cualquier modo de
direccionamiento.
◊ Los dos conceptos están muy unidos.
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
54
EJEMPLOS:
Programa que detecta cadenas capicuas.
Cálculo de la serie de fibonazzi.
Conversión a formato IEEE 754.
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
55
buffer:
cad:
si:
no:
__start:
long:
finlong:
bucle:
.data
.space 100
.asciiz "\nIntroduce la cadena:"
.asciiz "\nLa cadena es capicua"
.asciiz "\nLa cadena no es capicua"
.text
.globl __start
la $4,cad
addi $2,$0,4
syscall
addi $2,$0,8
la $4,buffer
addi $5,$0,100
syscall
add $11,$0,$0
addi $12,$0,10
lb $10,0($4)
beq $10,$12,finlong
addi $4,$4,1
addi $11,$11,1
j long
#Cálculo de la longitud
beq $11,$0,fin
addi $4,$4,-1
la $5,buffer
lb $10,0($4)
lb $12,0($5)
bne $10,$12,finno
#Cadena vacia
#Apuntar al ultimo char.
addi $4,$4,-1
addi $5,$5,1
addi $11,$11,-2
slti $13,$11, 2
bne $13,$0,finsi
j bucle
finsi:
la $4,si
addi $2,$0,4
syscall
j fin
finno:
la $4,no
addi $2,$0,4
syscall
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
#$13=1 si $11<2 --- fin
56
fin:
addi $2,$0,10
syscall
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
57
.data
.text
.globl __start
__start:
addi $2,$0,5
syscall
add $4,$0,$2
jal fibon
j fin
fibon:
addi $29,$29,-12
sw $10,8($29)
sw $4,4($29)
sw $31,0($29)
beq $4,$0,zero
slti $10,$4,2
bne $10,$0,un
addi $4,$4,-1
jal fibon
add $10,$0,$2
lw $4,4($29)
addi $4,$4,-2
jal fibon
add $2,$2,$10
jr finfibo
zero:
add $2,$0,$0
jr finfibo
un:
addi $2,$0,1
finfibo:
lw $31,0($29)
lw $4,4($29)
lw $10,8($29)
addi $29,$29,12
jr $31
fin:
add $4,$0,$2
add $2,$0,1
syscall
addi $2,$0,10
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
58
syscall
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
59
flotant:
string:
número
cad:
return:
__start:
.data
.float 103.487
.byte 0,0,0,0,0,0,0,0,0
#Espacio para almacenar el
.asciiz "\nIntroduce el número en coma flotante:"
.asciiz "\nEl número en formato IEEE754 es (en Hex.):\n"
.text
.globl __start
la $4,cad
addi $2,$0,4
syscall
addi $2,$0,6
syscall
mov.s $f12, $f0
addi $2, $0, 2
syscall
#Impresión de la cadena “cad”
#Lectura de número en coma flotante
#Impresión del número
mfc1 $4, $f0
#Llevmos el número del copro a la
addi $5, $0, 16
#CPU para su visualización
addi $6, $0, 7
bucle:
divu $4, $5
#Conversión a hexadecimal
mfhi $7
#Dividiendo por 16 sucesivamente
sb $7, string($6)
#Y almacenando los resultados en
addi $6, $6, -1
#el espacio reservado en orden
mflo $4
#inverso: primera división dígito
bne $4,$0,bucle
#menos significativo
add $6, $0, $0
addi $10, $0, 8
loop:
lb $4, string($6)
#Conversión de la cadena de digitos
slti $5, $4, 10
#hex. en sus correspondientes
bne $5, $0, menorde10
#caracteres ASCII para poderlos
#Imprimir
majorde10:addi $4, $4, 55
#Si el dígito es mayor de 9
j finloop
#sumamos 55 a su valor para convertir
#en los caracteres de ‘A’ a ‘F’.
menorde10:addi $4, $4, 48
#Si esta entre 0 y 9, sumamos 48 para
#Convertir en caracteres ‘0’ a ‘9’.
finloop: sb $4, string($6)
addi $6, $6, 1
beq $6, $10, fin
#Repetimos para todos los dígitos
j loop
fin:
la $4,return
addi $2,$0,4
syscall
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
#Imprimimos la cadena return
60
la $4,string
addi $2,$0,4
syscall
addi $2,$0,8
la $4,cad
addi $5,$0,2
syscall
#Imprimimos la cadena correspondiente
#al numero convertido
addi $2,$0,10
syscall
#Fin del programa
FUNDAMENTOS DE COMPUTADORES
Tema 3. Lenguaje Ensamblador
#Esperamos la pulsacion de una tecla
61
Descargar