2010-03-03 233 views
3

我有一個指數子程序,它執行計算並將結果放入r0。目前我可以用十六進制打印結果,但我也想用十進制打印。在網上進行了大量搜索之後,我還沒有找到一個簡單的方法來做到這一點。看起來像一個簡單的任務,但我無法弄清楚。ARM彙編件打印寄存器值十進制

感謝

+1

如何打印結果? – kennytm 2010-03-03 12:26:03

+0

通常格式化爲十進制應該比十六進制更容易(如果您手動執行)。在最簡單的情況下,你只需用'10'替換一個'16'。 – 2010-03-03 12:47:09

+2

@Joachim:十進制比較難。十六進制數字可以按順序使用移位和屏蔽操作來提取。十進制數字要求按10的冪進行劃分,或者按10進行重複劃分(按相反順序進行劃分)。 – 2010-03-03 19:13:34

回答

4

我很想說:「與C庫和呼叫printf的鏈接」。如果這不是一個選項,那麼給定一個在put中輸出ASCII字符的「putchar」函數可能會起作用。它重複地將數字除以10,將數字寫入堆棧中的小緩衝區,然後以相反的順序輸出它們。它需要4M或更好的體系結構來實現「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