Это вопрос о выполнении домашних заданий из CS2400 МГУ ДенверDivision ARM 10 Сохранить остатка и фактор
Здравствуйте,
У меня есть программа, которая считывает ключи от пользователя, пока они не были либо введены в нон HEX характер или введите максимум 8 символов HEX. По мере ввода ключей я сохраняю сумму шестнадцатеричных значений, вводимых пользователем, умножая регистр сумм на 16 и добавляя новое шестнадцатеричное значение.
Эта часть все прекрасная и денди, без помощи. У меня возникли проблемы с получением этого конечного результата в HEX и преобразованием его в DEC. Я знаю, что мне нужно разделить на 10, только я не знаю, как я могу это сделать.
Пожалуйста, помогите мне определить, как разделить на 10 и сохранить коэффициент и остаток. Благодарю.
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
[C++ быстрое разделение/мода на 10^x] (http://stackoverflow.com/q//995714), [Разделить на 10 с помощью бит сдвигов?] (Http : //stackoverflow.com/q/5558492/995714), [Fast Division on GCC/ARM] (http://stackoverflow.com/q/16218228/995714) –