Order Now  +1 678 648 4277 

Convert a null-terminated ASCII string to a decimal using ARM assembly assignment help

The assignment deals with writing an ARM assembly procedure to convert an ASCII string to an integer value. The program designed by our ARM assembly assignment helpers uses a predefined value to test the function. The procedure is provided with two arguments, the value to convert and the address of the place to save the converted string. The string buffer is located at a predefined memory address.

Converting ASCII Strings to Integers

;;; Directives PRESERVE8 THUMB ;;; Equates INITIAL_MSP EQU 0x20001000 ; Initial Main Stack Pointer Value Allocating ; 1000 bytes to the stack as it grows down. ; Vector Table Mapped to Address 0 at Reset ; Linker requires __Vectors to be exported AREA RESET, DATA, READONLY EXPORT __Vectors __Vectors DCD INITIAL_MSP ; stack pointer value when stack is empty DCD Reset_Handler ; reset vector ALIGN ;The program ; Linker requires Reset_Handler AREA MYCODE, CODE, READONLY ENTRY EXPORT Reset_Handler ALIGN Reset_Handler PROC ; test the subroutine LDR R9, =0xc0010010 ; load a number to convert BL int_to_ascii ; convert it to a string endloop ; end program in an infinite loop B endloop ENDP ;-------------------------------------------------- ; int_to_ascii function ; converts the integer in R9 to a null-terminated ; string ;-------------------------------------------------- int_to_ascii PROC STMFD SP!, {R4, LR} LDR R10, =0x20000043; load address at end of buffer LDR R0, =0 STRB R0, [R10], #-1; save a zero as the end of the string, move one byte left MOV R1, R9; save the number to convert in R1 CMP R1, #0; see if the number is negative BGE start; if not, skip NEG R1, R1; else, turn number to positive start LDR R2, =10; load a 10 in R2 to make divisions loop UDIV R3, R1, R2; divide number by 10 MUL R4, R3, R2; get remainder by multiplying the result by 10 SUB R4, R1, R4; and subtracting it from the original number ADD R4, R4, #'0'; convert remainder digit to ASCII STRB R4, [R10], #-1; save digit in the string, move one byte left MOVS R1, R3; use the division result as the number for the next cycle BNE loop; continue while the number is not zero CMP R9, #0; see if the original number was negative BGE nosign; if not, do not insert sign LDR R0, ='-'; else, save a sign on the string STRB R0, [R10] B done; go to the end of subroutine nosign LDR R0, =' '; save space on the string STRB R0, [R10] done LDMFD SP!, {R4, PC} ; return ENDP ; Data area AREA MyData, DATA, READWRITE EXPORT buffer SPACE 30 ; padding to make buffer start at 0x2000_0030 buffer SPACE 20 ; allocate space to save converted string END