Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LENGUAJE ENSAMBLADOR
U
Nombre del alumno
Franco Gomez Oswaldo
Carrera:
INGENIERÍA ROBÓTICA
P Nombre de la Asignatura:
T Cuatrimestre:
Grupo:
IR-71
LENGUAJE ENSAMBLADOR
Estos son utilizados para crear una secuencia o serie de • El único lenguaje que entienden los
instrucciones algorítmicas, las cuales serán utilizadas para crear microcontroladores es el código máquina formado por
un programa que pueda controlar el comportamiento tanto ceros y unos del sistema binario.
físico como lógico de una computadora. Esto es con el objetivo • El lenguaje ensamblador expresa las instrucciones de
de obtener un determinado resultado. una forma más natural al hombre a la vez que muy
cercana al microcontrolador, ya que cada una de esas
Podría definirse en muy pocas palabras que el lenguaje de instrucciones se corresponde con otra en código
programación es un sistema estructurado de comunicación. máquina.
Este permite el nexo entre el programador y el dispositivo que • El lenguaje ensamblador trabaja con nemónicos, que
está programando. son grupos de caracteres alfanuméricos que
Lenguaje máquina simbolizan las órdenes o tareas a realizar.
• •La traducción de los nemónicos a código máquina
El llamado “Lenguaje máquina” es uno de los lenguajes más entendible por el microcontrolador la lleva a cabo un
viejos que existen; se forma mediante la combinación de “1” y programa ensamblador.
“0”, es decir que es un lenguaje que sólo usa el sistema binario. • El programa escrito en lenguaje ensamblador se
Esto es así debido a que este es el único sistema que los denomina código fuente (*.asm). El programa
dispositivos y computadoras son capaces de interpretar. ensamblador proporciona a partir de este fichero el
correspondiente código máquina, que suele tener la
Lenguaje de programación de bajo nivel extensión *.hex.
La función básica de este lenguaje de programación es la de
actuar a modo de interfaz entre el hardware y el software de un
determinado dispositivo.
Lenguaje ensamblador
2
Figura 1: Representación del programa ensamblador
El código fuente
Figura 2: Ejemplo de código fuente
• Está compuesto por una sucesión de líneas de texto.
• Cada línea puede estructurarse en hasta cuatro campos
o columnas separados por uno o más espacios o
El ensamblador MPASM (distribuido por Microchip) soporta
tabulaciones entre sí.
los sistemas de numeración decimal, hexadecimal, octal,
Campo de etiquetas. Expresiones alfanuméricas escogidas por binario y ASCII.
el usuario para identificar una determinada línea. Todas las
Los nemónicos que tengan una constante como operando
etiquetas tienen asignado el valor de la posición de memoria en
deberán incluirla respetando la sintaxis que se indica a
la que se encuentra el código al que acompañan.
continuación.
Campo de código. Corresponde al nemónico de una
instrucción, de una directiva o de una llamada a macro.
3
direccionar un banco de Memoria Externa de Datos de 256
bytes usando los dos primeros registros de propósito general .
El manejo de la memoria depende de que procesador tenga la • Memoria Flash de programa (1K x 14 bits).
máquina, entre los cuales a continuación se mencionan los • Memoria RAM (68 registros x 8 bits).
siguientes: • Un temporizador/contador (timer de 8 bits).
• Un divisor de frecuencia.
Memoria de Programa • Varios puertos de entrada-salida (13 pines en dos
Memoria Externa de Datos puertos, 5 pines el puerto A y 8 pines el puerto B).
Memoria Interna de Datos
Registros de Funciones Especiales Otras características son:
Memoria de Bit.
• Manejo de interrupciones (de 4 fuentes).
El espacio de la Memoria de Programa contiene todas las • Perro guardián (watchdog).
instrucciones, datos, tablas y cadenas de caracteres (strings) • Bajo consumo.
usadas en los programas. Esta memoria se direcciona • Frecuencia de reloj externa máxima 10MHz. (Hasta
principalmente usando el registro de 16 bits llamado Data 20MHz en nuevas versiones). La frecuencia de reloj
Pointer. El tamaño máximo de la Memoria de Programa es de interna es un cuarto de la externa, lo que significa que
64 Kbytes. con un reloj de 20MHz, el reloj interno sería de 5MHz
La Memoria Externa de Datos contiene todas las variables y y así pues se ejecutan 5 Millones de Instrucciones por
estructuras de datos que no caben en la memoria interna del Segundo (5 MIPS)
Microprocesador. Esta memoria se direcciona principalmente • No posee conversores analógicos-digital ni digital-
por el registro de 16 bits Data Pointer , aunque también se puede analógicos.
4
• Pipe-line de 2 etapas, 1 para búsqueda de instrucción
y otra para la ejecución de la instrucción (los saltos
ocupan un ciclo más).
• Repertorio de instrucciones reducido (RISC), con tan
solo 35 instrucciones distintas.
• 4 tipos distintos de instrucciones, orientadas a byte,
orientadas a bit, operación entre registros, de salto.
Para el desarrollo de la práctica se usó el software de MpLab Se utilizarán los programas elaborados en el trabajo número 3,
de Microchip para utilizar el lenguaje ensamblador para anterior a esta entrega, así que después de instalar MpLAB se
programar el PIC16F84A. carga el primer programa y se compila. A continuación, se
explica cada ejercicio realizado.
Elemental_01.asm:
Por el Puerto B se obtiene el dato de las cinco líneas del Puerto
A, al que está conectado un array de interruptores, sumándole
el valor de una constante, por ejemplo 74. Es decir:
(PORTB)=(PORTA)+Constante.
5
Figura 9: Código de programa elemental 01
Figura 8: Selección de herramienta Una vez construido el programa se sabe que no tiene errores,
así que es tiempo de pasar al simulador electrónico, que en
este caso es Proteus, para cargar el programa al PIC16F84A se
Después de dar en NEW FILE, se copia el programa desde el da doble clic en este y se selecciona el archivo .hex existente
bloc de notas, y se pega en el entorno de MpLab: en la carpeta resultante al compilar el programa.
6
Figura 13: Programa_1, se coloca 10100 en binario(20 en
decimal), y resulta 01011110(94 en decimal).
Figura 11: Colocación de programa en PIC del simulador de
Proteus
SIGUIENTES PROGRAMAS:
Se da en simular y se tiene el circuito resultante funcionando. Para la simulación de los siguientes programas se siguieron los
mismos pasos para lograr verificar el funcionamiento correcto
Funcionamiento del programa: el código esta realizado para del programa realizado.
hacer una suma, claro que la entrada es en binario y por lo tanto
la salida también, pero la suma es +74 en decimal, y el resultado Elemental_02.asm:
se da en binario por medio de los pines del puerto B. En la
Por el Puerto B se obtiene el dato del Puerto A multiplicado por
figura 12 se ve que se está ingresando 00000, el 0 en decimal y
2. Es decir: (PORTB)=2(PORTA)=(PORTA)+(PORT A).
si se suma 74 se tendría que dar el 74 en binario, el cual es
01001010, y se observa que el programa actúa de forma Cabe destacar que el programa utilizado en este ejercicio como
correcta: anexo 3 en este mismo documento.
7
Figura 14: Programa_2, se coloca 01100 en binario (12 en
decimal), y resulta 00011000(24 en decimal). Figura 15: Programa_3, se coloca 00000 en la entrada y se
obtiene 01010101 en la salida ya que se los pares se hacen 1.
Elemental_03.asm:
Por el Puerto B obtiene el dato del Puerto A, pero en la salida
los bits pares se fijan siempre a "1". El orden de los bits será
"b7 b6 b5 b4 b3 b2 b1 b0", siendo los pares el b6, b4, b2 y el
b0. Por ejemplo, si por el Puerto A se introduce el dato b'---
01100', por el Puerto B se visualiza b'01011101'. Observar que
los bits pares están a "1" (efectivamente: Puerto B =
b'x1x1x1x1') y los impares permanecen con el dato del puerto
de entrada (efectivamente: Puerto A = b'---x1x0x' y Puerto B =
b'xxxx1x0x').
Cabe destacar que el programa utilizado en este ejercicio como Figura 16: Programa_3, se coloca 11111 em la entrada y se obtienen
anexo 4 en este mismo documento. 01011111 ya que la entrada es de 5 bits y los pares se hacen 1
Funcionamiento del programa: El programa cumple la El programa 3 realiza las instrucciones correspondientes y
función de pasar los mismos datos del puerto A al puerto B pero resuelve bien la problemática planteada.
con la condición de que los bits pares siempre serán 1, pero
ahora irán invertidas las salidas, es decir, b7 tomará el lugar de Elemental_04.asm:
b1, b6 el de b2, etc. La figura 15 muestra el ingreso de los bits
Por el Puerto B obtiene el dato del Puerto A, pero en las salidas
00000 y da como resultado en la salida 01010101 ya que se
los bits impares se fijan siempre a "0". El orden de los bits será
están invirtiendo todos los pares, es decir, b6, b4, b2, b0, esto
"b7 b6 b5 b4 b3 b2 b1 b0", siendo los impares el b7, b5, b3 y
siempre serán 1 sin importar la entrada.
b1. Por ejemplo, si por el Puerto A se introduce el dato b'---
Como otro ejemplo se ponen los bits 11111 en la entrada, y 01100', por el Puerto B se visualiza b'00000100'. Observar que
como salida se obtiene 01011111 porque en este caso se los bits impares están a "0" (efectivamente: Puerto B =
cumple la condición de que todos sean 1 en la salida, solo se b'0x0x0x0x') y los pares permanecen con el dato del puerto de
aprecian los primeros 5 ya que solo son 5 bits de entrada. entrada (efectivamente: Puerto A = b'---0x1x0' y Puerto B = b'-
--0x1x0').
8
ahora irán invertidas las salidas, es decir, b7 tomará el lugar de Cabe destacar que el programa utilizado en este ejercicio como
b1, b6 el de b2, etc. La figura 17 muestra el ingreso de los bits anexo 6 en este mismo documento
01010 y da como resultado en la salida 00000000 ya que se
están colocando a 0 todos los impares, y por ende serán todos 0 Funcionamiento del programa: El programa cumple la
porque los únicos 1 de la entrada son los impares. función de pasar los mismos datos del puerto A al puerto B pero
con la condición de que estos se van a invertir. La figura 19
muestra el ingreso de los bits 10101 y da como resultado en la
salida 11101010 ya que se están invirtiendo, los datos de los
pines b5, b6, b7 no tiene interés en este programa.
Figura 18: Programa_4, se coloca 11111 en la entrada y se obtienen Figura 20: Programa_5, se coloca 00100 en la entrada y se obtienen
00010101 ya que la entrada es de 5 bits y los impares se hacen 0. 11111011 ya que se invierten los datos.
El programa 5 resuelve la problemática planteada de forma
correcta y es funcional.
El programa 4 resuelve la problemática planteada de forma
correcta y es funcional. Elemental_06.asm:
Elemental_05.asm: Por el Puerto B obtiene el dato del Puerto A intercambiando
los nibbles alto y bajo. Por ejemplo, si por el Puerto A se
Por el Puerto B se obtiene el dato del Puerto A invertidos los
introduce "---11001" por el Puerto B aparecerá "1001xxx1".
unos y ceros. Por ejemplo, si por el Puerto A se introduce "---
11001", por el Puerto B aparecerá "xxx00110" (no importa el Cabe destacar que el programa utilizado en este ejercicio
estado de los tres bits superiores del Puerto B). como anexo 7 en este mismo documento.
9
Funcionamiento del programa: El programa cumple la Funcionamiento del programa: El programa cumple la
función de pasar los mismos datos del puerto A al puerto B pero función de pasar los mismos datos del puerto A al puerto B pero
con la condición de los nibbles alto y bajo se van a intercambiar, los bits se desplazan 1 lugar hacia la izquierda, entrando en la
la figura 21 muestra la entrada de los datos 11001, teniendo en derecha un 1. La figura 23 muestra el funcionamiento con esté
la salida 1001xxx1, observe: ejemplo.
Figura 21: Programa_6, se coloca 11001 en la entrada y se obtienen Figura 23: Programa_7, se coloca 11001 en la entrada y se obtienen
1001xxx1 ya que se intercambian los nibbles alto y bajo. xx110011 ya que se recorrió un lugar a la izquierda, introduciendo un
1 en la derecha.
Otro ejemplo se ve en la figura 22, se introducen los datos Otro ejemplo se muestra en la figura 24, donde se introducen
10011, y ya que se están intercambiando los nibbles alto y en la entrada los bits 10001, y por ende, el programa hará que
bajo, se obtiene 0011xxx1, observe: se trasforme a un xx100011.
10
Cabe destacar que el programa utilizado en este ejercicio como Por el Puerto B se obtiene el dato del Puerto A invirtiendo los
anexo 9 en este mismo documento. bits pares. Los impares se dejan como en la entrada.
Funcionamiento del programa: El programa cumple la Cabe destacar que el programa utilizado en este ejercicio como
función de pasar los mismos datos del puerto A al puerto B pero anexo 10 en este mismo documento.
los bits se desplazan 1 lugar hacia la derecha, y entrando en la
derecha un 0. La figura 25 muestra el funcionamiento, si Funcionamiento del programa: El programa cumple la
ponemos los bits 11001. En la salida se tendrá 0xxx1100. función de pasar los mismos datos del puerto A al puerto B pero
invirtiendo los impares, es decir, los bits de posición 1, 3 y 5 se
van a invertir dependiendo de su valor. La figura 27 muestra el
funcionamiento, si ponemos los bits 00000. En la salida se
tendrá xxx10101:
Elemental_09.asm:
11
Ya que esto solo se puede hacer, aunque se cambien los valores
de los bits de la entrada, la salida no va a cambiar el valor de
ningún bit, y que el programa lo mantiene en modo stanby, la
figura 31 muestra este funcionamiento. Una instrucción en el
programa hace que esto sea posible y se puede ver en el anexo
11 de esta entrega,
Elemental_10.asm:
Por el Puerto B se obtiene el dato de las cinco líneas del Puerto Figura 31: Programa_10, aunque se cambien los valores de la
A al que están conectado un array de interruptores. Esta entrada, los de la salida no van a cambiar a menos de que se detenga
operación la realizará una única vez. Después el programa y se vuelva a simular el programa.
entrará en modo "Standby" o de bajo consumo del cual no podrá
salir después.
12
El uso más común sin duda es la programación de CONCLUSIONES
microcontroladores, para diseñar sistemas embebidos, el cual
es un circuito integrado programable, capaz de ejecutar las La complejidad de los procesadores actuales hace la
órdenes grabadas en su memoria. Está compuesto de varios optimización cada vez más difícil para los compiladores,
bloques funcionales, los cuales cumplen una tarea específica. además las prestaciones cada vez mayores de los procesadores
Un microcontrolador incluye en su interior las tres principales hacen que la mayoría de las CPU permanezcan desocupadas la
unidades funcionales de una computadora: unidad central de mayor parte del tiempo. Esto hace que la velocidad de ejecución
procesamiento, memoria y periféricos de entrada/salida. En el de código no sea ya un problema. El lenguaje ensamblador se
hogar pueden existir en los electrodomésticos entre una y dos utiliza principalmente para traducir lenguajes de alto nivel en
docenas de microcontroladores. Pueden encontrarse en casi código máquina, o para funciones críticas o en procesos
cualquier dispositivo eléctrico como lavadoras, horno de industriales, sobre todo si es importante el tiempo real.
microondas, teléfonos, etc.
También se utiliza si se necesita un ejecutable independiente
En los primeros días de la programación, la mayoría de las (stand-alone) que deba ejecutarse sin recursos. Son programas
aplicaciones se escribían parcial o totalmente en lenguaje empotrados que solo disponen de una pequeña cantidad de
ensamblador. Tenían que ajustarse en una pequeña área de memoria y está dirigido para hacer tareas con propósito simple,
memoria y se ejecutaban de la manera más eficiente posible en por ejemplo en teléfonos, sistemas de ignición de combustible
los procesadores lentos. A medida que la memoria aumentó su para automóviles, control de aire acondicionado, sensores y
capacidad y los procesadores su velocidad, los programas se sistemas de seguridad.
hicieron más complejos. Los programadores cambiaron a
El lenguaje ensamblador no suele ser portable, en otras
lenguajes de alto nivel tales como C, FORTRAN y COBOL,
palabras, el código para un microprocesador no sirve para
los cuales contenían una cierta capacidad de estructuración. Los
ejecutarse en otro (modelo o marca diferentes) por lo que es
lenguajes de programación orientados a objetos más recientes,
necesario modificarlo para usarlo en otro microprocesador de
tales como C++, C# y Java, han hecho posible la escritura de
diferente modelo o arquitectura diferentes. En estos casos el
programas complejos que contienen millones de líneas de
código debe reescribirse.
código. Es raro ver programas de aplicación extensos
codificados por completo en lenguaje ensamblador, ya que se El lenguaje ensamblador permite controlar exactamente las
requeriría mucho tiempo para escribirlos y darles tareas realizadas por el microprocesador y es capaz de crear
mantenimiento. En vez de ello, el lenguaje ensamblador se código imposible de imitar en un lenguaje de alto nivel, ya que
utiliza para optimizar ciertas secciones de los programas de el lenguaje ensamblador dispone de instrucciones que no están
aplicación en relación con la velocidad y para tener acceso al disponibles en los lenguajes de alto nivel. El lenguaje
hardware de la computadora. Un ensamblador es un programa ensamblador también es valioso para hacer ingeniería inversa,
que ejecuta la computadora y convierte instrucciones en un pues muchos programas son distribuidos exclusivamente como
patrón de bits. El procesador puede usarlo para realizar código de máquina. El código de máquina es fácil de trasladar
operaciones básicas. Algunas personas llaman a estas hacia lenguaje ensamblador para luego ser examinado en esta
instrucciones lenguaje ensamblador y otras usan el término forma, aunque sigue siendo muy difícil trasladarlo a un
lenguaje ensamblador. lenguaje de alto nivel. También existen herramientas para hacer
esto último de forma automática.
El programador puede escribir un programa usando una serie
de estas instrucciones de ensamblador. Esta secuencia de
declaraciones de ensamblador, conocida como código fuente o
el programa fuente, se especifica en el programa ensamblador REFERENCIAS
cuando iniciamos el programa. El programa ensamblador toma
[1] Lenguaje ensamblador. Importancia del lenguaje
cada instrucción del programa en el programa fuente y genera
ensamblador. Recuperado el 6 de octubre de 2021 de:
un flujo de bits o patrón correspondiente (una serie de ceros y
https://www.monografias.com/trabajos14/lenguaje-
unos de cierta longitud). La salida del programa ensamblador
ensamblador/lenguaje-ensamblador.shtml
se denomina código objeto o programa objeto con respecto al
programa fuente de entrada. La secuencia de ceros y unos que [2] Ingeniería Mecafenix. Microcontrolador PIC. Recuperado
componen el programa objeto también se denomina código el 5 de octubre de 2021 de:
máquina. Entonces podemos ejecutar el programa objeto en https://www.ingmecafenix.com/electronica/microcontrolador-
cualquier momento. pic-partes-aplicaciones/
13
ANEXOS
ANEXO 1 INSTRUCCIONES DE PIC16F84A
14
ANEXO 2 Programa_elemental_01
; Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A, al que está conectado
; Es decir: (PORTB)=(PORTA)+Constante
Inicio
movwf TRISA
Principal
15
; ===================================================================
; Ingeniería en robótica
; ===================================================================
ANEXO 3 Programa_elemental_02
movlw b'00011111'
Principal
16
movf PORTA,W ; Carga el registro de datos del Puerto A en (W).
; ===================================================================
; Ingenieria robotica
; ===================================================================
ANEXO 4 Programa_elemental_03
;Programa_elemental_03.asm
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
ERRORLEVEL -302
;=======================================================================
;Por el Puerto B obtiene el dato del Puerto A, pero en la salida los bits pares se fijan siempre a "1".
;El orden de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo los pares el b6, b4, b2 y el b0.
;Por ejemplo, si por el Puerto A se introduce el dato b'---01100', por el Puerto B se visualiza b'01011101'.
;Observar que los bits pares están a "1" (efectivamente: Puerto B = b'x1x1x1x1') y los impares permanecen con
;el dato del puerto de entrada (efectivamente: Puerto A = b'---x1x0x' y Puerto B = b'xxxx1x0x').
17
; Defino las variables
;=======================================================================
;=======================================================================
ORG 0x000
goto Inicio
ORG 0X004
retfie
Inicio
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Principal
goto Principal
END
;=======================================================================
; Ingeniería robótica
;=======================================================================
ANEXO 5 Programa_elemental_04
18
;*********************************** Elemental_04.asm ***********************************
; Por el Puerto B obtiene el dato del Puerto A, pero en las salida los bits impares se
; fijan siempre a "0". El orden de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo los
; visualiza b'00000100'. Observar que los bits impares están a "0" (efectivamente:
; Puerto B = b'0x0x0x0x') y los pares permanecen con el dato del puerto de entrada
Mascara EQU b'01010101' ; Máscara de bits impares siempre a "0", este es el trabajo importante.
movlw b'00011111'
Principal
19
END ; Fin del programa.
; ===================================================================
; Ingeniería robótica
; ===================================================================
ANEXO 6 Programa_elemental_05
;Por el Puerto B se obtiene el dato del Puerto A invertidos los unos y ceros.
;Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "xxx00110"
;(no importa el estado de los tres bits superiores del Puerto B).
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
ERRORLEVEL -302
;=======================================================================
;=======================================================================
;=======================================================================
ORG 0x000
20
goto Inicio
ORG 0X004
retfie
Inicio
bank1
movlw 0x1F
bank0
Principal
goto Principal
END
; ===================================================================
; Ingeniería robótica
; ===================================================================
ANEXO 7 Programa_elemental_06
;Por el Puerto B obtiene el dato del Puerto A intercambiando los nibbles alto y bajo.
;Por ejemplo, si por el Puerto A se introduce "---11001" por el Puerto B aparecerá "1001xxx1".
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
21
ERRORLEVEL -302
;=======================================================================
;=======================================================================
;=======================================================================
ORG 0x000
goto Inicio
ORG 0X004
retfie
Inicio
bank1
bank0
Principal
swapf PORTA,W
movlw 0x1F
movwf PORTB
goto Principal
END
; ===================================================================
; Ingeniería robótica
; ===================================================================
ANEXO 8 Programa_elemental_07
22
;*********************************** Elemental_07.asm ***********************************
; Por el Puerto B obtiene el dato del Puerto A desplazando un bit hacia la izquierda,
;por la derecha entrará un "1". Por ejemplo, si por el Puerto A se introduce "---11001",
;por el Puerto B aparecerá "xx110011" (no importa el estado de los dos bits superiores
Inicio
movwf TRISA
Principal
; ===================================================================
; Ingeniería robótica
23
; ===================================================================
ANEXO 9 Programa_elemental_08
; Por el Puerto B se obtiene el dato del Puerto A desplazando un bit hacia la derecha, por
Inicio
movwf TRISA
Principal
24
END ; Fin del programa.
; ===================================================================
; Ingeniería robótica
; ===================================================================
ANEXO 10 Programa_elemental_09
; Por el Puerto B se obtiene el dato del Puerto A invirtiendo los bits pares. Los impares
Mascara EQU b'01010101' ; Máscara para invertir los bits pares mediante la
Inicio
25
movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como entrada.
movwf TRISA
Principal
xorlw Mascara ; Invierte los bits pares, dejando igual los impares.
; ===================================================================
; Ingeniería robótica
ANEXO 11 Programa_elemental_10
; Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que están conectado
; el Puerto B aparecerá "xxx11001" (el valor de las tres líneas superiores no importa).
; Esta operación la realizará una única vez. Después el programa entrará en modo
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ; Configuración para el
; grabador.
26
; ZONA DE CÓDIGOS ********************************************************************
Inicio
movwf TRISA
Principal
; podrá salir.
; ===================================================================
; Ingeniería robótica
; ===================================================================
27