# Lab 4 Name: SUDDULA VINEETH RAGHAVENDRA Roll No.: CS22B045 --- ## Question 1 **Code** ```assembly= .data array: .word 1 2 3 4 5 6 7 8 9 10 11 str: .string " " str1: .string "after updation of the array" str2: .string "\n" base: .word 0x10000000 .text lw x21,base addi x21,x21,40 #we storing the last element address in the x21. lw x22,base li x3,3 li x2,-1 li x11,11 li x9,10 li x5,0 loop: beq x2,x9,print addi x9,x9,-1 lw x10,0(x21) addi x10,x10,3 sw x10,0(x21) addi x21,x21,-4 j loop print: beq x5,x11,exit lw x6,0(x22) li a7,1 mv a0,x6 ecall li a7,4 la a0,str ecall addi x5,x5,1 addi x22,x22,4 j print exit: li a7,4 la a0,str2 ecall la a0,str1 ecall ``` **Observation:** * 4 5 6 7 8 9 10 11 12 13 14 after updation of the array --- ## Question 2 **Code** ```assembly= .data array: .word 2,6,4,1 base: .word 0x10000000 str1: .string "true" str2: .string "false" str3: .string "\n" .text lw x20,base li x2,0 # for the iterator li x9,9 # size li x6,3 li x4,0 # checking zero li x3,0 # count li x5,1 # for doing and operation. loop: beq x2,x9,print addi x2,x2,1 lw x10,0(x20) and x22,x10,x5 bne x22,x4,count beq x3,x6,print1 li x3,0 addi x20,x20,4 j loop count: addi x3,x3,1 addi x20,x20,4 j loop print1: li a7,4 la a0,str1 ecall j exit print: li a7,4 la a0,str2 ecall j exit exit: li a7,4 la a0,str3 ecall ``` **Observation:** * false --- ## Question 3 **Code** ```assembly= # This is one approach taking extra space. .data array: .word 1,2,3,4,4,3,2,1 base: .word 0x10000000 base1: .word 0x20000000 str: .string " " str1: .string "after updation" str2: .string "\n" .text li x8,8 #size lw x20,base lw x22,base1 lw x23,base1 li x4,4 li x2,0 li x3,0 addi x21,x20,16 loop: beq x2,x4,print addi x2,x2,1 lw x10,0(x20) lw x11,0(x21) sw x10,0(x22) addi x22,x22,4 sw x11,0(x22) addi x22,x22,4 addi x20,x20,4 addi x21,x21,4 j loop print: beq x3,x8,exit lw x10,0(x23) li a7,1 mv a0,x10 ecall li a7,4 la a0,str ecall addi x23,x23,4 addi x3,x3,1 j print exit: li a7,4 la a0,str2 ecall la a0,str1 ecall #This is second approach just printing the elements. .data array: .word 1,2,3,4,4,3,2,1 base: .word 0x10000000 str: .string " " str1: .string "after updation" str2: .string "\n" .text li x8,8 #size lw x20,base li x4,4 li x2,0 li x3,0 addi x21,x20,16 loop: beq x2,x4,exit addi x2,x2,1 lw x10,0(x20) lw x11,0(x21) li a7 1 mv a0 x10 ecall li a7 4 la a0 str ecall li a7 1 mv a0 x11 ecall li a7 4 la a0 str ecall addi x20,x20,4 addi x21,x21,4 j loop exit: li a7,4 la a0,str2 ecall la a0,str1 ecall ``` **Observation:** * 1 4 2 3 3 2 4 1 after updation --- ## Question 4 **Code** ```assembly= #leet code Question Number 268 Missing Number. .data array: .word 9,6,4,2,3,5,7,0,1 base: .word 0x10000000 str: .string "missing value : " .text li x2,0 # iterator li x3,0 # value li x10,10 # size of 0 to 9 elements =10. li x9,9 # size lw x20,base loop: beq x2,x10,loop1 add x3,x3,x2 addi x2,x2,1 j loop loop1: beq x9,x0,print addi x9,x9,-1 lw x11,0(x20) sub x3,x3,x11 addi x20,x20,4 j loop1 print: li a7 4 la a0 str ecall li a7 1 mv a0 x3 ecall ``` **Observation:** * missing value : 8 --- ## Question 5 **Pseudo Code** First we have to create a intialize a node with the null . If we want to append any element then we have to allocate memory to that particular node. At the time of append we will check is the root node is equal to null or not. If it is equal to null then we will set head as the newnode.We will update the value of the address. For traversing we will check each node by updating the value of the address, is the value which is stored in the node is not equal to the null(zero) or not. If we reach null then we have to exit the traversal.Otherwise jump to the traversal again. ```assembly= # Reading source internet. # Assume registers x4, x5, x6 are used for parameters and temporary storage # Assume a node structure with two fields: data and next # Initialize an empty linked list initList: li x4, 0 # Set x4 to null, indicating an empty list jr ra # Return # Allocate memory for a new node allocNode: li x4, 8 la x5, 9 ecall jr ra #append new Node. addNode: la x6, allocNode #we are allocating the memory. jal ra, x6 sw x5, 0(x4) sw x4, 4(x4) beqz x4, setHead # checking if x4 is 0. la x6, traverse jal ra, x6 sw x4, 4(x4) jr ra setHead: mv x4, x5 traverse: beqz x4, exit # if x4 becomes zero then end the traversal. lw x5, 4(x4) beqz x5, endTraverse mv x4, x5 j traverse exit: jr ra ``` --- ## Question 6 (Reading Source internet) When we ask memory using the malloc function, it will give us a larger memory than we asked for, by calling sbrk with a bigger size. Before providing us with the memory address, it keeps track of that memory in a special list (for now we assume it as usein list), along with the size you asked for. It also keeps track of the remaining available space with its starting point in another list (for now we assume it as available list). At a later stage if we want to use free ,to return the memory, the function checks if the memory address you're freeing is in the "usein" list. If it is, it removes that entry from the "usein" list and adds it to the "available" list. Here, the free function might internally use brk or sbrk to manage the available memory. But now the problem is we may lead to small pieces of unused memory scattered around, known as fragmentation. To handle this problem, we have to do like this. Whenever we free some memory, it should also check if the adjacent memory is also free. If it is also free,then the two pieces are combined into one using brk or sbrk,so this reduces fragmentation. So by this we will be getting good performance and memory efficiency.