Problemas resueltos curso 18/19
por Ruiz de Clavijo, Paulino
—
Última modificación
30/05/2019 10:49
## Rellenar la memoria con datos
.include"m328pdef.inc"
.EQU N=16
LDI XH,0X01
LDI XL,0X00 ; X = 0X0100
LDI R16,1
Bucle: ST X+, R16
INC R16
CPI R16 , N+1
BRNE Bucle
## Problema 7a
traslada:
PUSH R17 ; Hay que guardar los registros
PUSH R18 ; que se usen en la subrutina
CLR R17
Bucle_traslada:
INC R17
LD R18,X+ ; R18=RAM[X++]; (equivalente en JAVA/C)
ST Y+, R18 ; RAM[Y++]=R18; (equivalente en JAVA/C)
CP R17,R16
BREQ fin_traslada
JMP Bucle_traslada
fin_traslada:
POP R18 ; Recupera los registros guardados
POP R17 ; antes de volver de la subrutina
ret
## Problema 7b
LDI XH, 0X01
LDI XL, 0x00
LDI YH, 0X02
LDI YL, 0x00
LDI R16, 16
CALL Traslada
## Problema 8
ldi xh,0x01
ldi xl,0x00
ld r0, x
ldi r16,0
bucle: ; for (r16=0;r16!=16;r16++)
cpi r16,16
breq fin
ld r17,x+
cp r0,r17
brlo sigue ; Comprueba si el número es menor
mov r0, r17
sigue:
inc r16
jmp bucle
## Problema 10
.include"m328pdef.inc"
LDI XH, 0x01
LDI XL, 0x00
LDI R16, 2
Bucle:
ST X+, R16
INC R16
INC R16
CPI R16, 254
BREQ Fin
JMP Bucle
Fin:
ST X+, R16 ; Faltaba una iteración del bucle
BREAK
## Problema 11
LDI XH, 0x01
LDI XL, 0x00
LDI R16, 0
CLR R0
CLR R1
Bucle:
ld r17,x+
SBRS R17,7 ; Comprueba si el bit 7 es 0
INC R0 ; Es positivo
SBRC R17,7 ; Comprueba si el bit 7 es 1
INC R1 ; Es negativo
inc r16
cpi r16,100
BREQ Fin
JMP Bucle
Fin:
BREAK
## Problema 12
; Este es un poco complicado de entender
LDI XH, 0x01
LDI XL, 0x00
LDI YH, 0x01
LDI YL, 0x10 ; Apunta al siguiente tras el último
LDI R16, 0
Bucle:
ld R0,x
ld R1,-y
st x+,r1
st y,r0
inc r16
cpi r16,8
brne bucle ; Salta si R16 != 8
BREAK
## Problema 18
.include"m328pdef.inc"
ldi r16,0b01000001
call subrutina_bcd
break
subrutina_bcd:
push r17
push r18
mov r17,r16
mov r18,r16
andi r17,0b00001111
andi r18,0b11110000
swap r18
cpi r17,10 ; R17 < 10
brlo ok
ser r0
jmp fin_subrutina
ok:
cpi r18,10 ; R17 < 10
brlo ok2
ser r0
jmp fin_subrutina
ok2:
clr r0
fin_subrutina:
pop r18
pop r17

