# Lab 4
Name:Allu Sai Kowshik
Roll No.: CS22B004
---
## Question 1
**Code**
```assembly=
.data
array: .word 1,2,3,5,6,7,8,9,10,11,4
str: .string " "
.text
la t0 array
la t1 array
addi t2 zero 3
addi t3 zero 11
addi t0 t0 40
addi t4 zero 0
Loop:
lw t5 0(t0)
add t5 t5 t2
sw t5 0(t0)
addi t0 t0 -4
addi t4 t4 1
blt t4 t3 Loop
la t1 array
addi t4 zero 11
PrintLoop:
lw t6 0(t1)
add a0 t6 zero
li a7 1
ecall
la a0 str
li a7 4
ecall
addi t1 t1 4
addi t4 t4 -1
bne t4 zero PrintLoop
```
## Question 2
**Code**
```assembly=
.data
data_array: .word 3,5,7,2,4
true_msg: .string "true"
false_msg: .string "false"
exit_msg: .string "exited with code 0"
newline_msg: .string "\n"
.text
la s0 data_array
addi s1 zero 7
addi s2 zero 1
addi s3 s1 -2
addi s4 zero 0
check_loop:
lw s5 0(s0)
lw s6 4(s0)
lw s7 8(s0)
and s5 s5 s2
and s6 s6 s2
and s7 s7 s2
and s5 s5 s6
and s7 s7 s6
and s5 s7 s5
beq s5 s2 print_true
addi s0 s0 4
addi s4 s4 1
beq s4 s3 print_false
j check_loop
print_true:
la a0 true_msg
li a7 4
ecall
j exit_program
print_false:
la a0 false_msg
li a7 4
ecall
j exit_program
exit_program:
la a0 newline_msg
li a7 4
ecall
la a0 exit_msg
li a7 4
ecall
```
## Question 3
**Code**
```assembly=
.data
newArray: .word 10 20 30 40 50 60 70 80
newShuffle: .word 0 0 0 0 0 0 0 0
str: .string " "
.text
la t0 newArray
la t1 newShuffle
la t2 newShuffle
addi t3 x0 0
addi t4 x0 4
addi t5 x0 8
Loop:
lw t6 0(t0)
sw t6 0(t1)
lw t6 16(t0)
sw t6 4(t1)
addi t0 t0 4
addi t1 t1 8
addi t3 t3 1
beq t3 t4 print
j Loop
print:
lw t6 0(t2)
addi a0 t6 0
li a7 1
ecall
la a0 str
li a7 4
ecall
addi t2 t2 4
addi t5 t5 -1
beq t5 x0 exit
j print
exit:
li a7 10
ecall
```
## Question 4
question 169
Given an array nums of size n, return the majority element.
The majority element is the element that appears more than ⌊n / 2⌋ times. You may assume that the majority element always exists in the array.
**Code**
```assembly=
.data
nums: .word 3, 2, 3
numsSize: .word 3
output: .string "Majority element: "
.text
.globl _start
_start:
la a0, nums
lw a1, numsSize
call majorityElement
la a0, output
li a7, 4
ecall
mv a0, t2
li a7, 1
ecall
li a7, 10
ecall
majorityElement:
li t1, 0
lw t2, 0(a0)
addi t0, a0, 4
loop:
lw t3, 0(t0)
beqz t1, set_candidate
beq t2, t3, increment_count
addi t1, t1, -1
j end_loop
set_candidate:
mv t2, t3
li t1, 1
j end_loop
increment_count:
addi t1, t1, 1
end_loop:
addi t0, t0, 4
addi a1, a1, -1
bnez a1, loop
ret
```
## Question 5
Define the structure of a node:
Each node in the linked list will contain two fields: a data field to store the value, and a pointer field to point to the next node in the list.
Define constants:
Define constants to represent the offsets of the data field and the next pointer field within each node.
Implement functions:
Implement functions to perform various operations on the linked list:
initialize_list: Initializes the linked list by setting the head pointer to null.
insert_front(data): Inserts a new node with the given data at the front of the linked list.
insert_end(data): Inserts a new node with the given data at the end of the linked list.
delete(data): Deletes the node containing the given data from the linked list.
search(data): Searches for a node with the given data in the linked list.
traverse: Traverses the linked list and prints the data of each node.
reverse: Reverses the linked list.
Handle memory management:
Implement functions to allocate and deallocate memory for nodes as needed.
Ensure proper error handling:
Handle cases where the list is empty or when performing operations such as deletion or searching for data that does not exist in the list.
## Question 6
The malloc function allocates memory by calling sbrk, which can be expensive. To minimize calls to sbrk, we can allocate more memory than needed. When malloc is called, we keep track of allocated memory using a hashmap, along with the remaining available space. The free function releases allocated memory. It looks up the memory address in the hashmap, removes the entry, and adds it to another hashmap representing available space. Fragmentation issues may occur due to loading and unloading processes in memory, causing fragmented space. To address this, we can combine adjacent free spaces when calling free, reducing overhead.