+1 (315) 557-6473 

Convert Miles to Kilometres In ARM Assembly Language Assignment Solution.


Instructions

Objective
Write an ARM program Convert miles to kilometres in ARM assembly language.

Requirements and Specifications

  1. In the file libConversions.s you will implement two functions. Note the function signatures (order of arguments) must be maintained. Hours must be the first argument to kph!
    1. The first function is miles2kilometer(int miles), which will convert kilometers to miles by multiplying by 100 and dividing by 166. (Put in a comment why we multiply by 100, then divide by 166. Suggest how even greater precision could be achieved using this method for integer numbers).
    2. The second function is kph(int hours, int miles), and must be calculated by calling function miles2kilometers to convert the miles to kilometers, and then dividing by hours.
    3. Write an assembly language assignment program to prompt for and read the values of miles and hours, and print out the mph.
  2. Write the functions CToF and InchesToFt and add it to the conversions.s file. Write a main program to call it and test it.
Screenshots of output
convert miles to kilometres in ARM assembly language
convert miles to kilometres in ARM assembly language 1
Source Code
mainkph.s
# FileName: mainKph.s
# Author: ?????
# Date: 10/17/2022
# Purpose: Test the kph function in the libConversions library
    .text
    .global main
main:
    # save return address in stack
    SUB sp, sp, #4
    STR lr, [sp, #0]
    # prompt to enter hours
    LDR r0, =prompth
    BL printf
    # read hours in stack
    LDR r0, =format
    SUB sp, sp, #4
    MOV r1, sp
    BL scanf
    # load read number in r4
    LDR r4, [sp, #0]
    ADD sp, sp, #4
    # prompt to enter miles
    LDR r0, =promptm
    BL printf
    # read miles in stack
    LDR r0, =format
    SUB sp, sp, #4
    MOV r1, sp
    BL scanf
    # load read number in r5
    LDR r5, [sp, #0]
    ADD sp, sp, #4
    # make calculation
    MOV r0, r4
    MOV r1, r5
    BL kph
    # print result
    MOV r1, r0
    LDR r0, =result
    BL printf
    # load return address from stack
    LDR lr, [sp, #0]
    ADD sp, sp, #4
    # return to os
    MOV pc, lr
.data
    prompth: .asciz "Enter the number of hours: "
    promptm: .asciz "Enter the number of miles: "
    format: .asciz "%d"
    result: .asciz "The value of kph is: %d\n"
mainInchesToFt.s
# FileName: mainInchesToFt.s
# Author: ?????
# Date: 10/17/2022
# Purpose: Test the CtoF and InchesToFt functions in the libConversions library
    .text
    .global main
main:
    # save return address in stack
    SUB sp, sp, #4
    STR lr, [sp, #0]
    # prompt to enter celsius
    LDR r0, =promptC
    BL printf
    # read celsius in stack
    LDR r0, =format
    SUB sp, sp, #4
    MOV r1, sp
    BL scanf
    # load read number in r0
    LDR r0, [sp, #0]
    ADD sp, sp, #4
    # make calculation
    BL CtoF
    # print result
    MOV r1, r0
    LDR r0, =resultF
    BL printf
    # prompt to enter inches
    LDR r0, =promptI
    BL printf
    # read inches in stack
    LDR r0, =format
    SUB sp, sp, #4
    MOV r1, sp
    BL scanf
    # load read number in r0
    LDR r0, [sp, #0]
    ADD sp, sp, #4
    # make calculation
    BL InchesToFt
    # print result
    MOV r1, r0
    LDR r0, =resultFt
    BL printf
    # load return address from stack
    LDR lr, [sp, #0]
    ADD sp, sp, #4
    # return to os
    MOV pc, lr
.data
    promptC: .asciz "Enter the number of celsius: "
    promptI: .asciz "\nEnter the number of inches: "
    format: .asciz "%d"
    resultF: .asciz "The value of fahrenheit is: %d\n"
    resultFt: .asciz "The value of feet is: %d\n"
libConversion.s
# FileName: libConversions.s
# Author: ?????
# Date: 10/17/2022
# Purpose: Conversion functions
    .text
    .global miles2kilometers
# Function: miles2kilometers
# Purpose: convert miles to kilometers
#
# Input: r0 - value in miles to convert
#
# Output: r0 - value converted to kilometers
miles2kilometers:
    # save return address in stack
    SUB sp, sp, #4
    STR lr, [sp, #0]
    # load value of 161 for multiplication
    MOV r2, #161
    # multiply miles * 161
    MUL r0, r0, r2
    # load value of 100 to make division
    MOV r1, #100
    # divide (miles * 161) / 100
    BL __aeabi_idiv
    # answer is in r0 so we can return it to caller
    # We multiply times 100 in order to move the decimal point two positions
    # to the left, the value of 161 is thus 1.61 * 100, 1.61 is the
    # conversion of 1 mile to kilometers.
    # The division by 100 is used to get the correct decimal point position:
    # km = x mile * (161 km/mile) / 100 = x * 1.61 km
    # If we need more precision we can multiply by a larger power of 10, for
    # example 10000, thus the decimal point will be moved 4 positions to the left
    # load return address from stack
    LDR lr, [sp, #0]
    ADD sp, sp, #4
    # return to caller
    MOV pc, lr
    .global kph
# Function: kph
# Purpose: calculate kph from hours and miles
#
# Input: r0 - value of hours
# r1 - value of miles
#
# Output: r0 - result of calculation of kilometers per hour
kph:
    # save return address and r4 in stack
    SUB sp, sp, #8
    STR lr, [sp, #0]
    STR r4, [sp, #4]
    # save hours argument in r4
    MOV r4, r0
    # convert miles to kilometers
    MOV r0, r1
    BL miles2kilometers
    # km is in r0
    # copy value of hours
    MOV r1, r4
    # divide km / hours
    BL __aeabi_idiv
    # answer is in r0 so we can return it to caller
    # load return address and r4 from stack
    LDR lr, [sp, #0]
    LDR r4, [sp, #4]
    ADD sp, sp, #8
    # return to caller
    MOV pc, lr
    .global CtoF
# Function: CToF
# Purpose: convert celsius to fahrenheit
#
# Input: r0 - value of celsius
#
# Output: r0 - conversion to fahrenheit
CtoF:
    # save return address in stack
    SUB sp, sp, #4
    STR lr, [sp, #0]
    # load value of 900 for multiplication
    MOV r2, #900
    # multiply celsius * 900
    MUL r0, r0, r2
    # load value of 500 to make division
    MOV r1, #500
    # divide (celsius * 900) / 500
    BL __aeabi_idiv
    # answer is in r0
    # add 32 to get answer
    ADD r0, r0, #32
    # load return address from stack
    LDR lr, [sp, #0]
    ADD sp, sp, #4
    # return to caller
    MOV pc, lr
    .global InchesToFt
# Function: InchesToFt
# Purpose: convert inches to feet
#
# Input: r0 - value of inches
#
# Output: r0 - conversion to feet
InchesToFt:
    # save return address in stack
    SUB sp, sp, #4
    STR lr, [sp, #0]
    # load value of 12 to make division
    MOV r1, #12
    # divide inches / 12
    BL __aeabi_idiv
    # answer is in r0
    # load return address from stack
    LDR lr, [sp, #0]
    ADD sp, sp, #4
    # return to caller
    MOV pc, lr