# Lab 5
Name: Aditya Raghuveer
Roll No.: CS22B019
## Question 1
```assembly=
.data
x: .word 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x10, 0x11, 0x12
###### Array x with 12 integers initialized above
s: .word 0x3 # Value of s
.text
la t0, x # Load address of array x into t0
la t1, s # Load address of s into t1
lw t1, 0(t1) # Load s from memory
addi t2,x0,10 #initialise loop counter
loop:
# Unrolled loop iteration for x[i]
lw t3, 0(t0) # Load x[i]
add t3, t3, t1 # x[i] += s
sw t3, 0(t0) # Store updated x[i]
# Unrolled loop iteration for x[i - 1]
lw t3, -4(t0) # Load x[i - 1]
add t3, t3, t1 # x[i - 1] += s
sw t3, -4(t0) # Store updated x[i - 1]
# Unrolled loop iteration for x[i - 2]
lw t3, -8(t0) # Load x[i - 2]
add t3, t3, t1 # x[i - 2] += s
sw t3, -8(t0) # Store updated x[i - 2]
# Unrolled loop iteration for x[i - 3]
lw t3, -12(t0) # Load x[i - 3]
add t3, t3, t1 # x[i - 3] += s
sw t3, -12(t0) # Store updated x[i - 3]
# Update loop counter (i -= 4)
addi t0, t0, -16 # Move to next set of elements
addi t2, t2, -4 # Decrement loop counter
# Check loop condition
bgez t2, loop # If t2 >= 0, continue loop
# End of loop
**Observation:**
IPC value before unrolling was 0.65 and after it was 0.66 which was an increment . higher ipc value indicates that processor can execute more instructions per cycle which improves performance.
```
---
## Question 2
```assembly=
.data
node1: .word 1 # value
.word 0 # pointer to next node
node2: .word 2
.word 0
node3: .word 0
.word 0
node4: .word 0
.word 0
node5: .word 0
.word 0
node6: .word 0
.word 0
node7: .word 0
.word 0
node8: .word 0
.word 0
node9: .word 0
.word 0
node10: .word 0
.word 0
.text
# link the nodes
la t0, node1
la t1, node2
la t2, node3
la t3, node4
la t4, node5
la t5, node6
la t6, node7
la x7, node8
la x8, node9
la x9, node10
sw t1, 4(t0)
sw t2, 4(t1) #storing address of successive node in previous node
sw t3, 4(t2)
sw t4, 4(t3)
sw t5, 4(t4)
sw t6, 4(t5)
sw x7, 4(t6)
sw x8, 4(x7)
sw x9, 4(x8)
sw x0, 4(x9) # Set the last node's next pointer to NULL
# reverse the linked list
la t0, node1 # t0 points to the first node
li t1, 0 # Initialize t1 (previous) to NULL
reverse_loop:
lw t2, 4(t0) # Load the next pointer of the current node
sw t1, 4(t0) # Update the next pointer of the current node to the previous node
mv t1, t0 # Update the previous node to the current node
mv t0, t2 # Move to the next node
bnez t0, reverse_loop # Repeat until t0 is not NULL
# At this point, t1 points to the new head of the reversed list
```
---
## Question 3
```assembly=
.data
.word 1 2 3 4 5 6 7 8 9 10 11
base: .word 0x10000000
node1: .word 0 # value
.word 0 # pointer to next node
node2: .word 0
.word 0
node3: .word 0
.word 0
node4: .word 0
.word 0
node5: .word 0
.word 0
node6: .word 0
.word 0
node7: .word 0
.word 0
node8: .word 0
.word 0
node9: .word 0
.word 0
node10: .word 0
.word 0
str1: .string "Linked List is \n"
str2: .string "New Linked List is \n"
str3: .string " "
str4: .string "\n"
.text # init the list
lw x1,base
addi t0,x0,0 #i=0
addi t1,x0,10 #i=10
la s0,node1
init:
beq t0,t1,main1
lw a0,0(x1)
addi x1,x1,4
sw a0,0(s0)
addi s0,s0,8
addi t0,t0,1
j init
main1: # link the nodes
addi t0,x0,1 # run only 9 times
la s0,node2
link:
beq t0,t1,print1
add a0,x0,s0
sw a0,-4(s0)
addi s0,s0,8
addi t0,t0,1
j link
print1: # prints linked list
la a0 str1
li a7 4
ecall
addi t0,x0,0 #i=0
addi t1,x0,10 #i=10
la s0,node1
loop1:
beq t0,t1,final
lw a0,0(s0)
li a7 1
ecall
la a0 str3
li a7 4
ecall
lw s0,4(s0)
addi t0,t0,1
j loop1
final: # adds new node
lw x1,base
la s0,node10
addi a0,s0,8
sw a0,4(s0)
lw t0,40(x1)
sw t0,0(a0)
#sw t0,8(s0)
print2: # prints new linked list
la a0 str4
li a7 4
ecall
la a0 str2
li a7 4
ecall
addi t0,x0,0 #i=0
addi t1,x0,11 #i=10
la s0,node1
loop2:
beq t0,t1,end
lw a0,0(s0)
li a7 1
ecall
la a0 str3
li a7 4
ecall
lw s0,4(s0)
addi t0,t0,1
j loop2
end:
li a7,10
**Observation:**
final function describes on how to create a node.remaining part describes linking to node , initialsing and printing
```
---