Documente Academic
Documente Profesional
Documente Cultură
.include "m328Pdef.inc"
clr r16
clr r18
lds r17,$0101
lds r19,$0100
add r17,r19
adc r16,r18
sts $0102,r16
sts $0103,r17
break
Problema 6
.include "m328Pdef.inc"
lds r16,$0101
lds r17,$0100
mul r16,r17
sts $0102,r1 ; Parte alta de la multiplicacin
sts $0103,r0 ; Parte baja
break
Problema 7
.include "m328Pdef.inc"
clr r16
lds r17,$0100 ; primer nmero r16:r17
clr r18
lds r19,$0101 ; segundo nmero en r18:r19
add r17,r19
adc r16,r18 ; suma de 2 nmeros en r16:r17
clr r18
lds r19,$0102 ; tercer nmero en r18:r19
add r17,r19
adc r16,r18 ; suma de 3 nmeros en r16:r17
sts $0200,r16
sts $0201,r17
Problema 8
.include "m328Pdef.inc"
clr r18
lds r17,$0100
sbrc r17,7
ser r18 ; Primer nmero en r18:r17
clr r19
lds r20,$0101
sbrc r20,7
ser r19 ; Segundo nmero en r19:r20
add r17,r20
adc r18,r19
clr r19
lds r20,$0102
sbrc r20,7
ser r19 ; Tercer nmero en r19:r20
add r17,r20
adc r18,r19 ; suma en r18:r17
sts $0200,r18
sts $0201,r17
Problema 9
.include "m328Pdef.inc"
checksum:
; r16 es para la suma
; r17 como contador del bucle
; Las instrucciones push y pop son para salvar
; los registros usados en la subrutina
; tambin se deberan salvar tanto XH como XL
push r16
push r17
push r18
ldi r16,0
lds r17,$0100
dec r17
ldi xh,$01
ldi xl,$01
bucle_suma:
ld r18,x+
add r16,r18
dec r17
brne bucle_suma
ld r17,x
cp r17,r16
brne checksum_error
clr r0 ; Resultado OK
jmp volver
checksum_error:
ldi r16,$ff
mov r0,r16 ; Resultado error
volver:
pop r18
pop r17
pop r16
ret
Problema 10
.include "m328Pdef.inc"
.equ N=16
ldi xh,$01
ldi xl,$00 ; X = $0100
ldi yh,$02
ldi yl,$00 ; Y = $0200
ldi r16,N
bucle_mov:
ld r17,x+
st y+,r17
dec r16
brne bucle_mov
break
Problema 11 a)
.include "m328Pdef.inc"
Problema 11 b)
; Llamada a mover_vector(X,Y,R16)
ldi r16,16
ldi xh,$01
ldi xl,$00 ; X = $0100
ldi yh,$02
ldi yl,$00 ; Y = $0200
call mover_vector
break
Problema 12:
.include "m328Pdef.inc"
.equ N=16
ldi r16,N
ldi xh,$01
ldi xl,$00 ; X=$0100
ld r17,x+ ; X=$0101
dec r16
bucle:
ld r18,x+
cp r18,r17
brlo actualizar ; salta si Rd < Rr => r18 < r17
sigue:
dec r16
brne bucle
jmp fin
actualizar:
mov r17,r18
jmp sigue
fin:
break;
Problema 13
.include "m328Pdef.inc"
.equ N=16
ldi r16,N
ldi xh,$01
ldi xl,$00 ; X=$0100
call buscar_menor
break;
buscar_menor:
push r18
ld r0,x+ ; X=$0101
dec r16
bucle:
ld r18,x+
cp r18,r0
brlt actualizar ; salta si Rd < Rr => r18 < r0
sigue:
dec r16
brne bucle
jmp fin
actualizar:
mov r0,r18
jmp sigue
fin:
pop r18
ret
Problema 14
.include "m328Pdef.inc"
ldi xh,$01
ldi xl,$00
ldi r16,0
bucle:
inc r16
inc r16
st x+,r16
cpi r16,254
brne bucle
Problema 15
.include "m328Pdef.inc"
.equ N=100
ldi r16,N
ldi xh,$01
ldi xl,$00 ; X=$0100
bucle:
ld r17,x+
tst r17 ; Cambiar esta instruccin por CP o CPI
brmi negativo ; Cambiar esta instruccin por BRxx r17 < 0
inc r0
jmp sigue
negativo:
inc r1
sigue:
dec r16
brne bucle
break