Está en la página 1de 8

1

Taller 1: Simulación
Asignatura: Estructuras Computacionales
Docente: Jaime León Hincapie
Monitor: Yohan Ricardo Céspedes Villar
Universidad Nacional de Colombia - Sede Manizales
Departamento de Ingenierı́a Eléctrica, Electrónica y Computación.

Abstract— En este documento se presenta una de xchd a,@r0


las muchas soluciones posibles para cada problema mov 27h,a
planteado. Los códigos deben ser usados en un software mov 28h,26h
de simulación compatible con los microcontroladores sjmp inicio
Atmel de la serie 80C5X, bien sea P innacle o M CU . end
El software de Simulación se encuentra en el siguiente link:
IV. E JERCICIO 4
http://xurl.es/m1ec7 Intercambiar los 2 bits más significativos con los 2 bits
menos significativos del contenido que está en la posición
de memoria 25H y guardar el resultado en la posición de
I. E JERCICIO 1
memoria 26H.
Hallar el complemento del número que se encuentre en la Ej: 25H = #5BH = 01011011B
posición de memoria 25H. El resultado se debe almacenar en entonces 26H = #D9H = 11011001B.
la posición de memoria 26H.
inicio:
inicio: ;guardo en registros cada par de bits
mov a,25h mov r0,25h
cpl a mov a,#03h
mov 26h,a anl a,r0
sjmp inicio mov r1,a
end mov a,#0c0h
anl a,r0
II. E JERCICIO 2 mov r2,a
Dividir en 2 nibbles el número que se encuentre en la mov a,r0
posición de memoria 25H e intercambiarlos, es decir, el nibble subb a,r2
más significativo debe quedar en el menos significativo y subb a,r1
viceversa. ;desplazo los bits a sus nuevas posiciones
mov r4,a
inicio: mov a,r2
mov a,25h rl a
swap a rl a
mov 26h,a mov r2,a
sjmp inicio mov a,r1
end rr a
rr a
III. E JERCICIO 3 mov r1,a
Dividir en 2 nibbles e intercambiar los menos significativos ;se genera el resultado final por medio de la suma
de las posiciones de memoria 25H y 26H. Guardar los mov a,r4
resultados en 27H y 28H. add a,r1
Ej: 25H = #15H y 26H = #36H add a,r2
entonces 27H = #16H y 28H = #35H. mov 26h,a
sjmp inicio
mov 25h,#15h end
mov 26h,#36h
inicio: V. E JERCICIO 5
mov a,25h Sumar el número que se encuentra en la posición de
mov r0,#26h memoria 25H con el que está en la posición de memoria 26H.
2

El resultado se debe almacenar en la posición 27H. IX. E JERCICIO 9


mov 25h,#04h Multiplicar el contenido de las posiciones de memoria 25H
mov 26h,#07h y 26H, el resultado debe quedar almacenado en las posiciones
inicio: de memoria 27H y 28H.
mov a,25h mov 25h,#17h
add a,26h mov 26h,#02h
mov 27h,a inicio:
sjmp inicio mov a,25h
end mov b,26h
mul ab
VI. E JERCICIO 6 mov 27h,a
Restar el número que se encuentra en la posición de mov 28h,27h
memoria 25H con el que está en la posición de memoria 26H. sjmp inicio
El resultado se debe almacenar en la posición 27H. end
mov 25h,#07h
mov 26h,#02h X. E JERCICIO 10
inicio: Dividir el contenido de la posición de memoria 25H con lo
mov a,25h que hay en la posición de memoria 26H y guardar el cociente
subb a,26h en 27H y el residuo en 28H. Si el valor que hay en la posición
mov 27h,a 26H es cero, entonces 27H = #0F F H.
sjmp inicio
end inicio:
mov a,26h
cjne a,#00h,dividir
VII. E JERCICIO 7
mov 27h,#0ffh
Correr el contenido de la posición de memoria 25H un bit sjmp inicio
a la izquierda y almacenar el resultado en 26H, el bit a la dividir:
derecha debe ser cero. mov a,25h
inicio: mov b,26h
mov a,25h div ab
rl a mov 27h,a
clr acc.0 mov 28h,b
sjmp inicio sjmp inicio
end end

VIII. E JERCICIO 8 XI. E JERCICIO 11


Tomar el dato de la posición de memoria 25H, si el número Compara dos números a y b que están en 25H y 26H
de unos que contiene es par, sumarle 5, si es impar sumarle respectivamente, y establecer lo siguiente:
3. Almacenar el resultado en la posición de memoria 26H, si Si a > b entonces 27H = #0F F H y 28H = #00H
hay acarreo (carry) entonces 26H debe quedar en cero.
Si a = b entonces 27H = #00H y 28H = #00H
inicio:
mov a,25h
Si a < b entonces 27H = #00H y 28H = #0F F H
jb p,impar
add a,#05h
jc limpiar mov 25h,#03h
mov 26h,a mov 26h,#03h
sjmp inicio inicio:
impar: mov a,25h
add a,#03h mov b,26h
jc limpiar cjne a,b,dif ;si a<b, hay carry
mov 26h,a mov 27h,#00h ;a=b
sjmp inicio mov 28h,#00h
limpiar: sjmp inicio
mov 26h,#00h dif:
sjmp inicio jc menor
end mov 27h,#0ffh ;a>b no carry
3

mov 28h,#00h mov a,num1


sjmp inicio add a,num2
menor: da a
mov 27h,#00h ;a<b hay carry mov res,a
mov 28h,#0ffh jc mayor
sjmp inicio jb psw.6,mayor
end mov 27h,#00h
sjmp inicio
XII. E JERCICIO 12 mayor:
mov 27h,#01h
Comparar bit a bit los contenidos de las posiciones de
sjmp inicio
memoria 25H y 26H y establecer el número de bits en
end
los cuales son diferentes, guardar el dato en la posición de
memoria 27H y a partir de la posición de memoria 28H
guardar las posiciones de los bits diferentes (la posicion 0 XIV. E JERCICIO 14
corresponde al bit menos signif icativo). Ej:
25H = #00H = 00000000B, 26H = #05H = 00000101B Restar el número decimal que se encuentra en la posición de
entonces 27H = #02H (2 bits dif erentes) memoria 25H con el número decimal que está en la posición
por lo tanto 28H = #00H y 29H = #02H (los que estan de memoria 26H. El resultado que debe quedar en decimal
en las posiciones 0 y 2). se guarda en la posición de memoria 28H. Si el número
en 25H es menor que el número en 26H entonces 27H =
inicio: #01H (resultado negativo), de lo contrario 27H = #00H
mov a,25h (resultado positivo).
mov b,26h Ej: 25H = #15H, 26H = #64H (numeros 15 y 64 en
xrl a,b decimal)
conteo: teniendo como resultado que:
rlc a 27H = #01H y 28H = #49H que equivale a: 15 − 64 =
jc cont −49.
djnz r1,conteo
mov 27h,r3 num1 equ 25h
sjmp salir num2 equ 26h
cont: inicio:
mov r2,a ;guardo temporalmente el dato clr c
mov a,r1 mov a,num1
clr acc.0 ;alternatica de resta del 1 da a
mov @r0,a mov num1,a
mov a,r2 mov a,num2
inc r0 ;posiciones de memoria da a
inc r3 ;contador de bits diferentes mov num2,a
djnz r1,conteo mov a, num1
mov 27h,r3 cjne a, num2,dif
sjmp salir mov 27h,#00h
salir: mov 28h,#00h
sjmp salir sjmp inicio
end dif:
jc cambiar
XIII. E JERCICIO 13 mov a,num1
subb a,num2
Sumar un número decimal que se encuentra en la posición
subb a,#06h
de memoria 25H con otro número decimal que está en la
mov 28h,a
posición de memoria 26H. El resultado que debe quedar en
sjmp inicio
decimal se guarda en la posición de memoria 28H. Si el
cambiar:
resultado es mayor que 99, la posición de memoria 27H debe
mov 27h,#01h
ser igual a #01H, de lo contrario, 27H = #00H. Ej: 67+ 86
mov a,num1
= 153 por lo tanto 27H = #01H, 28H = #53H.
mov num1,num2
num1 equ 25h mov num2,a
num2 equ 26h clr c
res equ 28h sjmp dif
inicio: end
4

XV. E JERCICIO 15 DB 81h


Sumar dos números de 16 bits (2 posiciones de memoria end
por numero).
XVIII. E JERCICIO 18
inicio:
mov a,26h Comparar dos series de caracteres ASCII y chequear si son
add a,36h iguales. El tamaño de las series se encuentra en la posición
mov 46h,a de memoria 26H. Una serie comienza en 27H y la otra en
mov a,25h 32H. Si ambas series son iguales la posición de memoria 25H
addc a,35h debe tener el número #00H y si son diferentes la posición
jc cent de memoria 25H debe tener #0F F H.
mov 45h,a inicio:
sjmp inicio mov r0, #27h
cent: mov r1, #32h
mov 44h,#01h cad:
mov 45h,a mov a, @r0
sjmp inicio mov 24h, @r1
end cjne a, 24h, nig
inc r0
XVI. E JERCICIO 16 inc r1
Restar dos números de 16 bits. dec 26h
mov a, 26h
inicio: jz ter
mov a,26h sjmp cad
subb a,36h ter:
mov 46h,a mov 25h, #00h
mov a,25h sjmp fin
subb a,35h nig:
mov 45h,a mov 25h, #0FFh
sjmp inicio sjmp fin
end fin:
sjmp inicio
XVII. E JERCICIO 17 end
Calcular el cuadrado del contenido de la posición de me-
moria 25H utilizando una tabla y almacenar el resultado en XIX. E JERCICIO 19
26H. Asumir que la posición de memoria 25H contiene un Agregar paridad en una serie de caracteres ASCII de 7
número entre 0 y 9. La tabla debe estar ubicada en la memoria bits. La longitud de la serie está en 25H, y ésta comienza en
de programa de la posición 50H a la 59H. 26H. Colocar paridad par en el bit 7 (M SB) de cada carácter
modificándolo de tal modo que el número de unos siempre
mov DPTR,#50H
sea par.
mov r0,#25H
mov r1,#26h mov r2,25h ;longitud de la serie
inicio: mov r1,#26h ;comienzo de la serie
mov a,@r0 mov r0,#36h
MOVC a,@a+DPTR inicio:
mov @r1,a ;posicion de los cuadrados mov a,@r1
sjmp inicio jb PSW.0,quitar ;salta si paridad es 1 (impar)
xch a,@r0 ;intercambia bytes
org 50h ;inicio de la tabla inc r1
DB 0h inc r0
DB 1h clr a
DB 4h djnz r2,inicio ;decrementa y salta si es cero
DB 9h sjmp fin
DB 16h quitar:
DB 25h cpl ACC.7 ;complementa bit
DB 36h xch a,@r0
DB 49h inc r1
DB 64h inc r0
5

clr a DB 03h
djnz r2,inicio DB 04h
fin: DB 05h
sjmp fin DB 06h
end DB 07h
DB 08h
XX. E JERCICIO 20 DB 09h
end
Editar una serie de caracteres ASCII decimales reempla-
zando los ceros de la izquierda por espacios. La serie empieza
en la posición de memoria 26H. Asumir que ésta consiste XXII. E JERCICIO 22
solamente de dı́gitos decimales en ASCII. La longitud de la Encontrar el número mayor de una tabla, la longitud se
serie se encuentra en la posición de memoria 25H. El espacio encuentra en 26H, el bloque comienza en 27H. Almacene
es #20H (Alt + 32) y el cero es #30H (Alt + 48). Nota: 20 el máximo en la posición de memoria 25H. Asumir que los
en Hexa corresponde a 32 en Decimal, 30 en hexa corresponde datos son todos números binarios de 8 bits sin signo.
a 48 en Decimal.
inicio:
inicio: mov r0, #27h
mov r0, #26h incre:
emp: mov 24h, @r0
mov a, @r0 inc r0
cjne a, #30h, fin comp:
mov @r0, #20h ;#20 porque los ceros mov a, 24h
inc r0 ;de la izquierda se mov 23h, @r0
dec 25h ;reemplazan por espacios. cjne a, 23h, seg
mov a, 25h seg:
jz fin jc menor
sjmp emp mov 25h, 24h
fin: dec 26h
sjmp inicio mov a, 26h
end jz fin
inc r0
XXI. E JERCICIO 21 sjmp comp
menor:
Convertir el contenido de 25H que es un carácter ASCII,
mov 25h, @r0
a un número decimal y almacenar el resultado en 26H. Si el
dec 26h
contenido de 25H no es la representación ASCII de un dı́gito
mov a, 26h
decimal, coloque la posición de memoria 26H en #0F F H.
jz fin
Los caracteres ASCII correspondientes a la serie de valores
sjmp incre
decimales son: 0 = #30H, 1 = #31H, ... , 9 = #39H.
fin:
inicio: sjmp inicio
mov DPTR,#30h end
mov a,25h
anl a,#30h XXIII. E JERCICIO 23
subb A,#30h
Convertir el contenido de la posición de memoria 25H que
jnz cero
es un numero hexadecimal a decimal y guardar el resultado en
mov a,25h
las posiciones de memoria 20H, 21H y 22H. El dı́gito más
movc a,@a+DPTR
significativo debe quedar almacenado en 20H. El número que
mov 26h,a
se encuentra en 25H no tiene signo.
sjmp inicio
Ej: 25H = #0F F H entonces 20H = #02H, 21H = #05H
cero:
y 22H = #05H;
mov a,#0FFh
Recordar que F F (hexa) = 255 (decimal)
mov 26h,a
sjmp inicio inicio:
mov 25h,p0 ;tomar entrada del puerto p0
org 60h mov 20h,#00h ;Limpiar la posicion
DB 00h mov 21h,#00h ;de las centenas, decenas
DB 01h mov 22h,#00h ;y unidades
DB 02h mov a, 25h
6

centenas: inc r0
subb a, #64h sjmp comp
jc Decenas fin:
inc 20h sjmp inicio
sjmp centenas end
Decenas:
add a, #64h XXVI. E JERCICIO 26
Otra:
Encontrar en una serie de caracteres ASCII el primer
subb a, #0ah
carácter que no sea espacio (#20H), la serie empieza en la
jc Unidades
posición de memoria 27H. Almacenar la dirección del primer
inc 21h
carácter que no sea un espacio en 25H y 26H. El nibble más
sjmp Otra
significativo debe quedar almacenado en 25H.
Unidades:
add a, #0ah inicio:
inc a mov r0, #27h
mov 22h,a cjne a, #20h, noig
carl: inc r0
sjmp inicio sjmp inicio
end noig:
mov a, @r0
mov 22h, a
XXIV. E JERCICIO 24 swap a
anl a, #0Fh
Convertir el contenido de la posición de memoria 25H que
mov 25h, a
está en decimal a Hexadecimal y guardar el resultado en la
anl 22h, #0Fh
posición 26H. El número que se encuentra en 25H no tiene
mov 26h, 22h
signo y es menor que #100D.
sjmp fin
num_dec equ 25h fin:
num_hex equ 26h sjmp inicio
; La operacion efectuada es la siguiente: end
;num_hex = num_dec - (num_dec / 10) * 6
inicio: XXVII. E JERCICIO 27
mov a, num_dec
En un bloque de caracteres (números) cuya longitud se
mov b, #10h
encuentra en la posición de memoria 26H, almacenar el
div ab
número de elementos negativos en 25H. El bloque empieza
mov b, #06H
en 27H. Los números serán de 7 bits, el octavo bit (M SB)
mul ab
será el signo: si es 1, el número es negativo.
mov r0, a
mov a, num_dec inicio:
subb a, r0 mov r1,26h
mov num_hex, a mov r0, #27h
sjmp inicio comen:
end mov a, @r0
anl a, #80h
XXV. E JERCICIO 25 cjne a, #80h, nig
inc 25h
Determinar el tamaño de una serie de caracteres ASCII
inc r0
de 7 bits. La serie comienza en la posición de memoria 26H.
dec r1
El fin de la serie está marcado por el carácter enter CR =
mov a, @r1
#0DH (Enter = Alt + 13). Almacenar la longitud de la
jz fin
serie excluyendo CR en la posición de memoria 25H.
sjmp comen
inicio: nig:
mov r0, #26h inc r0
comp: dec r1
cjne @r0, #0Dh, cad mov a, @r1
sjmp fin jz fin
cad: sjmp comen
inc 25h fin:
7

sjmp inicio cjne a, #7h, comp4


end sjmp si_primo
comp4:
XXVIII. E JERCICIO 28 cjne a, #0bh, comp5
sjmp si_primo
Convertir un número BCD almacenado en la posición de
comp5:
memoria 25H a código de 7 segmentos. El resultado de-
cjne a, #0dh, comp6
berá quedar almacenado en 26H.
sjmp si_primo
inicio: comp6:
mov a, 25h cjne a, #11h, divis
movc a, @a+DPTR sjmp si_primo
mov 26h, a
sjmp fin ;dividir el numero en los primeros
fin: ;numeros primos y con el residuo
sjmp inicio ;saber si es o no primo

org 50h divis:


DB 7Eh mov 42h, a
DB 30h mov b, #2h ; division en 2
DB 6Dh div ab
DB 79h mov a, b
DB 33h jz no_primo
DB 5Bh
DB 5Fh mov a, 42h
DB 70h mov b, #3h ; division en 3
DB 7Fh div ab
DB 73h mov a, b
end jz no_primo

XXIX. E JERCICIO 29 mov a, 42h


mov b, #5h
Determinar si el número que se encuentra en la posición
div ab ; division en 5
25H es un número primo o no. Si es primo 26H = #00H
mov a, b
de lo contrario 26H = #0F F H. Asumir que el número que
jz no_primo
se encuentra en 26H es menor que #100D ó #64H.
inicio: mov a, 42h
mov 25h, p0 mov b, #7h
mov a, 25h div ab ; divison en 7
cjne a, #01h, compar mov a, b
sjmp si_primo jz no_primo

;comparar el numero con los mov a, 42h


;numeros en los que vamos a mov b, #0bh
;dividir para saber si es o no primo div ab ; division en 11
mov a, b
compar: jz no_primo
cjne a, #00h,comp
sjmp no_primo mov a, 42h
comp: mov b, #0dh ; division en 13
cjne a, #2h, comp1 div ab
sjmp si_primo mov a, b
comp1: jz no_primo
cjne a, #3h, comp2
sjmp si_primo mov a, 42h
comp2: mov b, #11h
cjne a, #5h, comp3 div ab ; division en 17
sjmp si_primo mov a, b
comp3: jz no_primo
8

entonces la conversión serı́a:


si_primo: 27H = #06H, 28H = #05H, 29H = #05H, 2A = #03H,
mov 26h,#00h 2BH = #05H (65535 en decimal)
ljmp inicio
...........................
no_primo:
mov 26h, #0FFh XXXI-B. Ejercicio 32
ljmp inicio Convertir el contenido de las posiciones de memoria 25H y
end 26H los cuales conforman un número de 4 cifras en decimal
(de 0000 a 9999) a Hexadecimal y guardar el resultado en las
XXX. E JERCICIO 30 posiciones de memoria 27H y 28H. La parte más significativa
se guarda en 27H.
Ordenar una serie en forma descendente. El tamaño de la
Ej: 25H = #31H, 26H = #62H, conforman el número
serie se encuentra en la posición 25H y la serie empieza en
3162 en decimal.
26H. La serie debe quedar ordenada a partir de la posición
27H = #0CH, 28H = #5AH, conforman el número C5A
30H (se debe mantener igual la serie que inicia en 26H).
que es el equivalente en hexadecimal de 3162.
MOV 23H,25H
...........................
MOV R1,#30H
MOV 22H,25H
INI2: XXXI-C. Ejercicio 33
MOV R0,#26H Comparar dos series de caracteres ASCII y determinar
MOV 25H,22H cual precede a la otra en orden alfabético. El tamaño de las
MOV 24H,25H series se encuentra en la posición 26H. Una serie empieza en
INI: 27H y la otra en 32H. Si las dos series son alfabéticamente
CLR C iguales 26H = #0AAH (GAT O = gAT o); si la primera
MOV A,@R0 serie (27H) está alfabéticamente después de la segunda serie
SUBB A,@R1 (32H) 26H = #0DDH (GAT O - GAT A) y si la primera
JC MENORA serie (27H) esta alfabéticamente antes de la segunda serie
MOV A,@R0 (32H) 26H = #0EEH (GAT A - gato). Tener en cuenta
MOV @R1, A tanto letras mayúsculas como minúsculas, caracteres ASCII
MENORA: de las letras mayúsculas del #41H al #5AH y de las letras
INC R0 minúsculas del #61H al #7AH.
DJNZ 25H, INI
...........................
MOV R0,#26H
INI1:
MOV A,@R1 XXXI-D. Ejercicio 34
CLR C Incrementar la posición de memoria 25H cada 100 ciclos
SUBB A,@R0 de máquina al mismo tiempo que se incrementa la posición de
JNZ NOIG memoria 26H cada vez que haya una interrupción externa por
MOV @R0,#00H flanco de bajada. Los ciclos de maquina deben ser contados
NOIG: en todo el transcurso del programa.
INC R0
DJNZ 24H,INI1 ...........................
INC R1
DJNZ 23H, INI2 XXXI-E. Ejercicio 35
fin: Usando el teclado que se encuentra en el simulador, realizar
sjmp fin un programa que me identifique que tecla fue oprimida,
END usar sus equivalentes numéricos en hexadecimal. Ej:tecla
0 = #00H, 1 = #01H,..., F = #0F H y asignar a
XXXI. EJERCICIOS DE REPASO G = #10H,..., J = #13H.
XXXI-A. Ejercicio 31 ...........................
Convertir el contenido de las posiciones de memoria 25H
y 26H que conforman un número hexadecimal de 4 cifras
(de 0000 a F F F F )a cinco dı́gitos BCD y guardarlos en las
posiciones de memoria 27H, 28H, 29H, 2AH y 2BH. El
número más significativo debe quedar en 27H.
Ej: 25H y 26H = #F F F F

También podría gustarte