# Lab 4 Name: G Jaswanth Roll No.: CS22B020 --- ## Question 1 **Code** ```assembly= .data array: .word 1 2 3 4 5 6 7 8 9 10 11 str: .string " " .text la x1 array addi x2 x0 3 #storing s=3 addi x3 x0 11 # iterator i=10 addi x1 x1 40 # moving the starting addr to array + 40 times addi x7 x7 11 loop: lw x4 0(x1) #loading the address into x4 add x4 x4 x2 #adding x[i] = x[i] +3 sw x4 0(x1) #storing the incremented value addi x3 x3 -1 # i-- since started with i=10 addi x1 x1 -4 # since we are at the last addr of array we need to decrement the addr beq x3 x0 print #if i==0 start printing j loop print: addi x1 x1 4 lw x4 0(x1) addi a0 x4 0 #printing the incremented values li a7 1 ecall la a0 str # printing space between integers li a7 4 ecall addi x3 x3 1 # increasing the iterator i++ beq x3 x7 Exit # if i==11 it gets exit j print Exit: # exit from the code li a7 10 ecall ``` _You can use either one of these according to the question_ **1 a** output: 4 5 6 7 8 9 10 11 12 13 14 --- ## Question 2 **Code** ```assembly= .data array: .word 1 4 3 5 7 8 str1: .string " True, there exists 3 consecutive odd nums" str2: .string " False, there is no 3 consecutive odd nums" .text la x1 array #loading array addr into x1 addi x2 x0 0 # int i=0 addi x3 x0 6 # array size n=6 addi x20 x3 -2 loop: lw x4 0(x1) #loading all arr[i] lw x5 4(x1) #loading arr[i+1] lw x6 8(x1) #loading arr[i+2] addi x7 x0 1 # storing 1 in x7 and x8 x7 x4 # checking condn whther arr[i] is odd and x9 x7 x5 # checking condn whther arr[i+1] is odd and x10 x7 x6 # checking condn whther arr[i+2] is odd #below code is for whther there are 3 consec or not and x8 x8 x9 and x8 x8 x10 beq x8 x7 print1 # if condn satisfy it prints true addi x2 x2 1 # i++ addi x1 x1 4 # increasing arr[i] to arr[i+1] beq x2 x20 print2 # if no 3 consecutive it prints false j loop print1: la a0 str1 # to print true li a7 4 ecall li a7 10 ecall print2: la a0 str2 # to print false li a7 4 ecall ``` ```cpp= class Solution { public: bool threeConsecutiveOdds(vector<int>& arr) { int n=arr.size(); int flag=0; for(int i=0;i<n-2;i++){ if(arr[i]%2==1 && arr[i+1]%2==1 && arr[i+2]%2==1){ flag=1; break; } } if(flag==1) return true; return false; } }; ``` _You can use either one of these according to the question_ **2 a** Output: True, there exists 3 consecutive odd nums --- ## Question 3 **Code** ```assembly= .data array: .word 1,2,3,4,5,11,12,13,14,15 str: .string " " newarray: .word 0x10000000 .text addi x20 zero 10 # size of the array la x1 array la x5 array la x2 newarray la x3 newarray addi x4 zero 0 addi x29 x29 0 loop: beq x20 x4 print # 10!=0 lw x7 0(x1) #loading arr[i] in x7 lw x8 20(x5) #loading the arr[n+i] in x8 sw x7 0(x2) #storing the loaded words sw x8 4(x2) addi x1 x1 4 addi x5 x5 4 addi x2 x2 8 addi x4 x4 2 j loop print: lw x15 0(x3) #load the address beq x20 x29 Exit #exiting if they are e addi x29 x29 1 #increment the x29 addi x3 x3 4 addi a0 x15 0 #for printing changed values li a7 1 ecall la a0 str # for printing space li a7 4 ecall j print Exit: li a7 10 # to Exit ecall ``` ```cpp= class Solution { public: vector<int> shuffle(vector<int>& nums, int n) { vector <int> v; for(int i=0;i<n;i++){ v.push_back(nums[i]); v.push_back(nums[i+1]); } return v; } }; ``` _You can use either one of these according to the question_ **3 a** 1 11 2 12 3 13 4 14 5 15 **Observation:** * We gave input as * 1 2 3 4 5 11 12 13 14 15 * and output as 1 11 2 12 3 13 4 14 5 15 by taking two pointers at i and i+n position. --- ## Question 4 **Code** ```assembly= .data array:.word 5,2,7,5,8,3,9,6 base:.word 0x10000000 str:.string " " .text addi x12 x0 8 #size of array int lw x14 base addi x15 x0 5 # we need to remove this element Loop: beq x18 x12 exit lw x20 0(x14) addi x14 x14 4 addi x18 x18 1 #i++ bne x20 x15 print # if it is not equal to selected elemt it goes to print j Loop print: li a7 1 # for printing except the selected element addi a0 x20 0 ecall li a7 4 #For printing spaces la a0 str ecall j Loop exit: li a7 10 #Exit ecall ``` ```cpp= class Solution { public: void Print_Emnts(vector<int>& nums, int n) { for(int i=0;i<n;i++){ if(nums[i]!=n){ cout<<nums[i]<<" "; } } } }; ``` _You can use either one of these according to the question_ **4 a** Output: 2 7 8 3 9 6 **Observation:** This code is to print the array elemnts except the selected value.. --- ## Question 5 **Code** (if required) ```assembly= .data newline: .string "\n" .text main: # Initialize the linked list la x5, elem1 # Load the address of the first element into x5 la x6, elem2 # Load the address of the second element into x6 la x7, elem3 # Load the address of the third element into x7 la x8, elem4 # Load the address of the fourth element into x8 # Link the elements together sw x6, 4(x5) # Store the address of elem2 in the next pointer of elem1 sw x7, 4(x6) # Store the address of elem3 in the next pointer of elem2 sw x8, 4(x7) # Store the address of elem4 in the next pointer of elem3 # Print all elements of the linked list la a0, elem1 # Load the address of the head of the list into a0 jal ra, print_list # Insert a new element into the linked list la x9, new_elem # Load the address of the new element into x9 lw x10, 4(x5) # Load the next pointer of elem1 into x10 sw x9, 4(x5) # Store the address of the new element in the next pointer of elem1 sw x10, 4(x9) # Store the address of elem2 in the next pointer of the new element # Print all elements of the updated linked list la a0, elem1 # Load the address of the head of the list into a0 jal ra, print_list # Exit program li a7, 10 # Exit syscall ecall print_list: # Load the address of the head of the list into a1 mv a1, a0 loop: # Load the data of the current node into a1 lw a1, 0(a1) # Print the value of the current node mv a0, a1 # Set a0 to the data value for printing li a7, 1 # Print integer syscall ecall # Print a newline character la a0, newline # Load the newline character into a0 li a7, 4 # Print string syscall ecall # Get the next pointer lw a0, 4(a0) # Check if we reached the end of the list bnez a0, loop # If the next pointer is not zero, continue to the next node ret .data elem1: .word 1, 0 # First element of the linked list elem2: .word 2, 0 # Second element of the linked list elem3: .word 3, 0 # Third element of the linked list elem4: .word 4, 0 # Fourth element of the linked list new_elem: .word 99, 0 # New element to be inserted into the linked list ``` **Observation:** * We can Link the two node by storing the element address in the next i+4th address where i is the addr of elemnt etc --- ## Question 6 **Code** (if required) ```assembly= .data .align 3 FREE_LIST: .word 0 # Pointer to the head of the free list .text malloc: # Function prologue addi sp, sp, -4 # Adjust stack pointer sw x1, 0(sp) # Save return address (using x1 instead of ra) # Load argument (size to allocate) mv x11, x10 # Move size to x11 (x10 will be used as return value) # Allocate memory using sbrk li a7, 214 # sbrk syscall number ecall # Call sbrk # Move return value (new memory address) to x10 mv x10, a0 # x10 already holds the return value # Function epilogue lw x1, 0(sp) # Restore return address addi sp, sp, 4 # Restore stack pointer ret # Return from function free: # Function prologue addi sp, sp, -4 # Adjust stack pointer sw x1, 0(sp) # Save return address (using x1 instead of ra) # Load arguments mv a0, a0 # Assuming pointer to be freed is passed in a0 # For simplicity, we do nothing with the freed memory # Function epilogue lw x1, 0(sp) # Restore return address addi sp, sp, 4 # Restore stack pointer ret # Return from function ```