# Lab 4 Name: P Akilesh Roll No.: CS22B040 --- ## Question 1 **Given C program** ```c= int s=3; // initialize the 11 elements of array x to some random values for(int i=10;i>=0;i=i-1){ x[i] = x[i] + s; } ``` **RISC-V Assembly Code of the above C program** ```assembly= .data array: .word 11,10,9,8,7,6,5,4,3,2,1 size: .word 11 # Size of the array .text #variable s is considered in register x10 li x10,3 #Lets consider the variable i in x11 li x11,10 #address is stored in x12 la x12,array #temp address mv x4,x12 addi x4,x4,40 j loop loop: bgt x0,x11,exit lw x13,0(x4) add x13,x13,x10 sw x13,0(x4) addi x4,x4,-4 addi x11,x11,-1 j loop exit: li a7,10 ecall ``` --- ## Question 2 **RISC-V Assembly language for Three Consecutive Odd Question** ```assembly= .data array: .word 1,2,34,3,4,5,7,23,12 # Array to be sorted size: .word 9 # Size of the array true: .string "true" false: .string "false" .text #Output 1 means true and 0 means false #address is stored in x12 la x12,array #size in x11 lw x11,size addi x11,x11,-2 #Lets consider the variable i in x13 li x13,0 #temp address mv x6,x12 li x5,1 #Lets store 1 if it is odd in x1,x2,x3 #if all x1,x2,x3 are 1 then x4 is also 1 #i.e x4 = x1 & x2 & x3 j loop loop: bgt x13,x11,exit beq x4,x5,exit lw x7,0(x6) lw x8,4(x6) lw x9,8(x6) and x1,x7,x5 and x2,x8,x5 and x3,x9,x5 and x4,x1,x2 and x4,x4,x3 addi x6,x6 4 addi x13,x13,1 j loop exit: li a7,4 beq x4,x5,success j fail success: la a0,true ecall li a7,10 ecall fail: la a0,false ecall li a7,10 ecall ``` --- ## Question 3 The below code is implemented without considering extra array by taking shift logic. **working :** * Input the given array in .data segment * Mention also the size of array * Mention n ```assembly= .data array: .word 1,2,3,4,4,3,2,1 # Array to be sorted size: .word 8 # Size of the array n: .word 4 constant:.word 1023 str: .string " " .text #constant in x25 lw x25,constant #Address in x4 la x4,array #normal pointer to iterate over array in x7 li x7,1 #int i in x2 lw x2,n #int j in x3 lw x3,size #back pointer in x12 mv x5,x4 #middle pointer in x9 mv x9,x4 j backpointer loop1: # x5 is last pointer beq x2,x0,restart_pointer2 lw x10,0(x5) slli x10,x10,10 lw x11,0(x9) or x10,x10,x11 sw x10,0(x5) addi x5,x5,-4 addi x9,x9,-4 addi x2,x2,-1 j loop1 loop2: beq x3,x2,print_int #x4 has initial address and x12 has final address lw x30,0(x4) lw x31,0(x12) and x30,x31,x25 sw x30,0(x4) addi x4,x4,4 lw x30,0(x4) srli x30,x31,10 sw x30,0(x4) addi x4,x4,4 addi x12,x12,4 addi x2,x2,1 j loop2 backpointer: beq x7,x3,restart_pointer addi x5,x5,4 addi x7,x7,1 j backpointer restart_pointer: mv x12,x5 li x7,1 j middlepointer restart_pointer2: li x7,1 mv x12,x17 addi x12,x12,4 lw x2,n j loop2 middlepointer: beq x7,x2,loop1 addi x9,x9,4 addi x7,x7,1 mv x17,x9 j middlepointer print_int: la x4,array li x5,1 lw x6,size j print print: blt x6,x5,exit li a7,1 lw a0,0(x4) ecall li a7,4 la a0,str ecall addi x4,x4,4 addi x5,x5,1 j print exit: li a7,10 ecall ``` **Output** ``` 1 4 2 3 3 2 4 1 Program exited with code: 0 ``` --- ## Question 4 **Chosen Question : Q26 from Leet Code** *Description :* Given a sorted array remove all the duplicate in the array. Return the unique elements ```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 ``` **Output** ``` 1 2 3 4 5 6 Program exited with code: 0 ``` --- ## Question 5 **This pseudo-code assumes a simple linked list with nodes containing two 4-byte values** Lets define a node fot the linked list assuming that each node takes total of 8 bytes - 4 each for data and next pointer ```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. ```assembly= .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. ```assembly= #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 * We need to first determine the size of the allocated block pointed to by the pointer .Lets assume it is stored some where. * We also need to flag the places which are available for reuse and which are not .We can try using a book keeping algo for this * We need to combine consecutive free blocks into a larger contiguous block and return the initial address when sbrk() is called. * This address and the size will be sored in the record. * when we free this memory, the func should check the record for the a the size it should free and then flag these memory cells as free for reuse ---