【问题标题】:ARM Division by 10 Save remainder and quotientARM 除以 10 保存余数和商
【发布时间】:2013-03-06 06:20:10
【问题描述】:

这是来自 CS2400 MSU Denver 的家庭作业问题

你好,

我有一个程序从用户那里读取密钥,直到他们输入非 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

【问题讨论】:

标签: arm


【解决方案1】:

您可以通过像初等除法一样轻松地进行减法和移位来做到这一点。本站和谷歌也有很多除法算法

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

Assembly mod algorithm on processor with no division operator

但如果您只想从十六进制转换为十进制,那么double dabble 可能适合您的需要。它将数字转换为打包的 BCD 而不进行任何除法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 2018-11-04
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多