In: Computer Science
Write a recursive ARM Assembly program that takes two integers as input and outputs the greatest common divisor.
*I am using Eclipse DS-5 Community Workspace with A64 Instruction Set)
Use the following algorithm:
// Given two integers m and n:
if (m < n)
gcd(n, m)
if n is a divisor of m
gcd(m, n) = n
else
gcd (m, n) = gcd (n, m % n)
Your program must be recursive. You must create a function that
calls itself, and saves variables to the stack, and creates a stack
frame. Your program should restore the stack as it returns from
recursive calls.
Your program should have the following prompt:
"Enter Two Integers: "
Your program should then output the greatest common divisor then terminate.
Sample Test Cases
Enter Two Integers: 0 37
37
Enter Two Integers: 1 37
1
Enter Two Integers: -1 37
1
Enter Two Integers: 5 75
5
Enter Two Integers: -10 -100
10
Enter Two Integers: -10 100
10
Note: gcd(0,0) will not be tested.
CODE
.text .globl main main: sub $sp,$sp,12 # push stack sw $ra,4($sp) # save return address li $v0,4 # Ready for string output la $a0,pow # Load address of pow syscall # Print string li $v0,5 # Ready for integer input syscall # Read integer from console move $t2,$v0 # Move into to $t2 temporarily li $v0,4 # Ready for string output la $a0,bas # Load address of bas syscall # Print string li $v0,5 # Ready for integer input syscall # Read integer from console move $a0,$t2 # Move into to $a0 move $a1,$v0 # Move power integer to $a1 jal euc sw $v0,8($sp) # print the result li $v0,4 la $a0,str syscall li $v0,1 lw $a0,8($sp) syscall lw $ra,4($sp) # restore return address add $sp,$sp,12 # pop stack jr $ra .data str: # label of address containing a string .asciiz "GCD = " # Assembly directive used to create a null terminated ASCII string bas: # label of address containing a string .asciiz "Enter second integer = " # Assembly directive used to create a null terminated ASCII string pow: # label of address containing a string .asciiz "Enter first integer = " # Assembly directive used to create a null terminated ASCII string .text euc: sub $sp,$sp,8 # push stack sw $ra,4($sp) # save return address bne $a1, $zero, L1 # if b!=0 then exit add $v0,$zero,$a0 # return a0 add $sp,$sp,8 # pop stack jr $ra # return to calling procedure L1: move $t4,$a1 # set up c = b rem $a1,$a0,$a1 # b = a % b move $a0,$t4 # a = c jal euc # recurse lw $ra,4($sp) # restore previous return addr move $v0,$a0 # Move a to $v0 add $sp,$sp,8 # pop stack jr $ra # return to calling procedure