vuoi
o PayPal
tutte le volte che vuoi
RET
7. Realizzare una subroutine che converte in BCD il valore binario contenuto nel registro R0, lasciando il
risultato nel registro stesso. Nel caso in cui il dato di partenza non rappresenti un valore rappresentabile in
BCD, il risultato deve essere posto al valore BCD 99.
PUSH R16
PUSH R17
MOV R17, R0
LDI R16, 99
CPI R17, 100
BRGE end
CLR R16
MOV R16, R0
ANDI R16, ob 11110000
SWAP R16
MULI R16,10
ANDI R17, ob 00001111
ADD R16, R17
end: MOV R0, R16
POP R17
POP R 16
RET
8. Realizzare una subroutine che converte in binario le due cifre BCD contenute nel registro R0, lasciando il
risultato nello stesso registro R0. Nel caso in cui il dato di partenza non rappresenti un valore BCD valido, il
risultato deve essere posto a 0.
PUSH R0
PUSH R16
PUSH R17
PUSH R18
LDI R18, 10
MOV R16, R0
ANDI R16, 0x0F
CP R16,R18
BRGE nv
MOV R17,R0
ANDI R17, 0XF0
SWAP R17
CP R17, R18
BRGE nv
MUL R17, R18
ADD R17, R16
MOV R0, R17
restore:
POP R18
POP R17
POP R16
POP R0
RET
nv: CLR R0
RJUMP restore
9. Realizzare una subroutine che esegue l’operazione di modulo 7 sul valore binario rappresentato su 2 byte,
contenuto in memoria a partire dall’indirizzo in X, lasciando il risultato in R0.
PUSH R16
PUSH R17
PUSH R0
LD R16, X+
LD R17,X
ciclo1: SUBI R17, 7
CPI R17, 7
BRGE ciclo1
MULI R17, 4
ciclo2: SUBI R17, 7
CPI R17, 7
BRGE ciclo2
ciclo3: SUBI R16,7
CPI R16, 7
BRGE ciclo3
ADD R16, R17
compare: CPI R16,7
BRGE ultimo
10. Realizzare una subroutine che valuta il numero di occorrenze di un valore a 16 bit (contenuto nel puntatore
Z), nel vettore di 8 valori da 16 bit contenuto nella memoria dati estesa in locazioni consecutive a partire
dall’indirizzo contenuto n X. Il risultato viene lasciato in R0.
PUSH R16
PUSH R20
PUSH R21
CLR R0
LDI R16, 8
loop:
LD R20,X+
LD R21, X+
CP R20, ZL
CPC R21, ZH
BRNE diversi
INC R0
diversi:
DEC R16
BRNE loop
SBIW XH:XL, 16
POP R21
POP R20
POP R16
RET
11. Realizzare una subroutine che inverte la posizione dei bit del puntatore a 16 bit contenuto in Z. la subroutine
deve lasciare inalterati tutti gli altri registri.
PUSH R16
ROR ZL
LDI R16,8
loop:
ROL ZH
ROR ZL
DEC R16
BRNE loop
POP R16
RET
12. Realizzare una subroutine che traspone la matrice di byte di dimensioni 3x3, collocate in memoria dati
estesa a partire dall’indirizzo contenuto in Z. la matrice trasposta sostituisce la matrice originale.
PUSH R16
PUSH R17
LDD R16, Z+1
LDD R17, Z+3
STD Z+3, R16
STD Z+1, R17
LDD R16, Z+2
LDD R17, Z+6
STD Z+6, R16
STD Z+2, R17
LDD R16, Z+5
LDD R17, Z+7
STD Z+7, R16
STD Z+5, R17
POP R17
POP R16
RET
13. Realizzare un sottoprogramma in grado di scrivere il valore contenuto in R0 in un certo numero (contenuto
in R1) di locazioni di memoria consecutive a partire da quella puntata in x. Il valore R1=0 deve essere
interpretato come 256.
PUSH R1
PUSH XL
PUSH XH
loop:
ST X+, R0
DEC R1
BRNE loop
POP XH
POP XL
POP R1
RET
14. Realizzare un sottoprogramma in grado di determinare quante volte il valore a 16 bit contenuto in X si
ritrova nelle 32 locazioni consecutive a partire da quella puntata da Y. Il risultato deve essere lasciato in R0.
PUSH R16
PUSH R20
PUSH R21
CLR R0
LDI R16, 31
loop:
LD R20, Y+
LD R21, Y
CP R20, XL
CPC R21, XH
BRNE diversi
INC R0
diversi:
DEC R16
BRNE loop
SBIW YH:YL, 31
POP R21
POP R20
POP R16
RET
15. Realizzare una subroutine che scambia la posizione dei bit pari e dispari di R0. Sono scambiati tra loro il bit 0
e il bit 1, il bit 2 e il bit 3 e così via.
PUSH R16
PUSH R17
MOV R16, R0
MOV R17, R0
ANDI R16, ob 01010101
ANDI R17, ob 10101010
LSL R16
LSR R17
OR R16, R17
MOV R0,R16
POP R17
POP R18
RET
16. Scrivere un sottoprogramma che salvi il contenuto del registro SP nelle locazioni di memoria consecutive a
partire dall’indirizzo 0X4000. La parte bassa dello stack pointer è salvata nella locazione con indirizzo minore.
PUSH R24
PUSH R25
LDS R24, CPU_SPL
LDS R25,CPU_SPH
ADIW R25:R24, 5
STS 0X4000, R24
STS 0X4000, R25
POP R25
POP R24
RET
17. Scrivere un sottoprogramma che determina quante volte appaiono i caratteri i cui codici sono dati nei
registri R16 e R17 in una stringa di 128 caratteri consecutivi contenuta nella memoria dati estesa.
PUSH R18
PUSH R19
PUSH R20
CLR R18
LDI R19, 128
loop: LD R20, X+
CP R20, R16
BRNE l1
INC R18
l1: CP R20, R17
BRNE l2
INC R18
l2: DEC R19
BRNE loop
ST Y, R18
SBIW XH:XL, 60
SBIW XH:XL, 60
SBIW XH:XL, 8
POP R20
POP R19
POP R18
RET
18. Scrivere un sottoprogramma che riscrive in ordine inverso una stringa di n caratteri (n è contenuta in R0)
collocate in memoria estesa a partire dall’indirizzo presente in X.
PUSH R16
PUSH R17
PUSH XL
PUSH XH
PUSH YL
PUSH YH
PUSH R18
PUSH R19
CLR R17
MOV R16, R0
CPI R16, 1
BRLE fine
LSR R16
MOV YL, XL
MOV YH, XH
ADD YL, RO
ADC YH, R17
loop:
LD R18, X
LD R19, -X
ST X+, R19
DEC R16
BRNE loop
fine: POP R19
POP R 18
POP YH
POP YL
POP XH
POP XL
POP R17
POP R16
RET
19. Scrivere un sottoprogramma che valuta la somma con segno di n numeri interi (n>0 è contenuto in R0) da 1
byte, collocati in memoria estesa a partire dall’indirizzo presente in X.
PUSH R0
PUSH R16
PUSH R17
PUSH R18
PUSH R19
PUSH XL
PUSH XH
CLR R18
CLR R19
loop:
LD R16, X+
CLR R17
TST R16
BRPL poi
SER R17
poi: ADD R18,R16
ADC R19, R17
DEC R0
BRNE loop
ST Y+, R18
ST Y, R19
SBIW YL, 1
POP XH
POP XL
POP R19
POP R18
POP R 17
POP R 16
POP R0
20. Scrivere un sottoprogramma che determina il numero totale di bit a 1 contenuti nelle 31 locazioni
consecutive di memoria a partire da quella puntata da X e lo lascia in R0.
PUSH R1
PUSH R16
PUSH R17
PUSH R18
CLR R0
CLR R1
LDI R16,31
loop1:
LDI R17, 8
LD R18, X+
loop2:
LSR R18
ADC R0, R1
DEC R17
BRNE loop2
DEC R16
BRNE loop1
SBIW XH:XL, 31
POP R18
POP R17
POP R1
RET
21. Scrivere un sottoprogramma che determina se la somma dei primi 16 byte consecutive di memoria, a partire
da quello puntato da X, è maggiore, uguale o minore di quella dei successive 16. Il risultato viene lasciato nei
flag Z e C.
PUSH R16
PUSH R18
PUSH R19
PUSH R20
PUSH R21
PUSH R22
PUSH R23
CLR R19
CLR R20
CLR R21
CLR R22
CLR R23
LDI R16, 16
loop1: LD R18, X+
ADD R20, R18
ADC R21, R19
DEC R16
BRNE loop1
LDI R16, 16
loop2:
LD R18, X+
ADD R22, R18
ADC R23, R19
DEC R16
BRNE loop2
SBIW XH:XL, 32
CP R20, R22
CPC R20, R22
POP R23
POP R22
POP R21
POP R20
POP R19
POP R18
POP R16