ARM汇编:打印寄存器的十进制值

3
我有一个指数子程序,可以进行计算并将结果放入r0中。目前我可以以十六进制打印结果,但我还想以十进制打印它。在网上搜索了很多后,我没有找到一个简单的方法来完成它。这似乎是一个简单的任务,但我无法弄清楚如何做到这一点。
谢谢

通常将数字格式化为十进制应该比十六进制更容易(如果您手动执行)。在最简单的情况下,您只需将一个“16”替换为“10”。 - Joachim Sauer
2
@Joachim:十进制要难得多。16进制数字可以使用移位和掩码操作按顺序提取。十进制数字需要除以10的幂,或重复除以10(以相反的顺序给出)。 - Mike Seymour
八进制比十六进制更容易,因为你不需要像十六进制那样加7来处理大于9的数字。十六进制也很简单,而十进制则较难,因为你必须进行除以10的运算。 - old_timer
1个回答

4

我倾向于说“链接一个C库并调用printf”。如果这不是一个选项,那么请参考以下方法,假设有一个“putchar”函数可以输出r0中的ASCII字符。它会重复将数字除以10,将数字写入到堆栈上的一个小缓冲区中,然后以相反的顺序输出它们。它要求使用“umull”指令的4M或更好的体系结构。

print_decimal:
        stmfd   sp!, {r4,r5,lr}

        cmp     r0, #0
        moveq   r0, #'0'
        bleq    putchar
        beq     done

        mov     r4, sp
        mov     r5, sp
        sub     sp, sp, #12

        rsblt   r0, r0, #0          ; r0 = abs(r0)
        movlt   lr, #1              ; lr = negative ? 1 : 0
        movgt   lr, #0

        ldr     r1, =0x1999999a     ; r1 = 2^32 / 10

loop:   umull   r2, r3, r0, r1      ; r3 = r0 / 10
        sub     r2, r0, r3, lsl #3
        sub     r2, r2, r3, lsl #1  ; r2 = r0 - 10*r3 = r0 % 10

        add     r2, r2, #'0'
        strb    r2, [r4, #-1]!

        movs    r0, r3
        bne     loop

        cmp     lr, #0
        movne   r0, #'-'
        blne    putchar

write:  ldrb    r0, [r4], #1
        bl      putchar
        cmp     r4, r5
        blt     write

        add     sp, sp, #12
done:
        ldmfd   sp!, {r4,r5,lr}
        mov     r0, #'\n'
        b       putchar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接