×
Samples Blogs Make Payment About Us Reviews 4.9/5 Order Now

Find Prime Numbers Up to Value and Guess the Number in ARM Assembly for Raspberry Pi Assignment Solution

July 10, 2024
Rehana Magnus
Rehana Magnus
🇨🇦 Canada
Assembly Language
Rehana Magnus, PhD in Computer Science from the esteemed Acadia Institute of Technology, Canada. With 6 years of experience, specializes in assembly language programming. Proficient in low-level coding, optimizing performance, and enhancing system functionality.
Key Topics
  • Instructions
  • Requirements and Specifications
Tip of the day
Familiarize yourself with OCaml's pattern matching; it simplifies handling recursive data structures like lists and trees, making your code concise and easier to debug.
News
In 2024, Girls Who Code introduced a Data Science + AI track in their free summer programs for high school students, fostering skills in cybersecurity and creative coding​

Instructions

Objective

Write a program to calculate Fibonacci in ARM Raspberry PI ARM assembly language.

Requirements and Specifications

Implement the following two programs to get help in ARM assembly assignment. I suggest that you implement them first in some high-level language (C/C++, Java, Python, etc), and translate the logic into assembly. Unless you clearly understand the problem and program structure for assembly language recursion, even translating the programs requires some thought. In particular, be sure to handle the stack values correctly.

As always, follow proper style as defined in the style guide.

  1. Implement a program to calculate multiplication using successive addition with recursion. For example, 5x4 is 5+5+5+5. This can be defined recursively as:
  2. Mult(m, n) = if n is 1, return m

  3. Implement a program to calculate a Fibonacci number recursively. A Fibonacci number is defined recursively as:
  4. Fib(n) = if (n == 0 or n == 1) return 1

    else return Fib(n-1) + Fib(n-2)

Screenshots of output

calculate fibonacci in ARM assembly language for Raspberry PI
calculate fibonacci in ARM assembly language for Raspberry PI1

Source Code

Fibonacci

.data prompt: .asciz "Please enter fibonacci number to calculate: " result: .asciz "Fibonacci(%d) = %d\n" format: .asciz "%d" number: .word 0 .text .global main @ Registers used: @ R0 = used as first argument to functions and to hold return values @ R1 = used as second argument to functions and to save variable address @ R2 = used as third argument for printf @ LR = return address main: sub sp, sp, #4 @ save return address str lr, [sp] ldr r0, =prompt @ load adress of prompt bl printf @ print the prompt ldr r0, =format @ format to read an integer ldr r1, =number @ read in variable bl scanf @ read the number ldr r1, =number @ load variable address ldr r4, [r1] @ load number value in r4 mov r0, r4 @ pass number to function bl Fib @ calculate fibonacci of number mov r2, r0 @ copy result to r2 for printing it ldr r0, =result @ load adress of result message mov r1, r4 @ copy number bl printf @ print the result ldr lr, [sp] @ restore return address add sp, sp, #4 bx lr @ return to os @ Function that calculates a Fibonacci number using recursion @ Receives: r0 = number @ Returns: r0 = fibonacci of number @ Registers used: @ R0 = function argument n and return value @ R4 = saves the initial value of n @ R5 = saves the result of Fib(n-1) @ LR = return address Fib: sub sp, sp, #12 @ allocate space in stack to save registers str lr, [sp, #0] @ save registers str r4, [sp, #4] str r5, [sp, #8] if0: cmp r0, #0 @ if number is 0 bne if1 mov r0, #1 @ return 1 b fib_ret if1: cmp r0, #1 @ if number is 1 beq fib_ret @ return 1 else: mov r4, r0 @ copy number n to r4 sub r0, r0, #1 @ calculate n-1 bl Fib @ calculate Fib(n-1) mov r5, r0 @ save result in r5 sub r0, r4, #2 @ calculate n-2 bl Fib @ calculate Fib(n-2) add r0, r0, r5 @ add result of Fib(n-1) to Fib(n-2) fib_ret: ldr lr, [sp, #0] @ restore registers ldr r4, [sp, #4] ldr r5, [sp, #8] add sp, sp, #12 @ remove allocated space from stack bx lr @ return to calling function

Multiply

.data prompt1: .asciz "Please enter first number to multiply: " prompt2: .asciz "Please enter second number to multiply: " result: .asciz "%d * %d = %d\n" format: .asciz "%d" number: .word 0 .text .global main @ Registers used: @ R0 = used as first argument to functions and to hold return values @ R1 = used as second argument to functions and to save variable address @ R2 = used as third argument for printf @ R3 = used as fourth argument for printf @ R4 = first number to multiply @ R5 = second number to multiply @ LR = return address main: sub sp, sp, #4 @ save return address str lr, [sp] ldr r0, =prompt1 @ load adress of first prompt bl printf @ print the prompt ldr r0, =format @ format to read an integer ldr r1, =number @ read in variable bl scanf @ read the number ldr r1, =number @ load variable address ldr r4, [r1] @ load first number value in r4 ldr r0, =prompt2 @ load adress of second prompt bl printf @ print the prompt ldr r0, =format @ format to read an integer ldr r1, =number @ read in variable bl scanf @ read the number ldr r1, =number @ load variable address ldr r5, [r1] @ load second number value in r5 mov r0, r4 @ pass first number to function mov r1, r5 @ pass second number to function bl Mult @ multiply numbers mov r3, r0 @ copy result to r3 for printing it ldr r0, =result @ load adress of result message mov r1, r4 @ copy first number mov r2, r5 @ copy second number bl printf @ print the result ldr lr, [sp] @ restore return address add sp, sp, #4 bx lr @ return to os @ Function that multiplies two numbers using recursion @ Receives: r0 = first number, r1 = second number @ Returns: r0 = multiplication @ Registers used: @ R0 = function argument m and return value @ R1 = function argument n @ R4 = saves the initial value of m @ LR = return address Mult: sub sp, sp, #8 @ allocate space in stack to save registers str lr, [sp, #0] @ save registers str r4, [sp, #4] cmp r1, #1 @ if second number is 1 beq mult_ret @ return m (first number) mov r4, r0 @ copy m to r4 sub r1, r1, #1 @ calculate n-1 bl Mult @ multiply m * (n-1) add r0, r0, r4 @ add result of m * (n-1) to m mult_ret: ldr lr, [sp, #0] @ restore registers ldr r4, [sp, #4] add sp, sp, #8 @ remove allocated space from stack bx lr @ return to calling function

Related Samples

At ProgrammingHomeworkHelp.com, we offer a comprehensive selection of related samples for Assembly Language assignments. Our expertly crafted samples provide invaluable support to students, showcasing the intricate details and high standards required for successful assignments. Whether you're tackling complex coding problems or learning the fundamentals, our resources are designed to guide you through every step. Trust ProgrammingHomeworkHelp.com to be your reliable partner in achieving academic excellence in Assembly Language. Explore our samples today and see the difference expert support can make in your studies.