在ARM Assembly中将整数转换为十六进制字符串

时间:2018-11-20 20:16:45

标签: assembly arm

我试图弄清楚如何将32位整数转换为其十六进制表示形式。我知道我需要将最后4位分开,使用开关盒来查找它对应的十六进制字符。然后我需要对4位中的每位重复此操作。我正在努力寻找如何将4位中的每一个从LSB转换为MSB。有人可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:1)

根据注释和your answer中的建议进行掩膜和移位将使您组成单词的各个半字节(半字节)。但是要使用putchar或同等的字符打印数字,您需要将这些半字节转换为ASCII字符。为此,您不需要“开关箱”(或者相当于汇编语言的“跳转表”)。假设只有16个条目,则可以使用查找表,也可以有条件地将其添加到半字节中以形成字符。

ASCII数字0-9的字符代码为48-57。大写字母的字符代码从A的65开始(小写字母的数字从97开始),当然0xA代表十进制值10。因此,如果其值为10或10,则可以将半字节转换为十六进制字符串更多,否则为48。 (等效地,无条件地添加48,如果结果值为58或更大,则再添加7。)

还请注意,如您在答案中所建议的那样,向右移动将提取以最低有效半字节开头的数字,这不是您想要的。

以下内容未经测试,就不在我头上了,因此不作任何保证,但这可能会使您走上正轨:

    ; Assume number to be converted is in r4.  Note r4 is clobbered

    ; Initialise loop counter
    MOV   r5, #8
.loop
    ; Take most significant nibble from r4 into r0
    MOV   r0, r4, LSR #28

    ; Shift r4 for next time
    MOV   r4, r4, LSL #4

    ; For each nibble (now in r0) convert to ASCII and print
    ADD   r0, r0, #48
    CMP   r0, #58              ; did that exceed ASCII '9'?
    ADDHS r0, r0, #7           ; add 'A' - ('0'+10) if needed
    BL    putchar

    ; Decrement loop counter, loop if not zero
    SUBS  r5, r5, #1
    BNZ   .loop