Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

itoa алгоритм работы

Здравствуйте, comp,

Есть финкция itoa стандатной библиотеки stdlib.h. Так вот,
непонятно, как она работает? Ассемблер я понимаю, но не понимаю по
какому алгоритму она работает? Пожалуйста, кто волокет в этом
деле, напишите мне алгоритм преобразования,с пояснениями вот для
этого примера:

Есть целое,без знака 4-х байтное число, любое, которое надо
преобразовать(типа unsigned long b=0xf0ffffff)
Есть массив из 10 элементов размером 1 байт(типа char a[9]), куда
надо записать результат.
Сделать надо на чистом ассемблере,т.е. без библиотек,модулей...
Мне главное алгоритм, на ассемблер я сам переведу.
Приветствуются любые подсказки, которые помогут сдвинуть дело "с
мертвой точки". И еще, желательно заменить все умножения и деления
в алгоритме, на другие операции (сложение, вычетания,
циклический сдвиг регистра...) .
Это мне нужно для PIC16F84A,для отображения на LCD содержимого
памяти в десятичном формате.

Ответить   Виктор Wed, 7 Apr 2004 22:23:17 +0400 (#120636)

 

Ответы:

Здравствуйте !

Смотрим в XTOA.C :

char * __cdecl _itoa (
int val,
char *buf,
int radix
)
{
if (radix == 10 && val < 0)
xtoa((unsigned long)val, buf, radix, 1);
else
xtoa((unsigned long)(unsigned int)val, buf, radix, 0);
return buf;
}

static void __cdecl xtoa (
unsigned long val,
char *buf,
unsigned radix,
int is_neg
)
{
char *p; /* pointer to traverse string */
char *firstdig; /* pointer to first digit */
char temp; /* temp char */
unsigned digval; /* value of digit */

p = buf;

if (is_neg) {
/* negative, so output '-' and negate */
*p++ = '-';
val = (unsigned long)(-(long)val);
}

firstdig = p; /* save pointer to first digit */

do {
digval = (unsigned) (val % radix);
val /= radix; /* get next digit */

/* convert to ascii and store */
if (digval > 9)
*p++ = (char) (digval - 10 + 'a'); /* a letter */
else
*p++ = (char) (digval + '0'); /* a digit */
} while (val > 0);

/* We now have the digit of the number in the buffer, but in reverse
order. Thus we reverse them now. */

*p-- = '\0'; /* terminate string; p points to last digit
*/

do {
temp = *p;
*p = *firstdig;
*firstdig = temp; /* swap *p and *firstdig */
--p;
++firstdig; /* advance to next two digits */
} while (firstdig < p); /* repeat until halfway */
}

Оно ?

--
С уважением, Вахтуров Виктор.
Информационный сайт для программистов http://SoftMaker.com.ru

З.Ы. Читайте исходники, товарищи !
Читайте классику !
Номер выпуска : 2800
Возраст листа : 199 (дней)
Количество подписчиков :
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/120677
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 8 Apr 2004 01:59:44 +0400 (#120677)

 

Прив Виктор!
Thursday, April 8, 2004, 1:23:17 AM, от Вас получено:


В общем все просто, я как то даже писал прогу на Асме именно на это.
Байт 30 выходит.

1. Берешь символ последовательно делишь это целое на 10 пока не
получишь меньше 10

2. остаток запоминай каждый раз в буфере.

3. Затем к каждому значению прибавляешь ASCII нуля.

4. Результат помещаешь в массив Char.

Ответить   Thu, 8 Apr 2004 06:49:48 +0700 (#120722)

 

Тема: itoa алгоритм работы

А зачем так? Разбираться в "этом" - пишите сами :))
http://www.Kalashnikoff.ru/Assembler/ , или в "классике" - книге Зубкова - все
алгоритмы прописаны оптимально!
(есть они и в электронном виде:

http://subscribe.ru/archive/comp.soft.prog.dorenews/200008/07143135.html
http://asmlib.narod.ru/images/
http://prog.dax.ru/downloads/zubkov/get.phtml
)

Ответить   Thu, 8 Apr 2004 08:58:00 +0400 (#120835)