Please Help Convert the following C Language program to ARM
Please Help
Convert the following C Language program to ARM assembly language program by hand coding. The program essentially computes two different totals of numbers with even and odd values. The ARM assembly program should work on the KEIL simulator and give the correct result for any size array.
Register assignments: assign myArray to R0, assign tmp to R1, assign even_sum to R2, assign odd_sum to R3. ( You may use temporary registers as you see fit)
C Program:
int * myArray = {23,54,32,11,71,45,68,99};
int num = 8;
main ()
{
int tmp = 0;
int even_sum = 0;
int odd_sum = 0;
for (i = 0; i < num; i++)
{
tmp = myArray[i];
if (tmp % 2 == 0)
even_sum = even_sum + tmp;
else
odd_sum = odd_sum + tmp;
}
}
Solution
Answer:
Assembly Language Code :
.zero 1
main:
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-64], 0
mov QWORD PTR [rbp-56], 0
mov QWORD PTR [rbp-48], 0
mov QWORD PTR [rbp-40], 0
mov QWORD PTR [rbp-32], 0
mov DWORD PTR [rbp-64], 23
mov DWORD PTR [rbp-60], 54
mov DWORD PTR [rbp-56], 32
mov DWORD PTR [rbp-52], 11
mov DWORD PTR [rbp-48], 71
mov DWORD PTR [rbp-44], 45
mov DWORD PTR [rbp-40], 68
mov DWORD PTR [rbp-36], 99
mov DWORD PTR [rbp-16], 8
mov DWORD PTR [rbp-20], 0
mov DWORD PTR [rbp-4], 0
mov DWORD PTR [rbp-8], 0
mov DWORD PTR [rbp-12], 0
.L5:
mov eax, DWORD PTR [rbp-12]
cmp eax, DWORD PTR [rbp-16]
jge .L2
mov eax, DWORD PTR [rbp-12]
cdqe
mov eax, DWORD PTR [rbp-64+rax*4]
mov DWORD PTR [rbp-20], eax
mov eax, DWORD PTR [rbp-20]
and eax, 1
test eax, eax
jne .L3
mov eax, DWORD PTR [rbp-20]
add DWORD PTR [rbp-4], eax
jmp .L4
.L3:
mov eax, DWORD PTR [rbp-20]
add DWORD PTR [rbp-8], eax
.L4:
add DWORD PTR [rbp-12], 1
jmp .L5
.L2:
mov eax, 0
pop rbp
ret
__static_initialization_and_destruction_0(int, int):
push rbp
mov rbp, rsp
sub rsp, 16
mov DWORD PTR [rbp-4], edi
mov DWORD PTR [rbp-8], esi
cmp DWORD PTR [rbp-4], 1
jne .L9
cmp DWORD PTR [rbp-8], 65535
jne .L9
mov edi, OFFSET FLAT:std::__ioinit
call std::ios_base::Init::Init()
mov edx, OFFSET FLAT:__dso_handle
mov esi, OFFSET FLAT:std::__ioinit
mov edi, OFFSET FLAT:std::ios_base::Init::~Init()
call __cxa_atexit
.L9:
nop
leave
ret
push rbp
mov rbp, rsp
mov esi, 65535
mov edi, 1
call __static_initialization_and_destruction_0(int, int)
pop rbp
ret

