// Laboratorijska vjezba 03 // By Igor Kovacic // 0246002237 // Rjesenje u asembleru .include "m128def.inc" //inicijalizacija stoga ldi r16, LOW(RAMEND) out spl, r16 ldi r16, HIGH(RAMEND) out sph, r16 ldi r31, 0 ldi r30, 1 ldi r29, 2 ldi r28, 0x0A clr r22 clr r23 // R17:R16 broj 16-bitnih podataka u polju, 6000(10)=1770(16) ldi r16, 0x70 ldi r17, 0x17 // R19:R18 donja granica, -2000(10)=F830(16) ldi r18, 0x30 ldi r19, 0xF8 // R21:R20 gornja granica, 4000(10)=0FA0(16) ldi r20, 0xA0 ldi r21, 0x0F // postavi X na 0x2000 (X=r27:r26) ldi r26, 0x00 ldi r27, 0x20 // broj koji se upisuje r25:r24 (kreni od -10000) ldi r24, 0xF0 ldi r25, 0xD8 pocetak: // upisi broj i uvecaj X st X+, r24 st X+, r25 // povecaj broj koji se upisuje za 10 add r24, r28 adc r25, r31 // smanji broj elemenata sub r16, r30 sbc r17, r31 // izadi ako je popunjeno tst r17 brne pocetak tst r16 brne pocetak call potprogram nop // pocetak potprograma potprogram: // postavi X na 0x2000 ldi r26, 0x00 ldi r27, 0x20 // R17:R16 broj 16-bitnih podataka u polju, 6000(10)=1770(16) (+1 zbog smanjenja) ldi r16, 0x71 ldi r17, 0x17 ponovi: // smanji broj elemenata ldi r31, $0 sub r16, r30 sbc r17, r31 // ako dodemo do kraja polja tst r16 brne dalje tst r17 breq vrati dalje: // ucitaj broj i uvecaj adresu X-a ld r24, X+ ld r25, X+ // usporedi s donjom granicom cp r25, r19 // visi bitovi brlt ponovi // usporedi s gornjom granicom cp r21, r25 brlt ponovi // povecaj brojac ldi r31, $0 add r22, r30 adc r23, r31 // za dodatne bodove sub r24, r26 sub r25, r27 st X-, r25 st X-, r24 jmp ponovi vrati: ret