LAB 4:
NAME :BHUKYA LACHIRAM NAYAK
ROLL:CS22B012
***question 1**
```assembly=
.data
x: .word 0:11 # Initialize 11 elements of array x to 0
s: .word 3 # Initialize variable s to 3
.text
main:
# Initialize variables
la x10, x # Load base address of array x
lw x5, s # Load value of s
li x6, 10 # Initialize i to 10
loop:
bge x6, x0, exit # Exit loop if i < 0
lw x7, 0(x10) # Load x[i]
add x7, x7, x5 # x[i] = x[i] + s
sw x7, 0(x10) # Store updated value back to x[i]
addi x10, x10, -4 # Move to the previous element of x
addi x6, x6, -1 # Decrement i
j loop # Jump back to loop
exit:
# Exit program
li x7, 10 # Service to exit
ecall
```
observation:writing into assembly
***QUESTION 2***
```assembly=
..data
arr: .word 1,0,5,6,8,9,0,0,0
size: .word 9
.text
la x5 arr # loading the address of array
add x6 x0 x0 # i = 0
add x11 x0 x0 #variable1 to check if previous num is odd
add x13 x0 x0 # variable2 to check if previous two consecutive nums are odd
lw x4 size
loop:
slli x7 x6 2 #shifting left logical immediately
add x7 x7 x5
lw x8 0(x7) #x8 = arr[i]
li x9 1
and x8 x8 x9 #if arr[i] is odd then x8 will be 1
and x12 x8 x11 #x12 will be 1 if current and previous nums are odd
and x14 x13 x8 #x14 will be 1 if current and previous two nums are odd
beq x14 x9 exit
add x13 x0 x12 #x13 = x12
add x11 x0 x8 #x11 = x8
addi x6 x6 1
blt x6 x4 loop
exit:
add a0 x0 x14 #prints 1 if true and 0 if false
li a7 1
ecall
```
OBSERVATION :termination
**QUESTION 3**
```assembly=
.data
.word 0 1 2 3 4 5 6 7 8 9
base: .word 0x10000000
str1: .string "Initial Array is \n"
str2: .string "Modified Array is \n"
str3: .string " "
str4: .string "\n"
.text
lw x1,base
li s1, 0x10000028
main: li t2,0 # i=0
li t1,5
Func: beq t1,t2,Exit
lw a0,0(x1)
sw a0,0(s1)
lw a0,20(x1)
sw a0,4(s1)
addi x1,x1,4
addi s1,s1,8
addi t2,t2,1
j Func
Exit:
li a7 10
```
OBSERVATION:
Transformation
**QUESTION 4**
```assembly=
.data
array: .word 1,1,1,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,6, # Array to be sorted
size: .word 23 # Size of the array
str: .string " "
.text
#loading the address in x4
la x4,array
#loading size of array in x5
lw x5,size
#incrementor i in x6
li x6,0
#counter in x11
li x11,1
#unique counter in x23
#address in x9
mv x12,x4
j solve
solve:
lw x7,0(x4)
sw x7,0(x12)
addi x12,x12,4
addi x23,x23,1
mv x9,x4
beq x5,x11,print_int
jal x1,unique
unique:
addi x4,x4,4
addi x11,x11,1
lw x8,0(x4)
bne x8,x7,solve
j unique
print_int:
la x4,array
li x1,0
j print
print:
li a7,1
lw x2,0(x4)
mv a0,x2
ecall
li a7,4
la a0,str
ecall
addi x4,x4,4
addi x1,x1,1
beq x1,x23,exit
j print
exit:
li a7,10
ecall
```
OBSERVATION:
LinkedListManipulation
***question 5**
```assembly=
#Define Node structure
.data
node_size: .word 8
head: .word 0 #Head pointer initialized to NULL
On many RISC-V systems, the number 9 corresponds to the sbrk system call, which is used to adjust the program's data space (heap) and allocate additional memory.
.text
#Allocate memory for a new node
malloc_node:
#Size of the node in bytes
li a0, node_size
li a7, 9
#System call for sbrk
ecall
#Result (address of allocated memory) is in a0
ret
To insert a new node, first, read the value from the register to access the head node. Load the next pointer from the head node. If the next pointer is equal to x0 (indicating an empty or uninitialized node), add the address of the new node at this position. Save the new node's data and address in memory, and store the address in the designated location.
#Traversing the linked list
traverse_print:
lw a0, head
loop_start:
lw a1, 0(a0) #Load data from the current node
lw a0, 4(a0) # Load the next pointer
bnez a0, loop_start
ret
Searching can be easily accomplished by traversing through consecutive memory locations pointed to by each node until the desired data is found or a NULL pointer is encountered.
After searching delete operation can also be done. By updating the previous node pointer value to current node's pointer value
```
***question 6**
```assembly=
Function free(ptr):
# Assuming each allocated memory block has a header containing its size and a pointer to the next block
# Mark the memory block pointed to by ptr as free
# Traverse the linked list of allocated memory blocks
# Find the block containing ptr
# Mark the block as free
# Coalesce adjacent free blocks if possible
# Update the linked list of allocated memory blocks
```
observation:free up space