ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
851661 Топик полностью
MBedder, терминатор (28.06.2018 21:27, просмотров: 205) ответил Экспериментатор на Говорите точно, сколько тактов для 65535? У меня где-то есть свои измерения для разных методов. Любопытно, сколько можно выиграть за счет таких изощрений на asm. Могу, конечно, и сам проверить...
21 такт независимо от входной величины. Есть вариант с развернутым циклом "do" (годится для PIC24) - там еще на 2 такта быстрее и на 4 слова длиннее: ;------------------------------------------------------------------ ; Converts an unsigned integer N in w0 to a 5-byte ASCII numerical string [w4] ; using a reciprocal multiplication and fractional conversion techniques ; 19 clocks including RETURN, 17 program words ; Registers trashed: w0..w4 itoa: rec10k = 429497 ; =~ 2^32/10000 mov #rec10k >> 16,w1 mul.uu w1,w0,w2 ; w3:w2 = partial product MSWs mov #rec10k & 0xFFFF,w1 mul.uu w1,w0,w0 ; w1:w0 = partial product LSWs add w1,w2,w0 ; w0 = fract(N%10000) mov #'0',w2 ; w2 = ASCII bit mask addc.b w3,w2,[w4++] ; w3 = N/10000, store an ASCII MS character inc w0,w0 ; Correct the remainder to use 16-bit ops mul.uu w0,#10,w0 ; w1 = next ASCII digit (0..9 range), w0 = fractional remainder ior.b w1,w2,[w4++] ; Convert to ASCII and store a next character mul.uu w0,#10,w0 ; Same as above ior.b w1,w2,[w4++] ; mul.uu w0,#10,w0 ; Same as above ior.b w1,w2,[w4++] ; mul.uu w0,#10,w0 ; Same as above ior.b w1,w2,[w4++] ; return ;------------------------------------------------------------------