# Computer Organisation Lab
# LAB-5
## Question-1
---
Without unrolling:
```assembly=
.data
.word -3 0 -3 0 -3 0 -3 0 -3 0 -3 0
arr: .word 0x10000000
.text
addi x10 x0 3 #s
addi x11 x0 12 # i = 12
addi x12 x0 0
lw x9 arr #x9 is base register
loop:
beq x12 x11 exit
lw x13 0(x9) # load arr[i] into x13
add x13 x13 x10 # arr[i]+ = s
sw x13 0(x9)
addi x9 x9 4 # x9 = x9 + 4
addi x11 x11 -1 # i--
j loop
exit:
lw x16, arr
addi x1 x0 11
addi x2 x0 0
```
```
IPC=0.788
```
With unrolling:
```assembly=
.data
.word -3 0 -3 0 -3 0 -3 0 -3 0 -3 0
arr: .word 0x10000000
.text
addi x10 x0 3 #s
addi x11 x0 12 # i = 12
addi x12 x0 0
lw x9 arr #x9 is base register
loop:
beq x12 x11 exit
lw x13 0(x9) # load arr[i] into x13
add x13 x13 x10 # arr[i]+ = s
sw x13 0(x9)
addi x9 x9 4 # x9 = x9 + 4
addi x12 x12 1 # i--
lw x13 0(x9) # load arr[i] into x13
add x13 x13 x10 # arr[i]+ = s
sw x13 0(x9)
addi x9 x9 4 # x9 = x9 + 4
addi x12 x12 1 # i--
lw x13 0(x9) # load arr[i] into x13
add x13 x13 x10 # arr[i]+ = s
sw x13 0(x9)
addi x9 x9 4 # x9 = x9 + 4
addi x12 x12 1 # i--
lw x13 0(x9) # load arr[i] into x13
add x13 x13 x10 # arr[i]+ = s
sw x13 0(x9)
addi x9 x9 4 # x9 = x9 + 4
addi x12 x12 1 # i--
j loop
exit:
lw x16, arr
addi x1 x0 11
addi x2 x0 0
```
```
IPC=0.817
```
## Question-2
---
```assembly=
. data
node1 : . word 0 # value
. word 0 # pointer to next node
node2 : . word 0
. word 0
node3 : . word 0
. word 0
. text
# link the nodes
la t0 , node1
la t1 , node2
la t2 , node3
sw t1 , 4( t0 )
sw t2 , 4( t1 )
# the NULL pointer is 0
```
assembly code for initializing linked-list with 10 elements and then reverse it
```assembly=
.data
node1: .word -1
.word 0
node2: .word 0
.word 0
node3: .word 4
.word 0
node4: .word 34
.word 0
node5: .word 51
.word 0
node6: .word 1
.word 0
node7: .word 2
.word 0
node8: .word 3
.word 0
node9: .word 6
.word 0
node10: .word 143
.word 0
.text
la t0 node1
la t1 node2
la t2 node3
la t3 node4
la t4 node5
la t5 node6
la t6 node7
la s0 node8
la s1 node9
la s2 node10
sw t1 4(t0)
sw t2 4(t1)
sw t3 4(t2)
sw t4 4(t3)
sw t5 4(t4)
sw t6 4(t5)
sw s0 4(t6)
sw s1 4(s0)
sw s2 4(s1)
#Reversing the LL:
la s9,node1
addi s10,x0,0 #previous node address
loop:
lw x2,4(s9)
sw s10,4(s9) # updating the previous node address
addi s10,s9,0
addi s9,x2,0
bne s9,x0,loop
```
## Question-3
---
```
Write assembly code for allocate_node function which allocates a new node in the linked list.
```
```assembly=
.data
node1: .word 0
.word 0
node2: .word 0
.word 0
node3: .word 0
.word 0
node4: .word 0
.word 0
.text
la t0 node1
la t1 node2
la t2 node3
sw t1 4(t0)
sw t2 4(t1)
sw t3 4(t2)
allocate_node: #assuming the first 3 nodes are already linked this function links the fourth one
la t3 node4
sw t4 4(t3)
```