Je suis tenté de dire « lien avec une bibliothèque C et appel printf ». Si ce n'est pas une option, voici quelque chose qui fonctionne probablement, étant donné une fonction "putchar" qui génère le caractère ASCII dans r0. Il divise le nombre de façon répétée par 10, écrit les chiffres dans un petit tampon sur la pile, puis les sort dans l'ordre inverse. Il nécessite une architecture 4M ou mieux pour l'instruction "umull".
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
Comment imprimer le résultat? – kennytm
Habituellement, le formatage en décimal devrait être plus facile qu'en hexadécimal (si vous le faites manuellement). Dans le cas le plus simple, il suffit de remplacer un '16' par' 10'. –
@Joachim: la décimale est un peu plus difficile. Les chiffres hexadécimaux peuvent être extraits dans l'ordre en utilisant les opérations de décalage et de masquage. Les chiffres décimaux nécessitent soit une division par des puissances de 10, soit une division répétée de 10 (ce qui leur donne dans l'ordre inverse). –