Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

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

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote