2013-03-06 4 views
-3

Это вопрос о выполнении домашних заданий из 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 
+0

[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) –

ответ

0

Вы можете сделать это путем простого вычитания и смены элементарного деления. Есть также много алгоритмов деления на данном сайте и Google

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

Assembly mod algorithm on processor with no division operator

Но если вы хотите, чтобы преобразовать из шестнадцатеричного в десятичное то double dabble может соответствовать вашим потребностям. Он преобразует число в упакованный BCD без какого-либо деления