Práctica 3
Implementación de estructuras de control en ensamblador
ENSAMBLADORES E INTERPRETES.
Alumna: Estefanía Rodríguez Sánchez.
Facilitador: Elsa Viveros Galván.
Carrera: Ingeniería en sistemas computacionales.
Ciclo:10.
Tarea 6: Instrucciones de salto.
Fecha: 12 de noviembre del 2023.
Práctica 3
Implementación de estructuras de control en ensamblador
Objetivo
Adquirir las competencias necesarias para desarrollar programas en ensamblador
que utilicen las estructuras de control que propone el modelo de pangrogramación
estructurada implementadas, utilizando instrucciones de comparación y de salto.
Introducción
A finales de los años sesenta surgió una nueva forma de programar que no
solamente daba lugar a programas fiables y eficientes, sino que además estaban
escritos de manera que facilitaba su comprensión posterior: la programación
estructurada.
La programación estructurada es un modelo de programación que propone que
todo programa puede escribirse utilizando únicamente las tres estructuras de
control siguientes:
Secuencial.
Condicional o selectiva.
Iteración, repetición o bucle de instrucciones.
Utilizando solamente estas tres estructuras se puede hacer cualquier programa
informático.
Estas estructuras de control se implementan en lenguaje ensamblador
combinando instrucciones de comparación con instrucciones de salto. En esta
práctica aplicarás estas combinaciones para implementar en ensamblador tres
pseudocódigos que utilizan diferentes estructuras de la programación
estructurada.
Actividades
1. Programa de ejemplo
1.1. Implementa el siguiente pseudocódigo en lenguaje ensamblador:
r16 = 0
r17 = 20
r18 = 0
mientras (r16 <= r17)
add r18,r16
inc r16
fin_mientras
mov r30,r16
1.2. Inserta aquí el programa en ensamblador que implementa el pseudocódigo
anterior:
Práctica 3
Implementación de estructuras de control en ensamblador
(Código de tu programa)
;
; programacion estructurada [Link]
;
; Created: 12/11/2023 [Link] AM
; Author : Fanny Rodriguez
;
.org 0x0000 ; Direccion para el inicio del programa
;
rjmp main ; salto al inicio
;
main:
; Inicializa a los registros r16, r17 y r18
ldi r16, 0 ; r16 = 0
ldi r17, 20 ; r17 = 20
ldi r18, 0 ; r18 = 0
;
mientras:
; Comparacion del r16 con r17
cpi r16, 20
brge fin_mientras ; Si r16 >= r17, salta a fin_mientras
;
; Suma r16 a r18
add r18, r16
; Incrementa r16
inc r16
;
rjmp mientras ; Salta a mientras y se repite el bucle
;
fin_mientras:
; Mover el valor de r16 a r30
mov r30, r16
;end Termina el programa
Práctica 3
Implementación de estructuras de control en ensamblador
1.3. Captura, ensambla y ejecuta el programa anterior utilizando el AVRStudio.
Reporta los valores de los siguientes registros al terminar la ejecución de tu
programa:
r16 = _0______ r17 = _20____ r18 = _0_____
2. Programas adicionales
2.1. Ahora inserta aquí el pseudocódigo del programa que divide restando,
algoritmo que desarrollaste en la Tarea 4:
(Pseudocódigo para dividir restando)
;----------Se definen las variables de entrada ----------------------
Dividendo = 25
Divisor = 7
;-----------Se inicializa el contador y cociente-----------------------
Contador = 0
Cociente = 0
;---------Mientras el dividendo sea mayor o igual al divisor-----------------
While (dividendo >= divisor) {
dividendo = dividendo - divisor /* Resta el divisor al dividendo */
cociente = cociente + 1 /* Incrementa el cociente en 1 */
fin_mientras
;------El resultado se encuentra en cociente y el residuo en dividendo---------------
Result: Cociente = 3, Residuo = 4
Práctica 3
Implementación de estructuras de control en ensamblador
2.2. Ahora implementa este pseudocódigo en ensamblador e inserta aquí el
programa resultante:
(Código de tu programa)
;
; programa para dividir restando [Link]
;
; Created: 12/11/2023 [Link] AM
; Author : Fanny Rodriguez
;
.org 0x0000 ; Direccion para el inicio del programa
rjmp main ;salto al inicio
main:
; definicion de las variables de entrada
ldi r16, 25 ; dividendo
ldi r17, 7 ; divisor
;
; se inicializa el contador y cociente
ldi r18, 0 ; contador
ldi r19, 0 ; cociente
;
loop:
; Comparacion si el dividendo es mayor o igual al divisor
cp r16, r17 ;carga y compara el valor del dato
brlo done ; si no, termina el bucle
;
; Restar el divisor al dividendo
sub r16, r17 ;resta sin acarreo
;
; Incrementar el cociente en 1
inc r19
; Incrementa al contador en 1
inc r18 ;Incrementa al r18
;
rjmp loop ; salta al inicio del bucle
;
done:
; El resultado esta en r19 (cociente) y r16 (residuo)
;
;Final del programa
;
Práctica 3
Implementación de estructuras de control en ensamblador
a) ¿Cuál registro utilizas para guardar el cociente? Respuesta: r19_________
b) ¿Cuál registro utilizas para guardar el residuo? Respuesta: r16_________
2.3. Captura, ensambla y ejecuta el programa anterior utilizando el AVRStudio.
Utiliza tu programa para realizar las divisiones siguientes y reporta los resultados
obtenidos:
a) 120/43 Cociente: _2__________ Residuo: 34___________
b) 235/7 Cociente: _33__________Residuo: 4___________
c) 200/11 Cociente: _18__________Residuo: 2___________
2.4. Ahora inserta aquí el pseudocódigo del programa que calcula la raíz cuadrada
aproximada de un número restando impares sucesivos, algoritmo que
desarrollaste en la Tarea 4:
(Pseudocódigo para calcular la raíz cuadrada aproximada restando impares
sucesivos)
;----------Se definen las variables de entrada------------------
double inicial, /* entrada - raiz inicial */
numero = 99
;--------Se inicializan las variables--------------------------
raiz_aproximada = 0
impar = 1
;--------Mientras el número sea mayor o igual a cero-----------------------
While (numero >= 0) {
numero = numero - impar /* Resta el impar al número */
impar = impar + 2 /* Incrementa el impar al siguiente impar */
Práctica 3
Implementación de estructuras de control en ensamblador
raiz_aproximada = raiz_aproximada + 1 /* Incrementa la raíz aproximada en 1 */
fin_mientras
;----------El resultado es la aproximación de la raiz cuadrada al restar------------
Result: raiz aproximada ≈ 9 (como -1 es menor a 0, se termina de restar)
2.5. Ahora implementa este pseudocódigo en ensamblador e inserta aquí el
programa resultante:
(Código de tu programa)
;
; calcular la raiz cuadrada restando [Link]
;------------------------------------------------------
; Created: 12/11/2023 [Link] AM
; Author : Fanny Rodriguez
;calcular la raiz cuadrada restando [Link]
;--------------------------------------------------
.org 0x0000 ; Direccion para el inicio del programa
rjmp main ;salta al inicio
main:
; definicion de las variables de entrada
ldi r16, 99 ; numero de la raiz inicial
;
; se inicializan las variables
ldi r17, 0 ; raiz_aproximada
ldi r18, 1 ; numero impar
;
loop: ;ciclo loop
; Comparar mientras el numero sea mayor o igual a cero
cp r16, r17 ;carga y compara el valor del dato
brlo done ; si no, termina el bucle
;
; restar el impar al numero
sub r16, r18 ;resta sin acarreo
;
; incrementar al impar en 2
ldi r19, 2 ;carga el valor 2 en r19
add r18, r19 ;sumas sin acarreo
;
; incrementar a la raiz aproximada en 1
subi r17, 1 ;resta un inmediato
;
rjmp loop ; saltar al inicio del bucle
;
done: ; hecho
; El resultado esta en r17 (raiz_aproximada)
; termina el programa
Práctica 3
Implementación de estructuras de control en ensamblador
a) ¿Cuál registro utilizas para guardar la raíz cuadrada aproximada?
Respuesta: r17_______
2.6. Captura, ensambla y ejecuta el programa anterior utilizando el AVRStudio.
Utiliza tu programa para calcular la raíz cuadrada aproximada de los números
siguientes y reporta los resultados obtenidos:
a) 250 Raíz cuadrada aproximada: _15___________
b) 80 Raíz cuadrada aproximada: _8___________
c) 120 Raíz cuadrada aproximada: _10___________
3. Comentarios y conclusiones
Al realizar este programa ensamblador al realizar el de una división restando un
número, aprendí que en vez de hacer una división normal se hace un bucle en el
AVRStudio, con el que se irán haciendo las restas iterativas para conocer así el
cociente y el residuo de la división.
Esta práctica me ayudo a reforzar un poco más mi aprendizaje y a perder el miedo
de que me salga error al compilar el codigo.
Conclusion
Con el lenguaje ensamblador se tiene un control muy preciso de las tareas
realizadas por un microprocesador por lo que se pueden crear segmentos de
código difíciles o que son muy ineficientes de programar en un lenguaje de alto
nivel, ya que, entre otras cosas, en el lenguaje ensamblador se dispone de
instrucciones del cpu que generalmente no están disponibles en los lenguajes de
Práctica 3
Implementación de estructuras de control en ensamblador
alto nivel.
Referencias
Ber, & Ber. . (3 de noviembre de 2013). Dividir dos número en lenguaje ensamblador.
Obtenido de [Link]
dividir-dos-numeros
Betanzos., D. (13 de diciembre de 2022). Instrucciones en lenguaje Ensamblador i
[Vídeo]. YouTube. Obtenido de [Link]
Tecnación, D. (11 de septiembre de 2019). Assembler - Punteros, TYPEDEF,
Direccionamiento DIRECTO. [Vídeo]. YouTube. Obtenido de
[Link]