I need the following code translated from C code into ARM assembly code that wil
ID: 3546743 • Letter: I
Question
I need the following code translated from C code into ARM assembly code that will compile and run on a new 512mb Raspberry Pi. This is important, if your code can not do this as it is or if it is pseudocode it will not help. If you have questions on if the code you are creating will work, just ask me and I will let you know. This code needs to be well thought out and actually work and display the results as given below:
In the this exercise you will generate a set of pseudo-random numbers, sort them into as-
cending order using the quicksort algorithm, and print some statistics.
The program must:
1. prompt the user to enter the number of pseudo-random integers to use,
2. read an integer n from the user,
3. use malloc to allocate enough storage on the heap to store an array of n integers,
4. use rand to ll the array with xed point S(23,8) pseudo-random numbers between
0.00 and 10.00,
5. sort the array using your own implementation of quicksort,
6. print the array,
7. calculate and print the mean, median, and mode(s), and
8. use free to release the array and the linked list.
Here is the code to be translated:
THE print_S function does not need to be translated, it will be called as a c function and branch and linked to but the branch and link must be written in your code.
# include < stdio .h >
2 # include < stdlib .h >
3 # include < time .h >
4
5 /* TEN_LIMIT will let us limit random numbers so that they are between 0.0
6 and 10.0 as an S (23.8) */
7 # define TEN_LIMIT 0 b101000000001 ;
8
9 /* A struct to create a linked list */
10 struct modelist {
11 int mode ;
12 struct modelist * next ;
13 };
14
15 /* Perform quicksort on an array of integers (or fixed - point numbers ) */
16 void quicksort (int * buffer , int left , int right )
17 {
18 int i , j , pivot , temp ;
19
20 if( left >= right )
21 return ;
22
23 /* choose the pivot point from the middle . This improves efficiency
24 if the array is already sorted . In assembly , divide by 2 using
25 a single right shift instead of calling the divide function */
26 pivot = buffer [( left + right ) / 2];
27 i = left ;
28 j = right ;
29 do
30 {
31 while ( buffer [ i ] < pivot )
32 ++ i ;
33
34 while ( buffer [ j ] > pivot )
35 --j ;
36
37 if( i <= j )
38 {
39 temp = buffer [ i ];
40 buffer [ i ++] = buffer [ j ];
41 buffer [j - -] = temp ;
42 }
43 }
44 while ( i <= j );
45
46 if( left < j )
47 quicksort ( buffer , left , j );
48
49 if(i < right )
50 quicksort ( buffer , i , right );
51 }
52
Explanation / Answer
.file "test.c"
.text
.globl quicksort
.type quicksort, @function
quicksort:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $32, %rsp
movq %rdi, -24(%rbp)
movl %esi, -28(%rbp)
movl %edx, -32(%rbp)
movl -28(%rbp), %eax
cmpl -32(%rbp), %eax
jge .L11
.L2:
movl -32(%rbp), %eax
movl -28(%rbp), %edx
addl %edx, %eax
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
cltq
salq $2, %rax
addq -24(%rbp), %rax
movl (%rax), %eax
movl %eax, -8(%rbp)
movl -28(%rbp), %eax
movl %eax, -16(%rbp)
movl -32(%rbp), %eax
movl %eax, -12(%rbp)
jmp .L12
.L5:
addl $1, -16(%rbp)
jmp .L4
.L12:
nop
.L4:
movl -16(%rbp), %eax
cltq
salq $2, %rax
addq -24(%rbp), %rax
movl (%rax), %eax
cmpl -8(%rbp), %eax
jl .L5
jmp .L6
.L7:
subl $1, -12(%rbp)
.L6:
movl -12(%rbp), %eax
cltq
salq $2, %rax
addq -24(%rbp), %rax
movl (%rax), %eax
cmpl -8(%rbp), %eax
jg .L7
movl -16(%rbp), %eax
cmpl -12(%rbp), %eax
jg .L8
movl -16(%rbp), %eax
cltq
salq $2, %rax
addq -24(%rbp), %rax
movl (%rax), %eax
movl %eax, -4(%rbp)
movl -16(%rbp), %eax
cltq
salq $2, %rax
addq -24(%rbp), %rax
movl -12(%rbp), %edx
movslq %edx, %rdx
salq $2, %rdx
addq -24(%rbp), %rdx
movl (%rdx), %edx
movl %edx, (%rax)
addl $1, -16(%rbp)
movl -12(%rbp), %eax
cltq
salq $2, %rax
addq -24(%rbp), %rax
movl -4(%rbp), %edx
movl %edx, (%rax)
subl $1, -12(%rbp)
.L8:
movl -16(%rbp), %eax
cmpl -12(%rbp), %eax
jle .L12
movl -28(%rbp), %eax
cmpl -12(%rbp), %eax
jge .L10
movl -12(%rbp), %edx
movl -28(%rbp), %ecx
movq -24(%rbp), %rax
movl %ecx, %esi
movq %rax, %rdi
call quicksort
.L10:
movl -16(%rbp), %eax
cmpl -32(%rbp), %eax
jge .L1
movl -32(%rbp), %edx
movl -16(%rbp), %ecx
movq -24(%rbp), %rax
movl %ecx, %esi
movq %rax, %rdi
call quicksort
jmp .L1
.L11:
nop
.L1:
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size quicksort, .-quicksort
.globl find_modes
.type find_modes, @function
find_modes:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $48, %rsp
movq %rdi, -40(%rbp)
movl %esi, -44(%rbp)
movl $1, -8(%rbp)
movl $0, -4(%rbp)
movq $0, -32(%rbp)
movl $1, -12(%rbp)
jmp .L14
.L17:
movl -12(%rbp), %eax
cltq
subq $1, %rax
salq $2, %rax
addq -40(%rbp), %rax
movl (%rax), %edx
movl -12(%rbp), %eax
cltq
salq $2, %rax
addq -40(%rbp), %rax
movl (%rax), %eax
cmpl %eax, %edx
je .L15
movl $1, -8(%rbp)
jmp .L16
.L15:
addl $1, -8(%rbp)
movl -8(%rbp), %eax
cmpl -4(%rbp), %eax
jle .L16
movl -8(%rbp), %eax
movl %eax, -4(%rbp)
.L16:
addl $1, -12(%rbp)
.L14:
movl -12(%rbp), %eax
cmpl -44(%rbp), %eax
jl .L17
movl $1, -12(%rbp)
jmp .L18
.L21:
movl -12(%rbp), %eax
cltq
subq $1, %rax
salq $2, %rax
addq -40(%rbp), %rax
movl (%rax), %edx
movl -12(%rbp), %eax
cltq
salq $2, %rax
addq -40(%rbp), %rax
movl (%rax), %eax
cmpl %eax, %edx
je .L19
movl $1, -8(%rbp)
jmp .L20
.L19:
addl $1, -8(%rbp)
movl -8(%rbp), %eax
cmpl -4(%rbp), %eax
jne .L20
movl $16, %edi
call malloc
movq %rax, -24(%rbp)
movl -12(%rbp), %eax
cltq
subq $1, %rax
salq $2, %rax
addq -40(%rbp), %rax
movl (%rax), %edx
movq -24(%rbp), %rax
movl %edx, (%rax)
movq -24(%rbp), %rax
movq -32(%rbp), %rdx
movq %rdx, 8(%rax)
movq -24(%rbp), %rax
movq %rax, -32(%rbp)
.L20:
addl $1, -12(%rbp)
.L18:
movl -12(%rbp), %eax
cmpl -44(%rbp), %eax
jl .L21
movq -32(%rbp), %rax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size find_modes, .-find_modes
.globl calc_mean
.type calc_mean, @function
calc_mean:
.LFB2:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movq %rdi, -24(%rbp)
movl %esi, -28(%rbp)
movl $0, -4(%rbp)
movl $0, -8(%rbp)
jmp .L23
.L24:
movl -8(%rbp), %eax
cltq
salq $2, %rax
addq -24(%rbp), %rax
movl (%rax), %eax
addl %eax, -4(%rbp)
addl $1, -8(%rbp)
.L23:
movl -8(%rbp), %eax
cmpl -28(%rbp), %eax
jl .L24
movl -4(%rbp), %eax
movl %eax, %edx
sarl $31, %edx
idivl -28(%rbp)
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE2:
.size calc_mean, .-calc_mean
.globl find_median
.type find_median, @function
find_median:
.LFB3:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movq %rdi, -8(%rbp)
movl %esi, -12(%rbp)
movl -12(%rbp), %eax
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
cltq
salq $2, %rax
addq -8(%rbp), %rax
movl (%rax), %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE3:
.size find_median, .-find_median
.section .rodata
.LC0:
.string "%d."
.LC1:
.string "%d"
.text
.globl print_S
.type print_S, @function
print_S:
.LFB4:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
pushq %rbx
subq $40, %rsp
movl %edi, -36(%rbp)
movl %esi, -40(%rbp)
movl -40(%rbp), %eax
movl $1, %edx
movl %edx, %ebx
.cfi_offset 3, -24
movl %eax, %ecx
sall %cl, %ebx
movl %ebx, %eax
subl $1, %eax
movl %eax, -20(%rbp)
movl -40(%rbp), %eax
movl -36(%rbp), %edx
movl %eax, %ecx
sarl %cl, %edx
movl $.LC0, %eax
movl %edx, %esi
movq %rax, %rdi
movl $0, %eax
call printf
cmpl $0, -36(%rbp)
jns .L27
negl -36(%rbp)
.L27:
movl -20(%rbp), %eax
andl %eax, -36(%rbp)
.L28:
movl -36(%rbp), %edx
movl %edx, %eax
sall $2, %eax
addl %edx, %eax
addl %eax, %eax
movl %eax, -36(%rbp)
movl -40(%rbp), %eax
movl -36(%rbp), %edx
movl %eax, %ecx
sarl %cl, %edx
movl $.LC1, %eax
movl %edx, %esi
movq %rax, %rdi
movl $0, %eax
call printf
movl -20(%rbp), %eax
andl %eax, -36(%rbp)
cmpl $0, -36(%rbp)
jne .L28
addq $40, %rsp
popq %rbx
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE4:
.size print_S, .-print_S
.section .rodata
.LC2:
.string " Enter the array size : "
.LC3:
.string " Sorted Array "
.LC4:
.string " The mean is "
.LC5:
.string " The median is "
.LC6:
.string " There are no modes "
.LC7:
.string "The mode is "
.LC8:
.string "The modes are "
.LC9:
.string ", "
.text
.globl main
.type main, @function
main:
.LFB5:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
pushq %rbx
subq $56, %rsp
movl $0, %edi
.cfi_offset 3, -24
call time
movl %eax, %edi
call srand
movl $.LC2, %eax
movq %rax, %rdi
movl $0, %eax
call printf
movl $.LC1, %eax
leaq -32(%rbp), %rdx
movq %rdx, %rsi
movq %rax, %rdi
movl $0, %eax
call __isoc99_scanf
movl -32(%rbp), %eax
cltq
salq $2, %rax
movq %rax, %rdi
call malloc
movq %rax, -40(%rbp)
movl $0, -28(%rbp)
jmp .L30
.L31:
movl -28(%rbp), %eax
cltq
salq $2, %rax
movq %rax, %rbx
addq -40(%rbp), %rbx
call rand
movl %eax, %ecx
movl $429329023, %edx
movl %ecx, %eax
imull %edx
sarl $8, %edx
movl %ecx, %eax
sarl $31, %eax
movl %edx, %esi
subl %eax, %esi
movl %esi, %eax
imull $2561, %eax, %eax
movl %ecx, %edx
subl %eax, %edx
movl %edx, %eax
movl %eax, (%rbx)
addl $1, -28(%rbp)
.L30:
movl -32(%rbp), %eax
cmpl %eax, -28(%rbp)
jl .L31
movl -32(%rbp), %eax
leal -1(%rax), %edx
movq -40(%rbp), %rax
movl $0, %esi
movq %rax, %rdi
call quicksort
movl $.LC3, %edi
call puts
movl $0, -28(%rbp)
jmp .L32
.L33:
movl -28(%rbp), %eax
cltq
salq $2, %rax
addq -40(%rbp), %rax
movl (%rax), %eax
movl $8, %esi
movl %eax, %edi
call print_S
movl $10, %edi
call putchar
addl $1, -28(%rbp)
.L32:
movl -32(%rbp), %eax
cmpl %eax, -28(%rbp)
jl .L33
movl -32(%rbp), %edx
movq -40(%rbp), %rax
movl %edx, %esi
movq %rax, %rdi
call calc_mean
movl %eax, -24(%rbp)
movl $.LC4, %eax
movq %rax, %rdi
movl $0, %eax
call printf
movl -24(%rbp), %eax
movl $8, %esi
movl %eax, %edi
call print_S
movl $10, %edi
call putchar
movl -32(%rbp), %edx
movq -40(%rbp), %rax
movl %edx, %esi
movq %rax, %rdi
call find_median
movl %eax, -20(%rbp)
movl $.LC5, %eax
movq %rax, %rdi
movl $0, %eax
call printf
movl -20(%rbp), %eax
movl $8, %esi
movl %eax, %edi
call print_S
movl $10, %edi
call putchar
movl -32(%rbp), %edx
movq -40(%rbp), %rax
movl %edx, %esi
movq %rax, %rdi
call find_modes
movq %rax, -56(%rbp)
cmpq $0, -56(%rbp)
jne .L34
movl $.LC6, %edi
call puts
jmp .L35
.L34:
movq -56(%rbp), %rax
movq 8(%rax), %rax
testq %rax, %rax
jne .L36
movl $.LC7, %eax
movq %rax, %rdi
movl $0, %eax
call printf
jmp .L37
.L36:
movl $.LC8, %eax
movq %rax, %rdi
movl $0, %eax
call printf
.L37:
movq -56(%rbp), %rax
movq %rax, -48(%rbp)
jmp .L38
.L41:
movq -48(%rbp), %rax
movl (%rax), %eax
movl $8, %esi
movl %eax, %edi
call print_S
movq -48(%rbp), %rax
movq 8(%rax), %rax
testq %rax, %rax
je .L39
movl $.LC9, %eax
movq %rax, %rdi
movl $0, %eax
call printf
jmp .L40
.L39:
movl $10, %edi
call putchar
.L40:
movq -48(%rbp), %rax
movq 8(%rax), %rax
movq %rax, -48(%rbp)
.L38:
cmpq $0, -48(%rbp)
jne .L41
.L35:
movq -56(%rbp), %rax
movq %rax, -48(%rbp)
jmp .L42
.L43:
movq -56(%rbp), %rax
movq 8(%rax), %rax
movq %rax, -56(%rbp)
movq -48(%rbp), %rax
movq %rax, %rdi
call free
movq -56(%rbp), %rax
movq %rax, -48(%rbp)
.L42:
cmpq $0, -48(%rbp)
jne .L43
movq -40(%rbp), %rax
movq %rax, %rdi
call free
movl $0, %eax
addq $56, %rsp
popq %rbx
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE5:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.