Значение регистра печати ARM в десятичном формате - PullRequest
3 голосов
/ 03 марта 2010

У меня есть функция возведения в степень, которая выполняет вычисления и помещает результат в r0. В настоящее время я могу напечатать результат в шестнадцатеричном формате, но я также хочу напечатать его в десятичном виде. После долгих поисков в Интернете я не нашел простого способа сделать это. Похоже на простую задачу, но я не могу понять это.

спасибо

1 Ответ

4 голосов
/ 03 марта 2010

Я испытываю желание сказать "связать с библиотекой C и вызвать printf". Если это не вариант, вот что, вероятно, работает, учитывая функцию «putchar», которая выводит символ ASCII в r0. Он многократно делит число на 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
...