2010-03-03 10 views
3

J'ai un sous-programme d'exponentiation qui fait le calcul et met le résultat en r0. Actuellement, je peux imprimer le résultat en hexadécimal, mais je veux aussi l'imprimer en décimal. Après avoir fait beaucoup de recherches en ligne, je n'ai pas trouvé un moyen simple de le faire. On dirait une tâche simple à faire mais je ne peux pas le comprendre.ARM assemblage registre valeur d'impression en décimal

grâce

+1

Comment imprimer le résultat? – kennytm

+0

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'. –

+2

@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). –

Répondre

4

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