Sunteți pe pagina 1din 5

Problema 5

.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

La dificultad es el signo, pasar un nmero de 8-bits con signo a 16-bits


manteniendo el signo (extensin de signo)

.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"

; Subrutina devuelve en R0=00 si OK


; R0=FF no ok

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"

; Subrutina con 3 parmetros de entrada


; X,Y,R16
; R17 se usa internamente, por lo que hay que
; salvarlo y recuperarlo
mover_vector:
push r17
bucle_mov:
ld r17,x+
st y+,r17
dec r16
brne bucle_mov
pop r17
ret

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"

; Escriba un fragmento de programa cargue en R0 el elemento menor de una


; tabla de 16
; nmeros sin signo de 1 byte almacenados a partir de la direccin $0100.

.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"

; Escriba una subrutina que devuelva en R0 el


; elemento menor de una tabla de nmeros
; con signo de 1 byte. La direccin de
; comienzo de la tabla se indica en el registro X, y el nmero de datos
; en R16

.equ N=16

ldi r16,N
ldi xh,$01
ldi xl,$00 ; X=$0100
call buscar_menor
break;

; subrutina busca menor: r0 = buscar_menor(r16,x)


; en R0 lo devuelve
; en r16 N
; X el vector

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"

; Una tabla con 100 datos de 1 byte con signo


; est almacenada a partir de la direccin
; $0100. Escriba un programa que
; almacene en R0 el nmero de datos positivos que hay en dicha tabla, y
; en R1 el nmero de datos negativos.

.equ N=100

ldi r16,N
ldi xh,$01
ldi xl,$00 ; X=$0100

clr r0 ; los positivos


clr r1 ; negativos

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

S-ar putea să vă placă și