ARM 汇编以十进制形式打印寄存器值

发布于 2024-08-23 19:04:52 字数 116 浏览 3 评论 0原文

我有一个求幂子例程,可以进行计算并将结果放入 r0 中。目前我可以以十六进制打印结果,但我也想以十进制打印它。在网上进行了大量搜索后,我还没有找到直接的方法。似乎是一个简单的任务,但我无法弄清楚。

谢谢

I have an exponentiation subroutine that does the calculation and puts the result in r0. Currently I can print the result in hexadecimal, but I also want to print it in decimal. After doing a lot of searching online I haven't found a straightforward way of doing it. Seems like a simple task to do but I can't figure it out.

thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

囚你心 2024-08-30 19:04:52

我很想说“链接到 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

I'm tempted to say "link with a C library and call printf". If that's not an option, here is something that probably works, given a "putchar" function that outputs the ASCII character in r0. It repeatedly divides the number by 10, writing the digits into a small buffer on the stack, then outputs them in reverse order. It requires architecture 4M or better for the "umull" instruction.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文