3
我有一個指數子程序,它執行計算並將結果放入r0。目前我可以用十六進制打印結果,但我也想用十進制打印。在網上進行了大量搜索之後,我還沒有找到一個簡單的方法來做到這一點。看起來像一個簡單的任務,但我無法弄清楚。ARM彙編件打印寄存器值十進制
感謝
我有一個指數子程序,它執行計算並將結果放入r0。目前我可以用十六進制打印結果,但我也想用十進制打印。在網上進行了大量搜索之後,我還沒有找到一個簡單的方法來做到這一點。看起來像一個簡單的任務,但我無法弄清楚。ARM彙編件打印寄存器值十進制
感謝
我很想說:「與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
如何打印結果? – kennytm 2010-03-03 12:26:03
通常格式化爲十進制應該比十六進制更容易(如果您手動執行)。在最簡單的情況下,你只需用'10'替換一個'16'。 – 2010-03-03 12:47:09
@Joachim:十進制比較難。十六進制數字可以按順序使用移位和屏蔽操作來提取。十進制數字要求按10的冪進行劃分,或者按10進行重複劃分(按相反順序進行劃分)。 – 2010-03-03 19:13:34