Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Computadoras
Lenguaje Ensamblador
Lenguaje Ensamblador
• Introducción.
• Ventajas e inconvenientes del lenguaje
ensamblador.
3 Arquitectura de Computadoras
Ventajas e inconvenientes
del lenguaje ensamblador
• Inconvenientes del lenguaje ensamblador
• Los programas son específicamente inherentes a la
máquina.
• Son de mayor tamaño que los programas equivalentes
escritos en lenguaje de alto nivel. Menor productividad
del desarrollo software.
• Los programas son difíciles de leer, escribir y pueden
contener más errores.
• Soluciones híbridas para aprovechar la fortaleza de
cada lenguaje
• La mayor parte del programa se escribe en alto nivel.
• Las secciones críticas en lenguaje ensamblador.
4 Arquitectura de Computadoras
Funcionamiento del
Ensamblador
• Un ensamblador traduce un archivo con sentencias
en lenguaje ensamblador a un archivo de
instrucciones máquina y datos binarios.
5 Arquitectura de Computadoras
Funcionamiento del
Ensamblador
• Segunda pasada:
• Traduce cada sentencia del lenguaje ensamblador al
combinar los equivalentes numéricos de los códigos de
operación, especificadores de registros y rótulos de la
tabla de símbolos en una instrucción legal.
• Rótulos o etiquetas
• Externos o globales: Pueden ser referenciados desde
otro archivo distinto de aquél en el que se define (hay
que declararlos como tales).
7 Arquitectura de Computadoras
El montador de enlaces
(linker)
8 Arquitectura de Computadoras
Utilidades de los
Ensambladores
• Los ensambladores proporcionan diversas
características (utilidades) que facilitan al
programador la escritura de los programas.
• Utilidades:
• Directivas para organizar datos en memoria.
9 Arquitectura de Computadoras
Utilidades de los
Ensambladores
• Utilidades:
• Macros
• Permiten nombrar una secuencia de instrucciones
frecuentemente utilizada. No confundir con procedimiento o
subrutina.
• Pseudoinstrucciones
• Son proporcionadas por algunos lenguajes ensambladores y
no forman parte del repertorio de instrucciones del
procesador. El ensamblador las sintetiza a partir de
instrucciones puras del procesador.
• Utilización de símbolos
• Muy útil en instrucciones de control de flujo o para hacer
referencia a los datos.
10 Arquitectura de Computadoras
Lenguaje Ensamblador
MIPS R2000
• Componentes de un procesador MIPS
• Modos de direccionamiento
• Sintaxis del ensamblador
• Directivas del ensamblador soportadas por el
simulador SPIM.
11 Arquitectura de Computadoras
Lenguaje Ensamblador
MIPS R2000
• Repertorio de instrucciones
• Aritméticas
• Lógicas
• Transferencia de datos
• Movimiento de datos
• Comparación
• Salto y bifurcación
13 Arquitectura de Computadoras
Uso de Memoria en MIPS
14 Arquitectura de Computadoras
Modos de
Direccionamiento
15 Arquitectura de Computadoras
Sintaxis del Ensamblador
• Líneas de comentarios
• Todo lo que haya a partir del simbolo # hasta el final de
línea se ignora.
• Directivas
• Secuencia de caracteres, (_) y (.) que no empiezan por
un número.
• Etiquetas
• Se declaran colocándolas al principio de línea y
terminadas en (:).
16 Arquitectura de Computadoras
Sintaxis del Ensamblador
• Número decimales y hexadecimales
• Números en base 10 por defecto.
• Cadenas o strings
• Las cadenas están encerradas entre dos comillas (“).
• Caracteres especiales:
• \n Nueva línea
• \t Tab
• \” Comillas
17 Arquitectura de Computadoras
Ejemplo de Sintaxis
############################################################################
# Sintaxis del ensamblador #
############################################################################
.data 0x10000000
init: .word 0x10,25,0x11223344 # declaración de 3 variables tipo word (4 bytes)
18 Arquitectura de Computadoras
Directivas del
Ensamblador
SPIM de las directivas del
• SPIM soporta un subconjunto
ensamblador MIPS
19 Arquitectura de Computadoras
Formato de Instrucciones
• Solo tres formatos
20 Arquitectura de Computadoras
Instrucciones Aritméticas
21 Arquitectura de Computadoras
Instrucciones Lógicas
22 Arquitectura de Computadoras
Instrucciones de
Transferencias de Datos
23 Arquitectura de Computadoras
Instrucciones de
Movimiento de datos
24 Arquitectura de Computadoras
Instrucciones de
Comparación
25 Arquitectura de Computadoras
Instrucciones de Salto y
Bifurcación
26 Arquitectura de Computadoras
Operaciones Aritméticas
• En las siguientes transparencias se muestran varios
ejemplos en ensamblador MIPS para realizar
operaciones aritméticas.
• Operaciones de 3 direcciones.
• La expresión en C:
• int a, b, c;
c = a + b;
28 Arquitectura de Computadoras
Operaciones Aritméticas
• ¿Cómo se traduce en ensamblador la expresión en
C?
• int a, b, c, d, e;
a = b + c + d + e;
29 Arquitectura de Computadoras
Operaciones Aritméticas
• ¿Cómo se traduce en ensamblador la expresión en
C?
• int a, b, c, d, e;
a = (b + c) - (d + e);
30 Arquitectura de Computadoras
Acceso a Memoria
• Estructuras de datos.
31 Arquitectura de Computadoras
Acceso a Memoria:
Organización
• El bus de datos del MIPS es de 32 bits.
Es posible direccionar cada byte individualmente.
múltiplo de 4 0 0 1 2 3
Restricción de alineación
Dir. Bytes
32 Arquitectura de Computadoras
Acceso a Memoria:
Ejemplos
• ¿Cómo se traduce en ensamblador la expresión en
C?
• int a, b, V[40];
a = b + V[8];
33 Arquitectura de Computadoras
Acceso Memoria:
Ejemplos
• ¿Cómo se traduce en ensamblador la expresión en
C?
• int a, b, V[40], i;
a = b + V[i];
34 Arquitectura de Computadoras
Codificación en Lenguaje
de Máquina
• Dentro del ordenador sólo hay 0’s y 1’s.
Las instrucciones han de codificarse en binario.
• Por ejemplo:
add $t0, $s1, $s2
Se traduce en una secuencia de 32 1’s y 0’s:
000000 10001 10010 01000 00000 100000
35 Arquitectura de Computadoras
Codificación en Lenguaje
de Máquina
36 Arquitectura de Computadoras
Codificación en Lenguaje
de Máquina
37 Arquitectura de Computadoras
Codificación en Lenguaje
de Máquina
• ¿Cómo es el código máquina de la expresión en C?
int a, V[400];
V[300] = V[300] + a;
38 Arquitectura de Computadoras
Codificación en Lenguaje
de Máquina
• La codificación en binario es:
39 Arquitectura de Computadoras
Toma de Decisiones
40 Arquitectura de Computadoras
Toma de Decisiones:
Ejemplo
• ¿Cómo se traduce en ensamblador la expresión en
C?
int a, b, c, i, j;
if(i == j) goto L1;
b = b + c;
L1: a = b - c;
41 Arquitectura de Computadoras
Toma de Decisiones:
Ejemplo
• int a, b, c, i, j;
if(i == j){
a = b + c;
}else{
a = b - c;
}
44 Arquitectura de Computadoras
Toma de Decisiones:
Menor que
• Las comparaciones más habituales en los
programas son la igualdad y la desigualdad.
45 Arquitectura de Computadoras
Toma de Decisiones:
Ejemplo
• int a, b, c, i, j;
if(i >= j){
a = b + c;
}
46 Arquitectura de Computadoras
Llamada a Funciones
47 Arquitectura de Computadoras
Llamada a Funciones
• Para poder ejecutar una función es necesario:
1. Situar los parámetros donde la función llamada
pueda leerlos. a0-a3, pila
2. Transferir el control a la función llamada.
3. Reservar espacio para las variables locales.
t0-t9, pila.
4. Realizar la tarea necesaria.
5. Situar el resultado donde la función llamante
pueda leerlos. v0-v1, pila
6. Devolver el control a la función llamante.
Estructura
48 Arquitectura de Computadoras
Llamada a Funciones:
Instrucción jal
• Al transferir el control a la función es necesario
guardar la dirección de retorno.
49 Arquitectura de Computadoras
Llamada a Funciones:
Instrucción jr
• Para volver de una función es necesario saltar a
la dirección almacenada en ra
• Formato: jr registro
• Funcionamiento: Salta a la dirección almacenada
en el registro.
50 Arquitectura de Computadoras
Llamada a Funciones:
Ejemplo
• int funHoja(int g, int h, int i, int j)
{
int f;
f = (g + h) - (i + j);
return f;
}
54 Arquitectura de Computadoras
Llamada a Funciones:
Bloque de Activación
• La pila crece y decrece durante la ejecución de la
función para:
• Evaluar expresiones.
• Guardar registros.
55 Arquitectura de Computadoras
Llamada a Funciones: Paso
de Argumentos por la Pila
• Si hay más de 4 parámetros o alguno de éstos no
cabe en registros se pasan por la pila.
56 Arquitectura de Computadoras
Manejo de Caracteres
• Los caracteres se codifican en ASCII.
• Un carácter ASCII ocupa 1 byte.
• El MIPS dispone de dos instrucciones para cargar y
almacenar bytes:
• lb (load byte). Lee un byte de la memoria y lo
almacena en los 8 bits menos significativos del
registro destino. Ej. lb $t0, 0($s0).
• sb (store byte). Almacena los 8 bits menos
significativos del registro origen en la memoria.
Ej. sb $t0, 0($s0).
• Los caracteres pueden estar en cualquier posición
de memoria.
57 Arquitectura de Computadoras
Manejo de Caracteres:
Ejemplo
• El siguiente ejemplo muestra la función strcpy de
C:
void strcpy(char dest[], char orig[])
{
int i;
i = 0;
/*Copia y comprueba final*/
while( (dest[i] = orig[i]) != NULL){
i++;
}
}
59 Arquitectura de Computadoras
Aritmética: Números con y
sin Signo
• El MIPS trabaja con “ristras” de 8, 16 o 32 bits.
• Estas ristras de bits pueden representar, entre otras
cosas:
60 Arquitectura de Computadoras
Aritmética: Números con y
sin Signo
• Cuando se carga un número con signo de 16 u 8
bits en un registro de 32, es necesario extender el
bit designo. Ej:
• -1 en 8 bits es 11111111
61 Arquitectura de Computadoras
Aritmética: Números con y
sin Signo
• Las instrucciones de carga vistas hasta ahora cargan
números con signo:
62 Arquitectura de Computadoras
Aritmética: Números con y
sin Signo
63 Arquitectura de Computadoras
Aritmética: Números con y
sin Signo
• Las instrucciones de comparación son distintas para
números con signo o sin signo:
65 Arquitectura de Computadoras
Aritmética: Suma y Resta
66 Arquitectura de Computadoras
Aritmética: Suma y Resta
• MIPS dispone de dos tipos de instrucciones para la
suma y la resta en función del tratamiento del
desbordamiento.
67 Arquitectura de Computadoras
Aritmética: Suma y Resta
68 Arquitectura de Computadoras
Aritmética: Suma y Resta
69 Arquitectura de Computadoras
Aritmética: Multiplicación
• El MIPS dispone de dos instrucciones para
multiplicar: mult (con signo) o multu (sin signo).
70 Arquitectura de Computadoras
Aritmética: División
71 Arquitectura de Computadoras
Aritmética Ejemplo:
(a0+a1)*a2/a3
1 func: beq $a3, $zero, Error
2 add $t0, $a0, $a1
3 mult $t0, $a2
4 mflo $t0
5 mfhi $t1
6 slt $t2, $t0, $zero #res<0?
7 bne $t2, $zero, Nega
8 bne $t1, $zero, Error #res>0
9 j L1
10 Nega: sltiu $t2, $t1, -1 # -1=0xffff
11 bne $t2, $zero, Error
12 L1: div $t0, $a3
13 mflo $v0
14 add $v1, $zero, $zero
15 jr $ra
16 Error: addi $v1, $zero, 1
17 jr $ra
72 Arquitectura de Computadoras
Aritmética y Lógica
• Aparte de la +,-,* y /, el MIPS dispone de una serie
de operaciones lógicas y aritméticas adicionales:
74 Arquitectura de Computadoras
Aritmética y Lógica:
Ejemplo
• int a, V[100], i, j, k;
while(V[i] == k){
i = i + j;
}
76 Arquitectura de Computadoras
Ejemplo1 (Repita para)
# for (i=0; i<N ; i++)
#{
# x=x+i;
#}
.data
i: .word 0
N: .word 19,35,23
x: .word -2
.text
.globl main
main: lw $t0, i($zero) # i <- $t0
lw $t1, N($zero) # N <- $t1
lw $t2, x($zero) # x <- $t2
OtraLabel: # Emulación for
bge $t0, $t1, Salto # i<N
add $t2, $t2, $t0 # cuerpo del ciclo for
addi $t0, $t0, 1 # i++
j OtraLabel # loop para volver a evaluar {}
Salto: j Salto
77 Arquitectura de Computadoras
Ejemplo 2 (Caso de)
# switch a
# case a0: x=x+a0;
# break;
# case a1: x=x+a1;
# break;
# case a2: x=x+a2;
# break;
# default: x=a0+a1+a2;
# break;
.data
a: .byte 10
a0: .half 1
a1: .half 2
a2: .half 3
x: .word -1
.text
.globl main
78 Arquitectura de Computadoras
Ejemplo 2 (Caso de)
main:
lb $t0,a($zero) # $t0 <- a
lh $t1,a0($zero) # $t1 <- a0
lh $t2,a1($zero) # $t2 <- a1
lh $t3,a2($zero) # $t3 <- a2
lw $t4,x($zero) # $t4 <- x
beq $t0, $t1, Casea0
beq $t0, $t2, Casea1
beq $t0, $t3, Casea2
j Casedf
Casea0:
add $t4,$t4,$t1 # x=x+a0
j EndCase
Casea1:
add $t4,$t4,$t2 # x=x+a1
j EndCase:
79 Arquitectura de Computadoras
Ejemplo 2 (Caso de)
Casea2:
add $t4,$t4,$t3 # x=x+a2
j EndCase
Casedf:
add $t4,$t1,$t2 # x=a0+a1
add $t4,$t4,$t3 # x= x+a3
j EndCase
EndCase:
li $v0, 10 # Procedimiento estándar de término programa
syscall
li $v0, 1
move $a0,$t4
syscall
80 Arquitectura de Computadoras
Ejemplo 3 (contar letras de
una cadena)
.data
frase: .asciiz "123456789012345678901234567890"
letras: .byte 0
i: .byte 0
msg1: .asciiz "Ingrese un texto: "
msg2: .asciiz "La frase: "
msg3: .asciiz "Tiene "
msg4: .asciiz " letras a."
.text
.globl main
main:
# Rutina para imprimir msg1
la $a0, msg1 #Doy la dirección donde parte el string a imprimir
li $v0, 4 #almaceno un 4 en $v0 que es la llamada para
#imprimir un string
syscall #hago la llamada
81 Arquitectura de Computadoras
Ejemplo 3 (contar letras de
una cadena)
# Rutina para leer frase desde consola
li $v0, 8 #carga el syscal para leer un String
li $a1,29 #leer maximo 29 caracteres
la $a0,frase
syscall
lb $t2,i($zero) #guarda i en $t2 e inicializa
add $t2,$zero,$zero
lb $t1,letras($zero) #guarda letras en $t2 e inicializa
add $t1,$zero,$zero
addi $t4,$zero,97 #almacena en $t4 ascii de a
addi $t5,$zero,65 #almacena en $t4 ascii de A
loop: lb $t3,frase($t2) #lee i-esima letra
beq $t3,$t4,Era_a #compara la letra leida con a y A
beq $t3,$t5,Era_A
beq $t3,$zero, Salir #compara con 0 para saber si termino
j imasmas
Era_a: addi $t1,$t1,1 #incrementa cantidad de letras
j imasmas
Era_A: addi $t1,$t1,1 #incrementa cantidad de letras
j imasmas
imasmas: addi $t2,$t2,1 #incrementa posicion del indice
j loop #al string leido
82 Arquitectura de Computadoras
Ejemplo 3 (contar letras de
Salir:
una cadena)
# Rutina para imprimir msg2
la $a0, msg2 #Doy la dirección donde parte el string a imprimir
li $v0, 4 #almaceno un 4 en $v0 que es la llamada para imprimir un string
syscall #hago la llamada
# Rutina para imprimir frase
la $a0, frase #Doy la dirección donde parte el string a imprimir
li $v0, 4 #almaceno un 4 en $v0 que es la llamada para imprimir un string
syscall #hago la llamada
# Rutina para imprimir msg3
la $a0, msg3 #Doy la dirección donde parte el string a imprimir
li $v0, 4 #almaceno un 4 en $v0 que es la llamada para imprimir un string
syscall #hago la llamada
# Rutina para imprimir un entero
move $a0, $t1 #Doy la dirección donde parte el string a imprimir
li $v0, 1 #almaceno un 4 en $v0 que es la llamada para imprimir un string
syscall #hago la llamada
# Rutina para imprimir msg4
la $a0, msg4 #Doy la dirección donde parte el string a imprimir
li $v0, 4 #almaceno un 4 en $v0 que es la llamada para imprimir un string
syscall #hago la llamada
li $v0, 10
syscall
83 Arquitectura de Computadoras
Más Información
• En este tema sólo se han mostrado algunas de las
instrucciones disponibles en el MIPS.
84 Arquitectura de Computadoras