0% encontró este documento útil (0 votos)
32 vistas7 páginas

Ejercicios de Programacion Assembler

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
32 vistas7 páginas

Ejercicios de Programacion Assembler

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

TRABAJO PRÁCTICO 5: Unidad Central de Proceso:

Programación en Lenguaje Simbólico


5.01.- Indicar qué hace el procesador 68HC11 cuando ejecuta cada una de
las siguientes instrucciones

LDAB #$25 LDAB $25 LDAB 25 LDAB $2525 LDAB $25,X

ADDA #$EA ADDA $EA ADDA $EA,X ADDA $46EA

CBA BCC $10 BGE $F7 BSR $65

Especificar los registros de la CPU y las posiciones de memoria involucrados.


Especificar los bits del registro de estado que se modifican.
Escribir cada instrucción en lenguaje de máquina.

5.02.- indicar, para el procesador 68HC11, cuales de las siguientes instrucciones


no son válidas y justificar el por qué:

LDAB #$25 LDAB $25 LDAB 25 LDAB #$2525 LDD $225,X

LDD 225,Y LDAA #$2525 LDD #$2525

ADDA #$EA ADDA $EA ADDA $EEAA,X ADDA $46EA

BCC $100 BGE 100 BSR #$65

5.03.- Para una unidad de procesos 68HC11, indicar los contenidos de los
acumuladores A y B, y de las direcciones de memoria 00F5, 00F7 y 00F8
después de la ejecución de las siguientes instrucciones:

INICIO CLRA
LDAB $F5
Otro ADDA $F7
DECB
BNE otro
STAA $F8
BRA *

si los contenidos iniciales de las direcciones de memoria son respectivamente

00F5: 08
00F7: 12

Indicar qué hace el programa.

5.04.- Para una CPU tipo 68CH11, interpretar los contenidos de las siguientes
posiciones de memoria, en donde hay un fragmento de programa. Indicar cuál

14
es el contenido sucesivo de los registros del procesador. Indicar qué posiciones
de memoria sufren alteraciones en sus contenidos. Los datos iniciales son
PC: 4000 SP: 0080 IX: 2000 A: 55 B: FF PSW: 07

3000 4F C6 00 E7 00 08 5A 4A 81 00 26 F7 39
4000 BD 30 00 20 FE

Para los planteos que se detallan a continuación, se pide:


• Realizar los diagramas de flujo,
• Plantear los programas en lenguaje simbólico (mnemónicos) y
• Escribir el programa en lenguaje de máquina, para una CPU del tipo del
68HC11. Indicar las suposiciones que se realizan y justificar el algoritmo
empleado.

5.05.- Realizar la operación s = p + q - r, siendo los datos las posiciones de


memoria en donde se hallan los operandos y en donde se almacena el
resultado.

5.06.- Realizar la sumatoria s = n1 + n2 + n3 +... + nn, siendo datos las direcciones


de n1, nn y s.

5.07.- Idem anterior, siendo datos las direcciones de n, n1 y s. (n = cantidad de


sumandos ).

5.08.- Realizar la operación s = p + q, siendo p y q números de 16 bits. Los datos


son las direcciones del MSB de p, de q y de s. (MSB : byte más significativo)

5.09.- Realizar la suma de dos números binarios de cualquier longitud. Los


operandos pueden ser positivos o negativos. Los datos son las direcciones de
los MSB de los operandos y del resultado, y la dirección en donde se halla la
longitud de los operandos.

5.10.- Dados 3 números binarios sin signo, hallar el máximo.

5.11.- Dado un número con signo, devolver el módulo o valor absoluto del
mismo. Suponer que los negativos se almacenan en complemento a la base.

5.12.-Dada una lista de números binarios en memoria, ordenarlos en forma


creciente en los mismos lugares de memoria, siendo conocidas las direcciones
del primer y del último dato en memoria.

5.13.- Repetir el ejercicio anterior considerando conocidas la dirección del


primer dato y la cantidad total de datos.

5.14.- Dado un número binario de 8 bits, almacenado en una posición de


memoria conocida, convertir el mismo en dos caracteres ASCII representativos
de los dos dígitos hexadecimales que lo forman. (las representaciones literales
de los 6 últimos dígitos hexadecimales deberán ser letras mayúsculas). Los
resultados se almacenan en direcciones de memoria también conocidas.

15
5.15.- Se desea convertir a decimal un numero binario de ocho bits
almacenado en la posición de memoria $0000. El resultado debe quedar
almacenado de la siguiente forma:

Posición $0001 = CENTENAS.


Posición $0002 = DECENAS
Posición $0003 = UNIDADES.

5.16.- Se desea evaluar el dato almacenado en la posición de memoria $0000.


Para ello en la posición de memoria $0001 debe aparecer almacenado:

“>” si el valor es mayor que 128.


“=” si el valor es 128.
“<” si el valor es menor a 128.

5.17.- Dado un vector formado por elementos numéricos naturales, del que se
conocen la dirección de su primer elemento y la dirección del ultimo elemento,
encontrar el valor máximo incluido en el mismo. Si el valor dado se encuentra
una sola vez, indicar la posición del mismo dentro del vector. Si se encuentra
más de una vez, indicar la posición en que se lo encontró por primera vez y la
cantidad de veces que se repite dicho elemento.

5.18.- Dado un vector formado por elementos numéricos naturales, del que se
conocen la dirección de su primer elemento y la dirección del ultimo elemento,
determinar si el mismo contiene un valor numérico que se conoce como dato.
Si el valor dado se encuentra una sola vez, indicar la posición del mismo dentro
del vector. Si se encuentra más de una vez, indicar la posición en que se lo
encontró por primera vez y la cantidad de veces que se repite dicho elemento.
Si no se lo encuentra, indicar dicha circunstancia de alguna forma visible.

5.19.- Dado un vector formado por caracteres ASCII, del que se conocen la
dirección de su primer elemento y la cantidad de elementos, obtener otro
vector en el que solamente se incluyan aquellos caracteres del primero que
representen letras y/o números.

5.20.- Mediante el uso de un vector, programar un decodificador BCD a 7


segmentos, de acuerdo con lo visto en la práctica de circuitos combinatorios.
Cuantos elementos requiere el vector en cuestión?

5.21.- Desarrollar un programa que funcione como “reloj de tiempo real”. Con
tal objetivo se requerirá que almacene en BCD las horas (en formato 24),
minutos y segundos, valiéndose del cambio de estado de la posición de
memoria $0000 (la que, de alguna manera que no nos interesa, cambia su
valor entre 0 y 1 cada 500 mseg). Tomando ese cambio como base de tiempo,
realizar las rutinas para hacer funcionar el programa como un reloj. Cuando se
produce un cambio es necesario almacenar un $00 para poder esperar el
próximo cambio.

16
5.22.- Una computadora basada en el microcontrolador 68HC11 tiene
conectados ocho pulsadores en un dispositivo mapeado en la posición de
memoria $0080. Al leer esa posición de memoria, si un pulsador esta
presionado, fuerza un cero lógico en el bit asociado y cuando no lo está, se lee
un uno lógico. Cada pulsador está conectado a cada uno de los bits de esa
posición de memoria. Se desea generar un programa que mediante las
instrucciones BRSET y BRCLR permita discriminar qué pulsador está presionado,
teniendo en cuenta que al detectarse más de un pulsador presionado escriba
un código de error en la posición de memoria $0000 (“E”). En caso contrario,
deberá escribir en la posición mencionada el código ASCII correspondiente al
número del pulsador seleccionado (entre 0 y 7).

5.23.-Una empresa desea construir un tablero de BINGO basado en un


microcontrolador 68HC11. Como elemento de entrada se informa el número de
la bolilla extraída, el que aparece expresado en BCD empaquetado en la
posición de memoria $0000.
A medida que van saliendo las bolillas deberá ponerse en uno un bit que se
corresponda con el número de bolilla. Es decir que se dispone de tantos BITS de
memoria como bolillas existen en el juego del BINGO. Cada bit puesto en 1
enciende una lámpara.
Al comenzar el juego todos los bits deben estar en cero y se pueden utilizar las
posiciones de memoria necesarias a partir de la posición de memoria $0002. En
caso de detectarse dos veces la misma bolilla debe escribirse en la posición de
memoria $0001 la letra “E”, caso contrario esa posición de memoria debe tener
una “N”.
Se recomienda utilizar instrucciones BSET y BCLR.

Se pide:
- determinar cuántas bolillas tiene un juego de BINGO.
- cuántas posiciones de memoria son necesarias.
- Escribir el programa que administre el funcionamiento del tablero.

17
TRABAJO PRÁCTICO 6: Unidad Central de Proceso:
Programación en Lenguaje Simbólico - Segunda parte: –
Programación avanzada.

Introducción al problema

Una variable es una posición de memoria que puede ser leída y escrita. Desde
un lenguaje de alto nivel se le indica al compilador el tipo de dato al que
pertenece una variable. El tipo de dato indica el tamaño a reservar, es decir, la
cantidad de bits que debe ocupar la variable y cómo se decodificará el
patrón de bits hallado en esa posición de memoria. La misma palabra binaria
tiene significado diferente dependiendo del tipo de dato de la variable. Para la
electrónica son solo señales representadas por ceros y unos, es el programador
el que asigna un sentido especial a cada palabra de ceros y unos.

Objetivos

Relacionar el concepto de tipo de dato en alto nivel con bajo nivel. Evidenciar
los efectos de intentar sobrepasar la capacidad en bits de una variable
declarada de un tipo. Afirmar el concepto de overflow en la representación
interna de números enteros y caracteres.

Enunciados

6.01.- Dado el programa en C++ que se adjunta, realizar su equivalente en


lenguaje simbólico y lenguaje de máquina del HC11(operaciones y
asignaciones, no entradas y salidas). Observar las salidas de C++ y que los
únicos mensajes del compilador se refieren al warning “Conversionmay lose
significantdigits”. Explicar y mostrar la razón de las salidas obtenidas.

/*
*/

#include<iostream.h>
#include <conio.h>
#include <math.h>

//Ejemplos de overflow

void main (void)


{
short i ;
int ii ;
long l ;
float f ;
char c ;
cout<< "Presionar cualquier tecla para avanzar" <<endl ; getch() ;
i = 32767 ;

18
i++ ;
cout<<endl<< "32767 + 1 como short da " <<i<<endl ; getch() ;
ii = 32767 ;
ii++ ;
cout<<endl<< "32767 + 1 comoint da " << ii <<endl ; getch() ;
ii = pow(2,31) ;
ii++ ;
cout<<endl<< "2^31 comoint da " << ii <<endl ; getch() ;
l = pow(2,31) ;
l++ ;
cout<<endl<< "2^31 como long da " << l <<endl ; getch() ;
i = -32768 ;
i-- ;
cout<<endl<< "-32768 - 1 como short da " <<i<<endl ; getch() ;
i = 45000 ;
cout<<endl<< "i = 45000 como short da " <<i<<endl ; getch() ;
i = 32000 + 25000 ;
f=i;
cout<<endl<< "32000 + 25000 comoentero ==> " <<i<<endl ;
cout<<endl<< "32000 + 25000 como real ==> " << f <<endl ; getch() ;
f = 32000 + 25000 ;
i=f;
cout<<endl<< "32000 + 25000 comoentero ==> " <<i<<endl ;
cout<<endl<< "32000 + 25000 como real ==> " << f <<endl ; getch() ;
c = 'A' ;
cout<<endl<< "la A como char da " << c <<endl ; getch() ;
c = 65 ;
cout<<endl<< "c = 65 como char da " << c <<endl ;
c = 321;
cout<<endl<< "c = 321 como char da " << c <<endl ;
c = -191 ;
cout<<endl<< "c = -191 como char da " << c <<endl ;
c = 128 ;
cout<<endl<< "c = 128 como char da " << c <<endl ;
c = -128 ;
cout<<endl<< "c = -128 como char da " << c <<endl ;
cout<<endl<< "Tama" <<char(164) <<"o de short, int, long, float, char = "
<<sizeof(short) << ", "
<<sizeof(int) << ", "
<<sizeof(long) << ", "
<<sizeof(float) << ", "
<<sizeof(char) << " respectivamente " <<endl ;
cout<<endl<< "Presionar cualquier tecla para terminar" <<endl ;
getch() ;

19
Introducción al problema

Los algoritmos típicos para calcular productos y multiplicaciones por sumas


sucesivas o restas sucesivas, pueden resultar de baja performance en
velocidad cuando se trata de operandos binarios y lenguaje a nivel máquina.
Se desarrollan algoritmos alternativos que permitan estadísticamente un mejor
desempeño, basados en operaciones sencillas para la electrónica y en la
menor cantidad de iteraciones posibles para llegar al resultado con suficiente
precisión.

Objetivo

Investigar, analizar ventajas y desventajas e implementar algoritmos para


multiplicar en lenguaje de máquina.

Enunciados

6.02.- Plantear los algoritmos para multiplicar números de 16 bits, sin signo y con
signo, por medio de sumas sucesivas. Implementar en el lenguaje del 68HC11.

6.03.- Plantear los algoritmos para multiplicar números de 16 bits, sin signo y con
signo, por medio de sumas y desplazamientos. Implementar en el lenguaje del
68HC11.

6.04.- Existen varios métodos que permiten realizar la operación de


multiplicación a bajo nivel, cuando no se dispone de la instrucción de
multiplicación, que tienden a utilizar operaciones sencillas y a buscar buena
performance en velocidad. Entre ellos se destaca el algoritmo de Booth, cuyo
funcionamiento se basa en que, cuando en el multiplicador existen secuencias
de ceros o unos, no se requieren sumas sino solamente desplazamientos. Las
sumas se realizan cuando se detecta una transición de 0 a 1 o de 1 a 0. Se pide
implementar este algoritmo para números de 16 bits, sin signo y con signo, en el
lenguaje del HC11.

6.05.- Implementar el algoritmo de multiplicación de números de 16 bits sin y


con signo, utlizando la instrucción MUL del H11.

6.06.- Comparar las implementaciones resultantes en los puntos anteriores en


cuanto a velocidad (ciclos de máquina), en cuanto a tamaño del programa,
utilización de memoria y de registros internos de la CPU. Analizar las ventajas y
las desventajas. Establecer los rangos de aplicación y analizar la calidad en
legibilidad.

20

También podría gustarte