Instructions
Requirements and Specifications
Screenshots
Source Code
LAB 1
/*
Pseudocode:
for (i==0 ; i<j ; i+=1)
{
n = a AND b ; // and operation
m = a ORR b; // or operation
p = a EOR b; // xor operation
}
if (n==m)
{
X = n LSR 4; //(logical right shift by 4)
else
X = m LSL 4; //(logical left shift by 4)
}
*/
.globl function
/* function (j, a, b) */
function: MOV X4, #0 // Start of for
B COMPARE // jump to comparison
FOR: AND X5,X1,X2 // n=a AND b
ORR X6,X1,X2 // m=a ORR b
EOR X7,X1,X2 // p=a EOR b
ADD X4,X4,1 // i++
COMPARE: CMP X4,X0 // compare i and j
B.LT FOR // if i < j repeat for
CMP X5,X6 // compare n and m
B.EQ IF // if n == m, go to if
B ELSE // otherwise go to else
IF: LSR X0,X5,4 // X = n LSR 4
RET
ELSE: LSL X0,X6,4 // X = m LSL 4
RET
LAB 3-1
.globl assembly_function
/* assembly_function(int arr[], int n) */
assembly_function:
MOV X4,0 // start sum = 0
MOV W5,0 // i = 0
B COMPARE // jump to for comparison
FOR: LDR W2,[X0] // load arr[i]
ADD W5,W5,W2 // sum +=arr[i]
ADD X0,X0,4 // advance array pointer
ADD X4,X4,1 // i++
COMPARE: CMP X4,X1 // if i<n,
B.LT FOR // repeat for
MOV W0,W5 // return sum
RET
LAB 3-2
.globl sum_loop, sum_unrolled
/* int sum_loop ( int arr[] , int n ) */
sum_loop: MOV X4,0 // start sum = 0
MOV W5,0 // i = 0
B COMPARE // jump to for comparison
FOR: LDR W2,[X0] // load arr[i]
ADD W5,W5,W2 // sum +=arr[i]
ADD X0,X0,4 // advance array pointer
ADD X4,X4,1 // i++
COMPARE: CMP X4,X1 // if i<n,
B.LT FOR // repeat for
MOV W0,W5 // return sum
RET
/* int sum_unrolled(int arr[] , int n) */
sum_unrolled: MOV W4,0 // start sum1 = 0
MOV W5,0 // start sum2 = 0
MOV W6,0 // start sum3 = 0
MOV W7,0 // start sum4 = 0
MOV W8,0 // start sum5 = 0
MOV W9,0 // start sum6 = 0
MOV W10,0 // start sum7 = 0
MOV W11,0 // start sum8 = 0
MOV W12,0 // start sum9 = 0
MOV W13,0 // start sum10 = 0
MOV X2,0 // i = 0
B COMPAREI // jump to for comparison
FORI: LDR W3,[X0,0] // load arr[i + 0]
ADD W4,W4,W3 // sum1 +=arr[i + 0]
LDR W3,[X0,4] // load arr[i + 1]
ADD W5,W5,W3 // sum2 +=arr[i + 1]
LDR W3,[X0,8] // load arr[i + 2]
ADD W6,W6,W3 // sum3 +=arr[i + 2]
LDR W3,[X0,12] // load arr[i + 3]
ADD W7,W7,W3 // sum4 +=arr[i + 3]
LDR W3,[X0,16] // load arr[i + 4]
ADD W8,W8,W3 // sum5 +=arr[i + 4]
LDR W3,[X0,20] // load arr[i + 5]
ADD W9,W9,W3 // sum6 +=arr[i + 5]
LDR W3,[X0,24] // load arr[i + 6]
ADD W10,W10,W3 // sum7 +=arr[i + 6]
LDR W3,[X0,28] // load arr[i + 7]
ADD W11,W11,W3 // sum8 +=arr[i + 7]
LDR W3,[X0,32] // load arr[i + 8]
ADD W12,W12,W3 // sum9 +=arr[i + 8]
LDR W3,[X0,36] // load arr[i + 9]
ADD W13,W13,W3 // sum10 +=arr[i + 9]
ADD X0,X0,40 // advance array pointer
ADD X2,X2,10 // i+=10
COMPAREI: CMP X2,X1 // if i<n,
B.LT FORI // repeat for
ADD W0,W4,W5 // return sum1 + sum2 + sum3 +... + sum10
ADD W0,W0,W6
ADD W0,W0,W7
ADD W0,W0,W8
ADD W0,W0,W9
ADD W0,W0,W10
ADD W0,W0,W11
ADD W0,W0,W12
ADD W0,W0,W13
RET