-1

This is a question on homework from CS2400 MSU Denver

Hello,

I have a program that reads keys from the user until they have either entered a non HEX character or entered a max of 8 HEX characters. As keys are entered I maintain a sum of hex values being entered by the user by multiplying the sum register by 16 and adding the new hex value.

This part is all fine and dandy, no help needed. I am having trouble taking this final result, in HEX, and converting it to DEC. I know I need to divide by 10 only I don't know how I can accomplish this.

Please help me determine how to divide by 10 and save the quotient and remainder. Thanks.

AREA HW6, CODE
ENTRY

Divsor  EQU 10  
MAIN
MOV R1, #0          ; Clear register to be used as symbols received     counter
MOV     R2, #0              ; Clear register to be used as temp result
LDR R4, =DecStr     ; Load address of DecStr
LDR R5, =TwosComp       ; Load address of TwosComp
LDR R6, =RvsDecStr
BL  READ_CHARS      ; Read characters from the keyboard
BL  TO_DECIMAL      ; Is R2 negative ?
SWI     0x11


READ_CHARS
CMP     R1, #8          ; Check if necessary to read another key
BEQ DONE_READ_CHAR      ; User has entered 8 hex symbols

SWI 4           ; [R0] <--- Key from keyboard (ASCII)

CMP R0, #'0'        ; Verify digit is valid 
BLO DONE_READ_CHARS 

CMP R0, #'9'        ; Verify digit is valid 
BHI     CHECK_HEX       

SUB R0, R0, #'0'        ; Obtain Hex equivalent of ASCII char 0-9   
B   STORE_INPUT     

CHECK_HEX
CMP     R0, #'A'
BLO DONE_READ_CHARS         ; Invalid Hex symbol
CMP R0, #'F'
BHI DONE_READ_CHARS     ; Invalid Hex symbol    

SUB     R0, R0, #'A'
ADD R0, R0, #0xA        ; Adding ten to receive Hex equivalent of ASCII A-F

STORE_INPUT
MOV R3, R2, LSL#4       ; *16
ADD R2, R3, R0      ; Add valid Hex symbol to temp result
ADD     R1, R1, #1      ; Increase symbol's recieved counter
B   READ_CHARS      ; Get next key

DONE_READ_CHARS
MOV     PC, LR          ; Return to BL READ_CHARS ( MAIN )

TO_DECIMAL
TST     R2, #2, 2
BEQ POSITIVE
STRB    #'-', [R4], #1      ; Store - as first byte in DecStr
MVN R2, R2          ; [R2] <-  1's complement of R2
ADD R2, R2, #1      ; [R2] <-  2's complement of R2
POSITVE
STR R2, [R5]        ; Store all entered hex values in memory at TwosComp

LDR     R7, [R5]        ; Initial quotient 
udiv10
LDRB    R7, [R5], #1        ; Load a byte of TwosComp 
CMP R7, #0
BEQ DONE_TO_DECIMAL

DONE_TO_DECIMAL
MOV PC, LR

AREA data1, DATA    
TwosComp 
DCD 0

DecStr  % 12

RvsDecStr
% 11

ALLIGN
END
Jesse Nelson
  • 776
  • 8
  • 21
  • [C++ fast division/mod by 10^x](http://stackoverflow.com/q/2033210/995714), [Divide by 10 using bit shifts?](http://stackoverflow.com/q/5558492/995714), [Fast Division on GCC/ARM](http://stackoverflow.com/q/16218228/995714) – phuclv Dec 24 '16 at 11:24

1 Answers1

1

You can do it by subtracting-and-shift like elementary division easily. There are also many division algorithms on this site and Google

How does one do integer (signed or unsigned) division on ARM?

Assembly mod algorithm on processor with no division operator

But if you only want to convert from hexadecimal to decimal then double dabble may fit your need. It converts number to packed BCD without any division

phuclv
  • 37,963
  • 15
  • 156
  • 475