Está en la página 1de 16

Ingeniería en Electrónica y Comunicaciones

Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 1
Facultad de Ingeniería

Alumno: Andrés Alejandro Martínez Guerrero Materia: SED0

Tema: Introducción al Lenguaje Ensamblador

Objetivo:

Comprender el funcionamiento de las instrucciones.

Objetivos específicos:
 Describir el funcionamiento de lenguaje ensamblador.

 Utilizar instrucciones básicas en lenguaje ensamblador.

 Construir en un entorno de simulación por computadora para el estudio, un programa


en lenguaje ensamblador

1.0 Primera Parte:


Introducción Teórica

1.1 Introducción al funcionamiento de ensamblador

Una computadora como máquina electrónica sólo entiende señales eléctricas, lo que
en electrónica digital se corresponde con apagado y encendido. Por lo tanto, el alfabeto
capaz de ser comprendido por un computador se corresponde con dos dígitos: el 0 y el 1
(alfabeto binario).
Las órdenes que queramos proporcionar al computador serán un conjunto de 0s y 1s
con un significado conocido de antemano, que el computador podrá decodificar para
realizar su funcionalidad. El nombre para una orden individual es instrucción.
Programar un computador a base
de 0s y 1s (lenguaje máquina) es un
trabajo muy laborioso y poco
gratificante. Por lo que se ha inventado
un lenguaje simbólico (lenguaje
ensamblador) formado por órdenes
sencillas que se pueden traducir de
manera directa al lenguaje de 0s y 1s
que entiende el computador.
El lenguaje ensamblador requiere que
el programador escriba una línea para
cada instrucción que desee que la
máquina ejecute, es un lenguaje que
fuerza al programador a pensar como la máquina.
Si se puede escribir un programa que traduzca órdenes sencillas (lenguaje
ensamblador) a ceros y unos (lenguaje máquina), ¿qué impide escribir un programa que
traduzca de una notación de alto nivel a lenguaje ensamblador? Nada. De hecho,
actualmente la mayoría de los programadores escriben sus programas en un lenguaje,
que podíamos denominar más natural (lenguaje de alto nivel: C, pascal, FORTRAN…). El
lenguaje de alto nivel es más sencillo de aprender e independiente de la arquitectura
hardware sobre la que se va a terminar ejecutando. Estas dos razones hacen que
desarrollar cualquier algoritmo utilizando la programación de alto nivel sea mucho más
rápido que utilizando lenguaje ensamblador. Los programadores de hoy en día deben su
productividad a la existencia de un programa que traduce el lenguaje de alto nivel a
lenguaje ensamblador, a ese programa se le denomina compilador.
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 2
Facultad de Ingeniería

C = A + B; Lenguaje de alto nivel


COMPILADOR
ADD C, A, B Lenguaje ensamblador
ENSAMBLADOR + ENLAZADOR
1000110010100000 Lenguaje máquina
Figura 1.1 Proceso de generación de órdenes procesables por un
computador.

1.2 Introducción a la arquitectura ARM

Los procesadores de la familia ARM tienen una arquitectura RISC de 32 bits, ideal
para realizar sistemas empotrados de elevado rendimiento y reducido consumo, como
teléfonos móviles, PDAs, consolas de juegos portátiles, etc. Tienen las características
principales de cualquier RISC:

- Un banco de registros.
- Arquitectura load/store, es decir, las instrucciones aritméticas operan sólo sobre
registros, no directamente sobre memoria.
- Modos de direccionamiento simples. Las direcciones de acceso a memoria
(load/store) se determinan sólo en función del contenido de algún registro y el
valor de algún campo de la instrucción (valor inmediato).
- Formato de instrucciones uniforme. Todas las instrucciones ocupan 32 bits con
campos del mismo tamaño en instrucciones similares.

La arquitectura ARM sigue un modelo Von Neumann con un mismo espacio de


direcciones para instrucciones y datos. Esta memoria es direccionable por byte y está
organizada en palabras de 4 bytes.
En modo usuario son visibles 15 registros de propósito general (R0-R14), un
registro contador de programa (PC), que se denomina también para esta arquitectura
como R15, y un registro de estado (CPSR). Todas las instrucciones pueden direccionar
y escribir cada uno de los 16 registros en cada momento. El registro de estado, CPSR,
debe ser manipulado por medio de instrucciones especiales.
El registro de estado, CPSR, almacena información adicional necesaria para
determinar el estado del programa, por ejemplo el signo del resultado de alguna
operación anterior o el modo de ejecución del procesador. Es el único registro que
tiene restricciones de acceso. Está estructurado en campos con un significado bien
definido: flags, extensión (reservados) y control, como ilustra la Figura 1.2. El campo de
flags contiene los indicadores de condición y el campo de control contiene distintos
bits que sirven para controlar el modo de ejecución. La Tabla 1.1 describe el significado
de cada uno de los bits de estos campos. Como podemos ver, algunos bits están
reservados para uso futuro, y por tanto, no son modificables (siempre se leen como
cero). Los bits N, Z, C y V (indicadores de condición) son modificables en modo usuario,
mientras que los otros bits sólo son modificables en los modos privilegiados.
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 3
Facultad de Ingeniería

Figura 1.2. Registro de Estado del ARM (CPSR)

Tabla 1.1. Descripción del significado de los bits de condición


Bi Significado
N Indica si la última operación dio como resultado un valor negativo (N = 1) o
positivo (N = 0)
Z Indica si el resultado de la última operación fue cero (Z = 1)
C Su valor depende del tipo de operación:
- Para suma o comparación, C = 1 si hubo carry
- Para las operaciones de desplazamiento toma el valor del bit
V En el caso de una suma o una resta V = 1 indica que hubo overflow

1.3 Repertorio de instrucciones

Dividiremos las instrucciones del repertorio en cuatro


grupos:
o Aritmético-lógicas
o Multiplicación
o Acceso a memoria
o Salto

1.3.1 Instrucciones aritmético-lógicas:


En este apartado veremos las instrucciones que usan la unidad aritmético-lógica
(ALU) del procesador. No incluimos las instrucciones de multiplicación, que veremos
más adelante, ya que se ejecutan en otro módulo. En general, además de escribir el
resultado en el registro destino cualquier instrucción puede modificar los flags de
estado.

La sintaxis de las instrucciones aritmético-lógicas es la siguiente:

Instrucción {S} Rd, Rn1, Rn2 @ Rd ← Rn Oper N

Donde :
Instrucción: alguno de los mnemotécnicos de la tabla 1.3
S: si se incluye este campo la instrucción modifica los indicadores (flags) de condición
de CPSR.
Rd: registro destino (donde se almacena el resultado)
Rn: registro fuente (primer operando). Todas las instrucciones menos MOV.
Rn2 ó N: segundo operando, denominado shifter_operand. Es muy versátil, pero de
momento nos conformaremos con dos posibles modos de direccionamiento: un registro o un
inmediato.
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 4
Facultad de Ingeniería

Tabla 1.2: Instrucciones aritmético-lógicas más comunes

La Tabla 1.3 ejemplifica las instrucciones aritmético-lógicas más comunes. La mayor parte
son instrucciones de dos operandos en registro que escriben su resultado en un tercer
registro. Algunas como MOV tienen sólo un operando. Otras, como CMP, no escriben el
resultado en registro, sólo modifican los bits del CPSR

Tabla 1.3. Ejemplos de instrucciones aritmético-lógicas


ADD R0, R1, #1 R0 = R1 + 1
ADD R0, R1, R2 R0 = R1 + R2
MOV R10, #5 R10 = 5
SUB R0, R2, R3 R0 = R2 – R3
SUBS R0, R2, R3 R0 = R2 – R3 y actualiza N, Z, C y V convenientemente
CMP R4, R5 Compara R4 con R5 actualizando N y Z convenientemente

1.3.2 Instrucciones de multiplicación:

Hay diversas variantes de la instrucción de multiplicación debido a que al multiplicar


dos datos de n bits necesitamos 2n bits para representar correctamente cualquier
resultado, y a que se dispone de multiplicaciones con y sin signo. Las principales
variantes se describen en la Tabla
1.4. Todas las instrucciones pueden modificar opcionalmente los bits Z y N del registro
de estado en función de que el resultado sea cero o negativo si se les pone el sufijo S.
Los operandos siempre están en registros y el resultado se almacena también en uno o
dos registros, en función del tamaño deseado (32 o 64 bits).
Tabla 1.4. Instrucciones de multiplicación
Mnemotécnico Operación
Multiplicación, resultado 32 bits:
MUL Rd, Rm, Rs
Rd <-(Rm*Rs) [31..0]
Multiplicación más suma, 32 bits:
MLA Rd, Rm, Rs, Rn
Rd <-(Rm*Rs + Rn) [31..0]
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 5
Facultad de Ingeniería

Multiplicación con signo (C2), resultado 64 bits:


SMULL RdLo, RdHi, Rm,
RdHi <-(Rm*Rs) [63..32]; RdLo <-(Rm*Rs) [31..0]
Rs
Multiplicación sin signo (binario puro), 64 bits:
UMULL RdLo, RdHi, Rm,
RdHi <-(Rm*Rs) [63..32]; RdLo <-(Rm*Rs) [31..0]
Rs

Tabla 1.5. Ejemplos de instrucciones de multiplicación


MUL R0, R1, R2 R0 = R1 x R2
MLA R0, R1, R2, R3 R0 = (R1 x R2) + R3
MULS R5, R8, R9 R5 = R8 x R9 y actualiza N, Z, C y V convenientemente
UMULL R0, R1, R2, R3 R0 = R2 x R3 [31 … 0] y R1 = R2 x R3 [63 … 32]

2.0 SEGUNDA PARTE

Introducción a entorno de Simulación de


lenguaje Ensamblador con VisUAL-ARM
2.1 Elementos de la ventana principal.
La ventana principal de la aplicación en entrono para GUI de el programa VisUAL (figura
2.1) contiene una barra de herramientas, una vista de editor de código, una vista de registro,
una vista de ciclo de reloj y una vista de bit de estado, para poder manipular y verificar un
programa que se desarrolle para un dispositivo ARM , controlando cada interacción que
tiene en cada ciclo de reloj.

Figura 2.1 Pantalla de trabajo del entorno de VisUAL –ARM


Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 6
Facultad de Ingeniería

2.1.1 Barra de herramientas


La barra de herramientas tiene dos grupos de botones: botones de utilidad y botones de
depuración. También contiene una barra de estado que proporciona información sobre el
estado del emulador.

2.1.2 Utilidad Botones

Estos botones proporcionan acceso a las funciones de administración de archivos, el


panel Configuración y una caja de herramientas. Las funciones son las siguientes:

Botón Acción Atajo

New-Nuevo Crear nuevo archivo Shortcut+N

Open -Abierto Abrir un archivo existente Shortcut+O

Save -Salvar Guardar cambios Shortcut+S

Settings - Ajustes Abrir el panel de configuración Shortcut+,

Tools - Herramientas> Automáticamente re-indents código Shortcut+Alt+I


Código de index automático mecanografiado

Herramientas> Ver Abre una ventana que muestra el contenido de Shortcut+Alt+C


contenido de la memoria la memoria

Herramientas> Ver símbolos Abre una ventana que muestra todos los Shortcut+Alt+Y
símbolos definidos

Shortcut es Ctrl para Windows y Linux, y Cmd para Mac OS X.

2.1.3 Botones de depuración

Estos botones proporcionan acceso a la funcionalidad de depuración de la aplicación. A


continuación se presenta un resumen de estas funciones. Para obtener más detalles,
consulte la Guía de depuración .
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 7
Facultad de Ingeniería

Botón Acción Atajo

Execute-Ejecutar Ejecutar al punto de interrupción o al final del archivo F5

Reset -Reiniciar Restablecer el emulador F6

Step Backwards -Paso hacia atrás Retrocede una línea F7

Step Fowards Paso adelante Avance una línea F8

2.2 Barra de estado


La barra de estado proporciona información útil sobre el estado del emulador. Consiste en
un mensaje de estado, un número de línea y el número de problemas. Ejemplos de todos
los estados posibles son los siguientes:

Estado Ejemplo Descripción

Off-Apagado Emulación inhabilitada

Analysung-Analizando El código está siendo preparado para


la emulación

Running-Corriendo La emulación está en curso

Resetting-Restablecimiento Emulador se está restableciendo

Browsing -Búsqueda en Historial de navegación con el Step


histórico Backwards
O registrar la navegación del
historial.

Complete -Completar La emulación ha finalizado


correctamente

Breakpoint- Punto de La emulación se pausa debido a


interrupción un punto de interrupción

Sytantx Errror -Error de Emulación cancelada debido a error


sintaxis (s) de sintaxis

Runtime Error- Error de Emulación cancelada debido a


tiempo de ejecución un error de tiempo de ejecución

2.3 Editor de código


Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 8
Facultad de Ingeniería

El editor de código proporciona resaltado de sintaxis para los programas ARM


Assembly. Los puntos de interrupción se pueden agregar haciendo clic en un número de
línea. Los números de línea se resaltan en función de su estado de ejecución. Los botones
de visualización se muestran en línea con el código como una superposición en el editor de
código.

2.3.1 Temas
Puede elegir entre dos temas en el panel Configuración. El valor predeterminado es un
tema Oscuro, pero también está disponible un tema de Luz .

2.3.2 Encontrar y reemplazar

Encontrar y reemplazar la funcionalidad está disponible y puede ser activado


por Shortcut+F , donde el Shortcut es Ctrl en Windows y Linux y Cmd en Mac OS X.

2.4 Visor de Registros-


VisUAL admite el registro del estado del emulador tanto a través de la línea de comandos
como a través de la GUI. Los registros se guardan
como archivos XML para permitir el análisis fácil
mediante herramientas externas.

El elemento de vista de registro contiene una lista


de valores de registro, una vista de ciclo de reloj y
una vista de barra de estado.

Valores de registro
Se pueden visualizar los valores de registro
individuales para los registros R0-R15 . Al hacer
clic en los botones Dec , Bin , Hex cambia el
formato de visualización para los valores de
registro individuales. El formato se puede cambiar
universalmente con el panel Configuración . Si se
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 9
Facultad de Ingeniería

cambia un valor de registro por la instrucción actual, se resaltará en amarillo.

Vista del ciclo del reloj


Esto se encuentra bajo la vista de registro y muestra los ciclos de reloj para la instrucción
actual, así como el número total de ciclos de reloj desde que se inició la emulación.

Vista del bit de estado


Esto muestra los 4 bits de estado de la bandera de condición CSPR N (negative) , Z
(zero) ,C (carry) y V (signed overflow) . Los bits individuales se resaltan cuando
están condicionados y cuando se cambian.

Modos de registro
Se admiten tres modos de registro, como se describe a continuación.

Todas
En este modo, se registra el estado del emulador después de cada línea de código
ejecutada. Esto no incluye líneas que son puramente comentarios o directivas
preprocesador como EQU y DCD .

Terminación
En este modo, el estado del emulador se registra sólo una vez: cuando se alcanza el final
del archivo, o se encuentra un código de operación STOP .

Sólo puntos de interrupción


En este modo, el estado del emulador se registra sólo cuando se alcanza un punto de
interrupción. Puede colocar puntos de interrupción en la GUI haciendo clic en el área de
número de línea. El programa emulará la emulación hasta que se haga clic en 'Step
Forwards' o 'Execute All'.
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 1
Facultad de Ingeniería 0

3.0 TERCERA PARTE


Desarrollo de la práctica
3.1 El alumno deberá presentar al profesor los siguientes apartados:

a. Desarrollo completo de los ejemplos presentados a continuación y verifique el estado de


las operaciones. Ejecute los programas en función: “paso a paso” y verifique el panel de
registros para verificar los cambios de los registros de propósito general y a su vez verifique
los cambios en los registros de estado o las banderas y de los registros R13 –R15.

EJERCICIO 1
;Ejemplos con operadors inmediatos
ADD R0, R1, #4000 ; R0= R1 +4000
SUB R0, R0, #4080 ; R0= R0-4080 y los indicadores según resultado
AND R0, R0, #0x1F ; R0= 0 en [5...31]
ORR R0, R0, #0xFF0000 ; R=1 en [24..31]
BIC R0, R0, #0x1F ; R0=0 en [0..4]

Conclusión: Los operadores realizan su función, se ingresaron una por una las
instrucciones y se verificó en los resultados y si realizan sus operaciones
independientemente si se cambian o no los valores.
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 1
Facultad de Ingeniería

EJERCICIO 2

; ejemplos con operando de registros


MOV R7, R0 ; (R0)=R7
ADDS R8, R1, R0 ; (R1) + (R0)= R8, y pone indicadores
AND R0, R1, R2 ; (R1) AND (R2) =R0, y pone indicadores
MOV R1, R1, LSL #1 ; 2x(R1)=R1
MOV R0, R0, ASR #2 ; (R0)÷4=R0
MOVS R4, R6, ASR #5 ; (R6)÷32= R4, y pone indicadores
SUBS R0, R5, R7, LSL #4 ; (R5) + 16x(R7) =R0, y pone indicadores
;recuerde que agregar “s” al final, se especifica S, estas instrucciones
;actualizan los indicadores N, Z, C y V de acuerdo con el resultado

Conclusión: En este ejercicio se puede observar que los operadores de registros si funcionan
y que el programa se genera una ventana donde se muestran los indicadores y registros en
forma de bits.

EJERCICIO 3
MOV R2, #0B11110000 ; /* R2 <- 11110000 */
MOV R3, #0B10101010 ; /* R3 <- 10101010 */
AND R0, R2, R3 ; /* R0 <- R2 AND R3 */
ORR R1, R2, R3 ; /* R1 <- R2 OR R3 */
MVN R4, R0 ; /* R4 <- NOT R0 */
MOV R0, #0X80000000
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 1
Facultad de Ingeniería

Conclusión: MOV tienen sólo un operando, podemos verlo en la sintaxis del


ejemplo, luego se realizan operaciones con las funciones lógicas y se obtienen
los resultados, MOV en R2 y R3 mueve los operandos

EJERCICIO 4
MOV r2, #0xFB
MVN r1, r2
ADD r2,r1,r3
SUB r8,r6,#240 ; sets the flags on the result
RSB r4,r4,#1280 ; subtracts contents of r4 from 1280
ADC r5, r4,r2
TST R0,#&20 ;Test case of character in R0
end
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 1
Facultad de Ingeniería

EJERCICIO 5 -- caso especial, verifique la sintaxis y corrija el programa para que se


ejecute.
AND r9,r2,#0xFF00
ORR r2,r0,r5
EOR r0,r0,r3,
ROR r6
AND r9, r8, #0x19
EOR r7, r11, #0x18181818
BIC r0, r1, #0xab
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 1
Facultad de Ingeniería

Para este caso la sintaxis tenia errores en las líneas 3 y 4, en la 3 existía una , de
más y en la 4 hacía falta un operador en la ROR.

EJERCICIO 6 – Verifique con los ejemplos anteriores y corrija el programa para se pueda
ejecutar.
ADD R0, R1, #1 @ R0 = R1 + 1
ADD R0, R1, R2 @ R0 = R1 + R2
BIC R4, #0x05 @ Borra los bits 0 y 2 de R4
MOV R11,#0 @ Escribe cero en R11
SUB R3, R2, R1 @ R3 = R2 - R1
SUBS R3, R2, R1 @ R3 = R2 - R1. Modifica los flags del registro
@ estado en función del resultado
ADDeq R7, R1, R2 @ Si el bit Z de CPSR está activo R7 = R1 + R2

CODIGO CORREGIDO:

CORRECCIONES: El código tenia errores en la parte donde se asignaban @ en lugar de ;


por lo que fue necesario cambiarlo en el código, además había un error en la sintaxis del Bit
Clear (BIC) ya que hacía falta asignar el segundo operador.
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 1
Facultad de Ingeniería

EJERCICIO 7 – ejemplo de función practica. Este ejemplo es para que usted compruebe el
funcionamiento de un programa completo , escrito en lenguaje ensamblador y con un
objetivo claro. El programa de función matemática, realiza la sucesión de Fibonacci, que es
la siguiente sucesión infinita de números naturales:
;Ejemplo de encontrar el numero de fibbonac
;La sucesión comienza con los números 0 y 1,2 y a partir de estos,
;«cada término es la suma de los dos anteriores», es la relación
;de recurrencia que la define.
;A los elementos de esta sucesión se les llama números
;de Fibonacci.
;En matemáticas, la sucesión de Fibonacci (a veces llamada
erróneamente serie de Fibonacci)
;es la siguiente sucesión infinita de números
naturales:
Num EQU 223

mov r2,#0 ; (R2) = f(n-2)


mov r1,#1 ; (R1) = f(n-1)
mov r3,#Num
mov r4,#0 ; saldrá con 1 si Num es Fib
blucle add r0,r1,r2 ; fn = f(n-1)+f(n-2)
cmp r0,r3
beq si
bgt no
mov r2,r1 ; f(n-2) = f(n-1)
mov r1,r0 ; f(n-1) = f(n)
bleq bucle
si mov r4,#1
no
END
Ingeniería en Electrónica y Comunicaciones
Laboratorio 2
Sistemas Electrónicos Digitales – SED 0 1
Facultad de Ingeniería

CONCLUSIÓN: La sucesión de Finonacci es funcional, hubo que realizar unas correcciones en


la sintaxis para que fuera funcional.

También podría gustarte