UL/FRI/UNI-RI/ARS1/Vaje/VajE hip
Iz E-študij, proste zakladnice študentskega znanja
2. Napišite zaporedje ukazov v zbirniku za procesor HIP, ki vrednost 32-bitne spremenljivke STEV1 prepiše v 32-bitno spremenljivko STEV2. Spremenljivki STEV1 in STEV2 naj bosta na naslovih od 0x400 dalje. Ukazi naj se nahajajo od naslova 0x0 naprej.
.data .org 0x400 STEV1: .word 15 STEV2: .word 10 .text .org 0 lw r1,STEV1(r0); lw r2,STEV2(R0) sw STEV2(R0),r1 sw STEV1(R0),r2 halt;
3. Napišite zaporedje ukazov v zbirniku za procesor HIP, ki zamenja vrednosti 32-bitnih spremenljivk STEV1 in STEV2. Spremenljivki STEV1 in STEV2 naj bosta na naslovih od 0x400 naprej. Ukazi naj se nahajajo od naslova 0x0 naprej.
.data .org 0x400 stev1: .word 5 stev2: .word 3 .code .org 0 lw r1,stev1(r0) lw r2,stev2(r0) sw stev2(r0),r1 sw stev1(r0),r2
4. Napišite zaporedje ukazov v zbirniku za procesor HIP, ki predznačeno sešteje 32-bitni spremenljivki STEV1 in STEV2, rezultat pa zapiše v 32-bitno spremenljivko REZ. Spremenljivke STEV1, STEV2 in REZ naj bodo na naslovih od 0x400 naprej. Nalogo ponovite še na primeru, če spremenljivko STEV2 odštejemo od spremenljivke STEV1.
.data .org 0x400 STEV1: .word -15 STEV2: .word -10 REZ: .word 0 .text .org 0 lw r1,STEV1(r0); lw r2,STEV2(R0) add r1,r1,r2 sw REZ(R0),r1 halt;
5. Različica te naloge za nepredznačena števila
.data .org 0x400 STEV1: .word -15 STEV2: .word -10 REZ: .word 0 .text .org 0 lw r1,STEV1(r0); lw r2,STEV2(R0) addu r1,r1,r2 sw REZ(R0),r1 halt;
7. Napišite zaporedje ukazov v zbirniku za procesor HIP, ki v 32-bitno spremenljivko MAX zapiše večjo od obeh vrednosti 32-bitnih spremenljivk VAR1 in VAR2. Spremenljivke hranijo predznačena števila.
.data .org 0x400 VAR1: .word 0x44000044 VAR2: .word 0x44000066 MAX: .word 0 .text .org 0 addi r10,r0,#2 lw r1,VAR1(R0) sw MAX(r0),r1 lw r2,VAR2(r0) sgt r1,r2,r1 bne r1,LOOP halt LOOP: sw MAX(R0),r2 halt
8. Različica zgornjega programa za nepredznačena števila
.data .org 0x400 VAR1: .word 0x44000044 VAR2: .word 0x43000066 MAX: .word 0 .text .org 0 addi r10,r0,#2 lh r1,VAR1(R0) lh r2,VAR1(r10) lh r3,VAR2(r0) lh r4,VAR2(r10) lw r10,VAR1(r0) sgt r5,r3,r1 bne r5,LOOP seq r5,r3,r1 beq r5,KON sgt r5,r4,r2 bne r5,LOOP KON: sw MAX(R0),r10 halt LOOP: lw r10,VAR2(R0) j KON(r0)
9. Napišite zaporedje ukazov v zbirniku za procesor HIP, ki 32-bitno spremenljivko VAR1 množi z 2^N, kjer je konstanta N zapisana v 8-bitni spremenljivki POTENCA in rezultat shrani v 32-bitno spremenljivko REZ. Spremenljivki VAR1 in REZ hranita predznačena števila.
.data .org 0x400 var1: .word 5 pot: .byte 6 rez: .space 4 .code .org 0 lw r1,var1(r0) lb r2,pot(r0) sll r3,r1,r2 addi r9,r0,#3; za odmik sw rez(r9), r3
15. Napišite zaporedje ukazov v zbirniku za procesor HIP, ki najprej zapiše dvojiški komplement 32-bitne spremenljivke STEV1 v spremenljivko STEV2, nato pa eniški komplement STEV1 zapiše v STEV3. Kakšna je končna vrednost spremenljivk STEV2, STEV3, če je začetna vrednost spremenljivke STEV1 enaka: 0, 10, $FE, -1, 32, 128, %01011010? Spremenljivke STEV1, STEV2 in STEV3 naj bodo na naslovih od 0x400 naprej. Napišite zaporedje ukazov še za primer 8-bitnih in 16-bitnih spremenljivk.
POZOR: RESITEV JE NAPACNA(PRI POZITIVNIH NI INVERTANJA BITOV IN PRISTEVANJA 1)!!! .data .org 0x400 var1: .word 2 var2: .space 4 var3: .space 4 .code .org 0 lw r1, var1(r0) not r2,r1,r0; eniski kompl. addi r3, r2, #1; dvojiski kompl. = eniski+1 sw var3(r0), r2; shranimo obe variabli sw var2(r0), r3
17. Napišite zaporedje ukazov v zbirniku za procesor HIP, ki zamenja vrednosti dveh registrov med seboj. Pri tem ne smete uporabiti pomožnih spremenljivk v pomnilniku.
.data .org 0x400 var1: .word 800 var2: .word 600 .code .org 0 ;zamenjali bomo vrednosti r1 in r2 lw r1, var1(r0) lw r2, var2(r0) add r3, r0, r1; r3<-r1, da bomo imeli se vedno vrednost r1, ko jo prepisemo z r2 add r1, r0, r2; r1<-r2 add r2, r0, r3; r2<-r3(=r1)
18. Napišite zaporedje ukazov za procesor HIP, ki v register R1 naloži vrednost 10, nato pa register stalno zmanjšuje za 1, dokler vrednost ni enaka 0 (programska zanka).
.data .org 0x400 var1: .byte 10 .code .org 0 lbu r1, var1(r0) ;zanka v kateri zmanjsujemo za 1 LOOP: subui r1, r1, #1 bne r1, #LOOP
19. Napišite zaporedje ukazov za procesor HIP, ki postavi vse bajte spremenljivke (polja) TABELA na naslovu 0x400 na 0. Dolžina polja TABELA je 7 bajtov. Pri eni uporabite rešitev iz naloge 17 (števec ponovitev), pri drugi pa uporaba števca ponovitev ni dovoljena.
varianta s števcem:
.data .org 0x400 tab: .space 7 .code .org 0 addui r1, r0, #0 ; nastavimo r1 na 0, potem ga bomo povecevali za 1 addui r2, r0, #7 ; meja za zanko ;1 byte zasede en naslov, zato gremo po naslovih nastavljat nicle LOOP: sb tab(r1), r0; nastavimo byte na 0 addui r1, r1, #1; povecujemo r1 za 1 seq r3, r1, r2; preverimo ce smo ze dosegli mejo beq r3, LOOP
varianta brez števca:
TA REŠITEV JE NAPAČNA, TUDI TU JE TREBA UPORABITI LOOP, VENDAR NA DRUGAČEN NAČIN UGOTOVITI KDAJ JE KONEC TABELE
.data .org 0x400 tab: .space 7 .code .org 0 sw 0x400(r0), r0; nastavimo prve 4 byte na 0(naslovi 0x400-0x403) sh 0x404(r0), r0; nastavimo 2 byta na 0(naslovi 0x404-0x405) sb 0x406(r0), r0; nastavimo se zadnjega na 0
22. Spremenljivka TABELA je določena z
TABELA .BYTE 1, 100, 255, 24, 88, 31, 56, 192, 155, 224, 48, 0, 128, 99, 147, 177
Rezultat naj bo v vsaki od nalog shranjen v 8-bitno spremenljivko REZ. Spremenljivka
REZ naj bo na naslovu 0x400, tabela TABELA pa za spremenljivko REZ.
Napišite zaporedje ukazov za procesor HIP, ki
a) Prešteje vsa števila večja od 100 predznačeno.
.data .org 0x400 rez: .space 1 tabela: .byte 1,101,255,24,88,31,56,192,155,224,48,0,128,99,147,117 .code .org 0x0 addi r10,r0,15; odmik addi r11,r0,0; znuleramo reg 11 zac: beq r10,konec lb r1,tabela(r10) sgti r2,r1,#100 subi r10,r10,#1 bne r2,povecaj j zac(r0) povecaj: addi r11,r11,#1 subi r2,r2,#1 j zac(r0) konec: lb r1,tabela(r10) sgti r2,r1,#100 bne r2,povecaj sb rez(r0), r11
b) Prešteje vsa števila večja od 100 nepredznačeno.
.data .org 0x400 tab: .byte 125, 100, 255, 24, 88, 31, 56, 192, 155, 224, 48, 0, 128, 99, 147, 177 rez: .space 1 .code .org 0 addui r1, r0, #16; meja addui r2, r0, #0; odmik addui r3, r0, #0; za stetje vecjih od 100 LOOP: lbu r4, tab(r2) sgti r5, r4, #100 bne r5, JUMP ; se sprozi ko najdemo vecje od 100 RETURN: subui r1,r1,#1 addui r2, r2, #1 bne r1, LOOP ; izvaja se dokler ni r1 enak 0 oz. dosezemo konec sb rez(r0), r3 halt JUMP: addui r3, r3, #1 j RETURN(r0)
c) Prešteje vsa števila večja ali enaka 48 in manjša ali enaka 57.
.data .org 0x400 REZ: .space 1 TABELA: .byte 50,100,255,24,88,31,56,192,155,224,48,0,128,99,147,177 ;rezerviramo 1 bajt (8 bitov) .code .org 0x0 addi r1, r0, #15 addi r2, r0, #0 subi r7, r0, #1 ;shranimo -1 v r7 (za mejo) ZANKA: seq r8, r1, r7 ;preverimo mejo ..ce je r7 = r1 = -1, moramo koncati program bne r8, KONEC lb r3, TABELA(r1) ;v ZANKo nalozimo trenutno vrednost TABELe sgei r4, r3, #48 ;ukaz za r3 >= 48 slei r5, r3, #57 ;ukaz za r3 =< 57 and r6, r4, r5 ;ce je r5 = 1 in r4 = 1, bo tudi r6 = 1 !! bne r6, PRISTEJ subi r1, r1, #1 ;odvzamemo 1 od r1 seq r8, r1, r7 ;preverimo mejo ..ce je r7 = r1 = -1, moramo koncati program bne r8, KONEC j ZANKA(r0) PRISTEJ: addi r2, r2, #1 ;povecamo stevec subi r1, r1, #1 ;odvzamemo 1 od r1 j ZANKA(r0) KONEC: sb REZ(r0), r2 ;shranimo vrednost v REZT halt
d) Prešteje vsa negativna števila.
.data .org 0x400 REZ: .space 1 TABELA: .byte 1,100,255,24,88,31,56,192,155,224,48,0,128,99,147,177 ;rezerviramo 1 bajt (8 bitov) .code .org 0x0 addi r1, r0, #15 ;odmik addi r2, r0, #0 ;v r2 shranjujemo negativna stevila subi r3, r0, #1 ;v r3 shranimo -1 (meja) ZANKA: seq r6, r1, r3 ;primerjamo, ce je r1 = r3 = -1..v tem primeru je r6=1 bne r6, KONEC lb r4, TABELA(r1) ;trenutna vrednost slti r5, r4, #0 ;primerjamo, ce je r4 =< 0..ce je, bo r5 = 1 bne r5, PRISTEJ subi r1, r1, #1 ;zmanjsamo r1 za 1 seq r6, r1, r3 ;primerjamo, ce je r1 = r3 = -1..v tem primeru je r6=1 bne r6, KONEC j ZANKA(r0) PRISTEJ: addi r2, r2, #1 ;povecamo r2 za 1 subi r1, r1, #1 ;zmanjsamo r1 za 1 j ZANKA(r0) KONEC: sb REZ(r0), r2 ;shranimo r2 v REZultat halt
e) Prešteje število ničel v tabeli.
.data .org 0x400 REZ: .space 1 TABELA: .byte 1,100,255,24,88,31,56,192,155,224,48,0,128,99,147,177 ;rezerviramo 1 bajt (8 bitov) .code .org 0x0 addi r1, r0, #15 ;odmik po naslovih addi r2, r0, #0 ;števec ničel subi r5, r0, #1 ;shranimo vrednost -1 v r5 (za mejo) ZANKA: seq r6, r1, r5 ;ce sta r1=r5= -1, potem je r6 = 1 in smo prisli do konca bne r6, KONEC lb r3, TABELA(r1) ;v r2 nalozimo trenutno vrednost tabele seqi r4, r3, #0 ;primerjamo, če je r3 = 0..ce je, bo r4 = 1, drugace pa r4=0 bne r4, PRISTEJ ;ce je r4 != 0, bomo skocili na PRISTEJ subi r1, r1, #1 ;v primeru, da ne skocimo na PRISTEJ, moramo odsteti 1, da zacnemo pri ;naslednjem stevilu seq r6, r1, r5 ;ce sta r1=r5= -1, potem je r6 = 1 in smo prisli do konca bne r6, KONEC j ZANKA(r0) PRISTEJ: addi r2, r2, #1 ;pristejemo stevec subi r1, r1, #1 ;odstejemo 1, zato da nato zacnemo pri naslednjem stevilu j ZANKA(r0) ;skok nazaj na zanko KONEC: sb REZ(r0), r2 halt
f) Vsem številom v tabeli briše bit7.
.data .org 0x400 tabela: .byte 1,100,-25,24,-88,31,56,102,100,24,48,0,127,99,-115,113 .code .org 0x0 addi r10,r0,16 add r11,r0,r0 addi r3, r0, 0xfffffffe zac: lb r1,tabela(r10) and r1, r1,r3 sb tabela(r10), r1 beq r10,konec subi r10,r10,#1 j zac(r0) konec:
g) Vsem številom v tabeli postavi bite: bit0, bit1, bit2 in bit3.
.data .org 0x400 tabela: .byte 1,100,-25,24,-88,31,56,102,100,24,48,0,127,99,-115,113 .code .org 0x0 addi r10,r0,15 add r22,r0,r0 addi r3, r0, 0xF0 prev: lb r1,tabela(r10) or r1, r1,r3 sb tabela(r10), r1 subi r10,r10,#1 j prev(r0)
h) Vsem številom v tabeli spremeni (obrne) vrednost spodnjih 4 bitov, zgornje 4 bite pa pusti nespremenjene.
.data .org 0x400 tabela: .byte 1,100,-25,24,-88,31,56,102,100,24,48,0,127,99,-115,113 .code .org 0x0 addi r10,r0,15 add r22,r0,r0 addi r3, r0, 0x0F prev: lb r1,tabela(r10) xor r1, r1,r3 sb tabela(r10), r1 subi r10,r10,#1 j prev(r0)
i) Prešteje vsa števila, ki imajo bit1 in bit4 enak 1.
.data .org 0x400 REZ: .space 1 TABELA: .byte 1,100,255,24,88,31,56,192,155,224,48,0,128,99,147,177 .code .org 0x0 addi r1, r0, #15 ;odmik addi r2, r0, 0X12 ;stevilo, potrebno za operacijo or subi r5, r0, #1 ;v r5 shranimo -1 (za mejo) addi r8, r0, #0 ;r8 bo nas stevec ZANKA: seq r6, r1, r5 ;primerjamo, ce je r1 prisel do -1 (r5) bne r6, KONEC ;ce se ni, nadaljujemo s preverjanjem, sicer pa skok na KONEC lb r3, TABELA(r1) ;v r3 nalozi zacasno stevilo v TABELi or r4, r2, r3 ;preverimo, kaj se zgodi z or seq r7, r4, r3 ;ce je stevilo, ki pride iz xor (r4) enako prvotnemu stevilu iz tabele, je r7 = 1 bne r7, PRISTEJ ;ce je r7 != 0, potem skoci na PRISTEJ subi r1, r1, #1 ;zmanjsamo r1 za 1 seq r6, r1, r5 ;primerjamo, ce je r1 prisel do -1 (r5) bne r6, KONEC ;ce se ni, nadaljujemo s preverjanjem, sicer pa skok na KONEC j ZANKA(r0) PRISTEJ: addi r8, r8, #1 ;povecamo stevec za 1 subi r1, r1, #1 ;zmanjsamo r1 za 1 j ZANKA(r0) KONEC: sb REZ(r0), r8 halt
j) Prešteje vsa števila, ki imajo bit0, bit6 in bit7 enak 0.
.data .org 0x400 REZ: .space 1 TABELA: .byte 1,100,255,24,88,31,56,192,155,224,48,0,128,99,147,177 .code .org 0x0 addi r1, r0, #15 ;odmik addi r2, r0, 0X3E ;stevilo, potrebno za operacijo or subi r5, r0, #1 ;v r5 shranimo -1 (za mejo) addi r8, r0, #0 ;r8 bo nas stevec ZANKA: seq r6, r1, r5 ;primerjamo, ce je r1 prisel do -1 (r5) bne r6, KONEC ;ce se ni, nadaljujemo s preverjanjem, sicer pa skok na KONEC lb r3, TABELA(r1) ;v r3 nalozi zacasno stevilo v TABELi and r4, r2, r3 ;preverimo, kaj se zgodi z or seq r7, r4, r3 ;ce je stevilo, ki pride iz and (r4) enako prvotnemu stevilu iz tabele, je r7 = 1 bne r7, PRISTEJ ;ce je r7 != 0, potem skoci na PRISTEJ subi r1, r1, #1 ;zmanjsamo r1 za 1 seq r6, r1, r5 ;primerjamo, ce je r1 prisel do -1 (r5) bne r6, KONEC ;ce se ni, nadaljujemo s preverjanjem, sicer pa skok na KONEC j ZANKA(r0) PRISTEJ: addi r8, r8, #1 ;povecamo stevec za 1 subi r1, r1, #1 ;zmanjsamo r1 za 1 j ZANKA(r0) KONEC: sb REZ(r0), r8 halt
k) *V spremenljivko REZ zapiše vrednost, ki ima ustrezen bit nastavljen, če je število istoležnih bitov v bajtih tabele liho in zbrisan, če je sodo (soda parnost).
.data .org 0x400 TABELA: .byte 1,100,255,24,88,31,56,192,155,224,48,0,128,99,147,177 REZ: .space 1 .code .org 0x0 addi r1, r0, #15 ;odmik addi r2, r0, #0 ;fiksna spremenljivka za odmik lb r3, TABELA(r1) ;nalozimo zacasno stevilo iz tabele v r3 lb r4, TABELA(r2) ;prvo stevilo xor r5, r4, r3 ;vrednost xor za dve stevili subi r1, r1, #1 ;odstejemo 1 od r1 ZANKA: beq r1, KONEC ;ko je r1 = 0, nehamo..takrat odmik sicer ne pride do 1.st. TABELe (1), ;vendar to smo ze zgoraj upostevali lb r3, TABELA(r1) xor r5, r5, r3 subi r1, r1, #1 j ZANKA(r0) KONEC: sb REZ(r0), r5 halt
25. Napišite podprogram v zbirnem jeziku za procesor HIP, ki sešteje elemente dveh polj, ki vsebujejo 8-bitna predznačena števila v predstavitvi z odmikom (odmik je 128), po pravilu, ki ga podaja spodnja psevdo koda: SUM = A[i] + B[i] IF SUM > 255 SUM = 255 ELSE IF SUM < 0 SUM = 0 A[i] = SUM Dodaten namig: števila v predstavitvi z odmikom seštevamo tako, da števili seštejemo, nato pa en odmik odštejemo. Naslov polja A dobi podprogram v registru R24, naslov polja B v registru R25, število elementov polj pa kot parameter na skladu.
.data .org 0x400 A: .byte 1,32,-123,34,24,-3,127 B: .byte 23,35,26,89,-43,2,127 .text .org 0x0 addui r30,r0,#0x4fc ;skladovni kazalec addui r24,r0,#A ;1. tabela addui r25,r0,#B ;2. tabela addui r1,r0,#7 ; stevilo elementov vržemo v sklad sw 0(r30),r1 subui r30,r30,#4 call r31,PODP(r0) ; klic podprograma halt PODP: addui r10,r0,#0 addui r8,r0,#1 addui r30,r30,#4 ;iz sklada vrzemo st elementov lw r17,0(r30) LOOP: lb r5,0(r24) ;nalozimo A[i] lb r6,0(r25) ;nalozimo B[i] add r10,r5,r6 ; sestejemo sgti r2,r10,#255 beq r2,ELSEIF addui r10,r0,#255 j NAPREJ(r0) ELSEIF: slti r2,r10,#0 beq r2,NAPREJ addui r10,r0,#0 NAPREJ: sb 0(r24),r10 ; rezulatat zapisemo A[i] addui r24,r24,#1 ;povecamo i addui r25,r25,#1 addui r8,r8,#1 sgt r2,r8,r17 ;stevec primerjamo z st elementov beq r2,LOOP j 0(r31)
26. Napišite podprogram v zbirnem jeziku za processor HIP, ki izračuna obteženo vsoto elementov dveh polj, ki vsebujejo 16-bitna predznačena števila, po pravilu: A[i] = 0.125 * A[i] + 0.875 * B[i] Ker HIP nima ukazov za delo s plavajočo vejico, naj program obteženo vsoto izračuna po A[i] = (A[i] + 7 * B[i]) / 8;
Naslov polja A dobi podprogram v registru R24, naslov polja B v registru R25, število elementov polj pa kot parameter na skladu. Namig: 7x = x + 2x + 4x
.data .org 0x400 tabela1: .word16 50,70,100,80,4,5,6,7 tabela2: .word16 99,100,101,12,3,2,4,8 .code .org 0x0 addui r30,r0,#0x4FC ; shranimo povratni naslov add r28,r0,r0 ;znuliramo r28 addi r24, r0, #tabela1 ;v registra shranimo naslova tebel addi r25, r0, #tabela2 addi r1,r0,#8 ;v reg1 nalozimo dolzino sw 0(r30), r1 ; in jo porinemo na sklad subi r30,r30,#4 call r31,podprog(r0) ; klic podprograma halt podprog: sw 0(r30), r31 ;push 31 subui r30,r30,#4 sw 0(r30), r29 ;push 29 subui r30,r30,#4 add r29, r0, r30 ;nastavimo SP na okvir sw 0(r30), r5 ;na sklad nalozimo registre subi r30, r30, #4 ;ki jih spreminajmo sw 0(r30), r6 subi r30, r30, #4 sw 0(r30), r7 subi r30, r30, #4 sw 0(r30), r9 subi r30, r30, #4 sw 0(r30), r10 subi r30, r30, #4 sw 0(r30), r8 subi r30, r30, #4 lw r5, 12(r29) ; v reg r5 nalozimo dolzino tabele sestej: lh r6, 0(r24) ;nalozimo en element tabele1 lh r7, 0(r25) ;nalozimo en element tabele2 ;IZRACUN slli r9,r7,#1 ;2*B slli r10,r7,#2 ;4*B add r8,r7,r9 ;B+2*B add r8,r8,r10 ;3*B+4*B=7*B add r8,r8,r6 ;A+7*B srli r8,r8,#3 ;(A+7*B)/8 add r28,r28,r8 ;vsota v r28 addui r24,r24,#2 ;povecamo naslov za 2 bajta addui r25,r25,#2 subui r5, r5, #1 ;zmanjsamo dolzino bne r5, sestej ;ce se nismo na koncu tabele ponovimo izstop: addui r30, r30, #4 ;pop r8 lw r8, 0(r30) addui r30, r30, #4 ;pop r10 lw r10, 0(r30) addui r30, r30, #4 ;pop r9 lw r9, 0(r30) addui r30, r30, #4 ;pop r7 lw r7, 0(r30) addui r30, r30, #4 ;pop r6 lw r6, 0(r30) addui r30, r30, #4 ;pop r5 lw r5, 0(r30) add r30, r0, r29 ;pobrisemo lokalne spr addui r30, r30, #4 ;pop r29 lw r29, 0(r30) addui r30, r30, #4 ;pop r31 lw r31, 0(r30) j 0(r31)