# Lab 4 Name: Havish Jadav Roll No.: cs22b026 --- ## Question 1 **code** ```assembly= .data .word 1 3 2 4 5 9 7 6 8 10 11 base: .word 0x10000000 .text lw x16 base addi x1 x0 3 addi x5 x0 11 loop: beq x5 x0 exit lw x10 40(x16) add x10 x10 x1 sw x10 40(x16) addi x16 x16 -4 addi x5 x5 -1 j loop exit: addi x0 x0 0 lw x16 base addi x2 x0 0 addi x7 x0 11 print_loop: beq x2 x7 print_exit lw x5 0(x16) addi a0 x5 0 li a7 1 ecall addi a0 x0 32 li a7 11 ecall addi x16 x16 4 addi x2 x2 1 j print_loop print_exit: li a7, 10 ecall ``` --- ## Question 2 **Code** ```assembly= #here there are 10 elements present in the array and there exists three consecutive odds no.s in the array .data .word 1 3 2 4 5 9 7 11 8 10 base: .word 0x10000000 .text lw x16 base addi x1 x0 1 addi x5 x0 10 addi x8 x0 3 loop: beq x5 x0 exit3 lw x10 36(x16) andi x13 x10 1 sw x10 36(x16) addi x16 x16 -4 addi x5 x5 -1 beq x13 x1 oddcounter beq x13 x0 evencounter j loop oddcounter: beq x15 x8 exit2 addi x15 x15 1 j loop evencounter: addi x15 x0 0 j loop exit2: .data str4:.string "Yes" .text la a0 str4 li a7 4 ecall j exit exit3: .data str3:.string "No" .text la a0 str3 li a7 4 ecall exit: addi x0 x0 0 ``` _ _ _ ## Question 3 **Code** ```assembly= .data .word 1 2 3 4 5 6 7 8 9 10 base1: .word 0x10000000 .word 0 0 0 0 0 0 0 0 0 0 base2: .word 0x1000000 str1: .string "TRUE" .text addi x1 x0 5 #No of array element addi x2 x0 0 #x2 is i lw x16 base1 lw x6 base2 loop: beq x2 x1 exit lw x4 0(x16) lw x5 20(x16) sw x4 0(x6) sw x5 4(x6) addi x16 x16 4 addi x6 x6 8 addi x2 x2 1 j loop exit: lw x6 base2 addi x7 x0 0 add x9 x1 x1 print_loop: bge x7 x9 end_print lw x11 0(x6) addi a0, x11, 0 li a7, 1 ecall addi a0, x0, 32 li a7, 11 ecall addi x6 x6 4 addi x7 x7 1 j print_loop end_print: li a7, 10 ecall ``` --- ## Question 4 **Code** ```assembly= #here is the implementation of two sum #Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target. You may assume that each input would have exactly one solution, and you may not use the same element twice. You can return the answer in any order. #here the target is stored in x29 and the no. of element are stored in x4 .data .word 4 6 8 2 9 10 base: .word 0x10000000 .text addi x3 x0 0 addi x18, x0, 0 addi x21, x0, 1 addi x12, x0, 0 addi x8 x0 4 addi x4, x0, 6 addi x29 x0 10 add x7, x0, x0 addi x31, x0, -1 lw x16, base lw x10, 0(x16) loop: bge x18, x4, exit3 #pointer i < size addi x12 x0 0 # pointer j > i + 1 lw x10, 0(x16) loop1: bge x12, x4, exit1 lw x11, 4(x16) add x24 x10 x10 beq x24 x29 pass1 addi x12, x12, 1 add x24 x11 x10 beq x24 x29 pass addi x16, x16, 4 j loop1 exit1: j minus return: addi x16 x16 4 addi x18, x18, 1 j loop exit2: minus: mul x31 x4 x8 sub x16 x16 x31 j return pass1: .data str4:.string "[" .text la a0 str4 li a7 4 ecall add a0, x0, x18 li a7, 1 ecall .data str5:.string "," .text la a0 str5 li a7 4 ecall addi x16, x16, 4 addi x25, x25, 1 addi a0 x0 32 li a7 11 add a0, x0, x18 li a7, 1 ecall .data str6:.string "]" .text la a0 str6 li a7 4 ecall j exit3 pass: .data str40:.string "[" .text la a0 str40 li a7 4 ecall add a0, x0, x18 li a7, 1 ecall .data str50:.string "," .text la a0 str50 li a7 4 ecall addi x16, x16, 4 addi x25, x25, 1 addi a0 x0 32 li a7 11 add a0, x0, x12 li a7, 1 ecall .data str60:.string "]" .text la a0 str60 li a7 4 ecall j exit3 exit3: addi x0, x0, 0 ``` ___ ## **Question 5** **Code** ```assembly= .data node_size: .word 8 .text Node: .word 0 .word 0 create_linked_list: addi a1 x0 5 li t1, 0 create_loop: la t2, Node add t2, t2, t1 sw zero, 0(t2) sw zero, 4(t2) addi t1, t1, 8 blt t1, x7, create_loop ret append_to_linked_list: la t1, Node lw t2, 4(a0) beqz t2, append_node add a0, t2, zero j traverse_loop append_node: la t2, Node li t3, 8 mv a2, a0 traverse_loop: lw t2, 4(a0) beqz t2, append_node add a0, t2, zero j traverse_loop ``` ___ A node is a structure containing two components: data and a pointer to the next node. The data is where you store the information you want in the list, and the next pointer points to the next node in the sequence. You need a pointer to the first node in your list, often called the head. Initially, set the head to zero or null, indicating an empty list. When you want to add a new node to the end of the list: - Allocate memory for a new node (using a memory allocation function). - Set the data field of the new node. - Find the last node in the linked list and update its next pointer to point to the new node. To move through the list and access or modify data: - Start from the head and follow the next pointers until you reach the end (where the next pointer is null). - Process the data in each node as needed. ## **Question 6** **Code** ```cpp= free(void* ptr){ if ptr == nullptr{ return; } brk(ptr); return; } //if the ptr is deferencing then the function returns. //if not , then the pointer memory is cleared from whichever address it is pointer to.Thus, clearing every memory it is accessed from the base ptr. ``` ___ ``` ___