【问题标题】:ARM assembly print register value in decimalARM 汇编以十进制打印寄存器值
【发布时间】:2010-03-03 12:01:04
【问题描述】:

我有一个求幂子程序,它进行计算并将结果放入 r0。目前我可以用十六进制打印结果,但我也想用十进制打印。在网上做了很多搜索之后,我还没有找到一种直接的方法。似乎是一个简单的任务,但我想不通。

谢谢

【问题讨论】:

  • 通常格式化为十进制应该比十六进制更容易(如果您手动进行)。在最简单的情况下,您只需将 16 替换为 10
  • @Joachim:十进制有点难。可以使用移位和掩码操作按顺序提取十六进制数字。十进制数字需要除以 10 的幂,或重复除以 10(以相反的顺序给出它们)。
  • 八进制比十六进制更容易,因为你没有如果大于 9 然后加 7,十六进制很容易,十进制很难你必须除以 10。

标签: printing decimal arm


【解决方案1】:

我很想说“与 C 库链接并调用 printf”。如果这不是一个选项,这可能是可行的,给定一个在 r0 中输出 ASCII 字符的“putchar”函数。它反复将数字除以 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多