|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Alex Astafiev 2:5000/228.16 21 Jan 2002 11:43:28 To : Pavel Fomin Subject : алгоpитмы пеpевода двоичного числа в двоично-десятичное -------------------------------------------------------------------------------- PF> В свое время мне один человек присылал исходник для PIC16F84 с PF> просьбой разобраться. Здесь я приведу оригинальный исходник, а ниже PF> комментарии по алгоритму. DO>> замечания: DO>> очень мало места PF> Посмотри, может уложишься. Алгоритм быстрый и скорость практически не PF> зависит от значения числа. DO>> дополнительных. МК не умеет умножать и вычитать, тока складывает DO>> байты, PF> сдвиги он тоже наверняка понимает. [] на весь этот программный сюр есть детальный ответ - читайте ASM.TALKS ибо там на прошлой неделе был жаркий дебат о конверсии чисел. я давал универсальную функцию. все что нужно, заменить в ней AAA на DAA и длину буфера, не 20 а 10 байт. числа меньшей разрядности (не 64бита) поместятся в регистрах и никакого буфера для BCD результата не нужно. Если на target - платформе нет DAA, то ее легко сэмулировать программно. Д TALKS.ASM (2:5000/228.16) ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД TALKS.ASM Д Сооб : 53 из 171 -52 Snt Loc Scn От : Alex Astafiev 2:5000/228.16 12 Янв 02 18:06:26 Кому : Sashka Yackubtchick 12 Янв 02 19:55:30 Тема : Умножение на 17 за 2а такта ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД Hi Sashka.. SY> есть чему у тебя поучится. Для затравки - вот простая идея, несколько SY> месяцев назад я искал универсальный и быстрый алгоритм для перевода SY> 64битного безнакового целого в символьную десятичную ASCIIZ SY> строку. Еще на ZX Spectrum я разработал следущий способ - необходимо два буфера, один в исходном формате, а второй - в формате в который необходимо конвертировать. Для того чтобы выполнить конверсию, необходимо исходный буфер, начиная со старшего бита побитно выдвигать, а во второй буфер - вдвигать, и при вдвигании каждого бита необходимо проводить коррекцию необходимого типа. вот работающая процедура : ; input: 64bit edx:ebx ; output char bufer 20 bytes ; to form ascii-code add 0x30 to each byte mov ebx,$ffffffff ; мл разряды mov edx,$7fffffff ; ст разряды mov edi,offset buffer ; очистка 20 байт mov ecx,20 xor al,al rep stosb ------------сама функция--------------- mov cl, 64 ; счетчик 64 бита @l1: shl ebx, 1 ; сдвиг edx:ebx rcl edx, 1 mov edi,offset buffer mov ch,20 ; счетчик 20 байт @l2: mov al,[edi] ; сдвиг кажд байта adc al,al ; и ascii коррекция aaa mov [edi],al inc edi dec ch jnz @l2 dec cl jnz @l1 ret процедура носит иллюстративный характер и конечно, может быть соптимизирована для скорости. Из-за ее иллюстративности число возвращается наоборот, первый байт буфера младший разряд. Вместо aaa можно использовать команду daa, тогда число возвратится в упакованом BCD - виде. Для того чтобы получить ascii - строку, необходимо к каждому байту добавить 0x30 hex. Этим я, надеюсь, будет поставлена точка в вопросах конверсии между форматами. Искренне ваш, --- Alex Raider / Flash inc. * Origin: Alex Raider/ Flash inc. 1992-2002 (2:5000/228.16) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/174643c4c1490.html, оценка из 5, голосов 10
|