+1 (315) 557-6473 

Verify A UPC Code To Check The Check Digit In ARM Assembly Language Using Keil Assignment Solution.


Instructions

Objective
Write an ARM assignment program to verify a UPC code to check the check digit in ARM assembly language using Keil assignment solution.

Requirements and Specifications

Most goods sold in U.S. and Canadian stores are marked with a Universal Product Code (UPC). The meanings of the digits underneath the bar code (from left to right) are: First digit: type of item, The first group of five digits: manufacturer, The second group of five digits: product, and Final digit: check digit, used to help identify an error in the preceding digits. To compute the check digit, a) Add the first, third, fifth, seventh, ninth, and eleventh digits b) Add the second, fourth, sixth, eighth, and tenth digits c) Multiply the first sum by 3 and add it to the second sum d) The check digit is the digit which, when added to the above sum, produces a sum that is multiple of 10 Example for UPC 0 13800 15073 8: First sum: 0 + 3 + 0 + 1 + 0 + 3 = 7 Second sum: 1 + 8 + 0 + 5 + 7 = 21 Multiplying the first sum by 3 and adding the second yields 42 The check digit is 8, as 42 + 8 = 50 (multiple of 10). To verify the check digit, you do the first 3 steps above from a) to c) and then add the sum to the check digit. Finally, you check if the result is multiple of 10 or not. Write an ARM assembly program to verify whether a string of 12 ASCII encoded digits stored in memory is a valid UPC or not. If valid, you should store 1 in r0, if not, you should store 2 in r0. Your code should be highly optimized. Use as few instructions as possible (as little as 19 assembly instructions only, NOT including any assembly directives or data definitions)!!. Define in your assembly program the 12 digits UPC string as follow: UPC DCB "013800150738" ;correct UPC string To test your program, you can use the following UPCs: UPC2 DCB "060383755577" ;correct UPC string UPC3 DCB "065633454712" ;correct UPC string You can also get more UPC codes from your kitchen items. For an incorrect UPC, you can change any digit in a correct UPC to generate an incorrect UPC.
Screenshots of output
Verify UPC code to check digit in ARM assembly language using Keil
Verify UPC code to check digit in ARM assembly language using Keil 1
Verify UPC code to check digit in ARM assembly language using Keil 2
Verify UPC code to check digit in ARM assembly language using Keil 3
Source Code
UPC_LEN EQU 12 ; length of UPC code
ASCII_0 EQU 0x30 ; ascii value for '0'
        AREA question1, CODE
        EXPORT __main
        ALIGN
        ENTRY
__main PROC
        ; load UPC string to test
        LDR R1, =UPC ; load start address of upc to verify
        MOV R0, #1 ; assume number is valid by default
        ; Calculate the sum of 3 times the odd positions plus
        ; even positions including the last digit (check digit)
        ADD R2, R1, #UPC_LEN ; position of end of upc
        MOV R3, #0 ; sum, start in zero
sumloop
        LDRB R4, [R1], #1 ; load digit from upc string and increment position
        SUB R4, R4, #ASCII_0 ; convert from ascii to decimal
        ADD R4, R4, R4, LSL#1 ; multiply by 3 using a shift and a sum
        ADD R3, R3, R4 ; add to sum
        LDRB R4, [R1], #1 ; load next digit from upc string
        SUB R4, R4, #ASCII_0 ; convert from ascii to decimal
        ADD R3, R3, R4 ; add value to sum
        CMP R1, R2 ; see if we reached the end of upc
        BLT sumloop ; if not, repeat loop to add next values
        ; verify that the result is divisible by 10
        ; obtain the remainder of result by 10 using repeated subtractions
div10
        SUBS R3, R3, #10 ; subtract 10 from value to emulate division
        BEQ verified ; if zero, number is divisible by 10 and upc is valid
        BGT div10 ; if >0, repeat loop to subtract again
        MOV R0, #2 ; if we end here is not a valid upc (remainder is not zero)
verified
        ; At this point, R0 will be 1 for a valid UPC and 2 otherwise
        B verified ; infinite loop to end program
        ENDP
        ALIGN
        AREA TestData, DATA, READONLY
UPC DCB "013800150738" ;correct UPC string
UPC2 DCB "060383755577" ;correct UPC string
UPC3 DCB "065633454712" ;correct UPC string
UPC4 DCB "013400150738" ;incorrect UPC string
UPC5 DCB "060383758577" ;incorrect UPC string
UPC6 DCB "065633954719" ;incorrect UPC string
        END