имеем для тестов две переменные Код (ASM): .data temp4 dword 11223344h ; переменная 4 байта temp6 fword 112233445566h ; переменная 6 байт .code нам нужно каждое число представить в текстовом десятичном формате например: значение (temp4) - 11223344h вывести на экран как текстовое число - 287454020 значение (temp6) - 112233445566h вывести на экран как текстовое число - 18838586676582 как это сделать с четырёх байтовой переменной я знаю нужно число разделить на десять выявить остаток и к этому остатку прибавить значение (30h) это будет последняя цыфра в текстовом числе дальше если результат от деления (частное) не ноль повторяем операцию и находим предпоследнюю цыфру и так до тех пор пока частное не будет ноль а вот как это сделать с шестибайтной переменной если кто в теме подскажите пожалуйста
assch, > а вот как это сделать с шестибайтной переменной Так же как и с 4-х байтной. Не достаточно инфы для ответа, тоесть как реализованы вичисления ?
Гугли про "длинную арифметику", с помощью которой числа с мантиссой любой длины можно складывать/вычитать/умножать/делить по частям.
f13nd, А собственно почему вы придумали плавающую арифметику в тему, тс про неё ничего не сказал. Гугли сам.
Какую плавающую? Это целочисленная. RSA на ней сделано как бы, это целочисленное экспоненциальное модулирование. ЗЫ: опять крелк эрудицией блеснул.
это алгоритм для четырёх байтного значения Код (ASM): .data? buffer byte 128 dup(?) .code lea edi,buffer ; Указатель на буфер-приемник mov eax,123456789 ; двойное слово mov ebx,10 ; основание системы счисления xor ecx,ecx ; счетчик десятичных цифр @@: xor edx,edx div ebx or dl,'0' ; Преобразовать результат в символ цифры push edx ; Сохранить цифру в стеке inc ecx ; Увеличить счетчик цифр or eax,eax ; если (eax) не ноль переход на метку выше jnz @b @@: pop eax ; Записать все цифры из стека в буфер stosb loop @b
assch, можешь использовать подсистему MMX, или в 64бит приложении тоже это примерно так же проделать. Есть способы универсальней - "long arithmetic", можешь реализовать сам, можешь какой-нибудь BigInteger подтянуть, где это уже реализовано.
я могу ошибатся но MMX кажется заточена на работу с вещественными (плавающая точка) значениями а насчёт long arithmetic попробую поискать может быть и правда в тему
assch, Тогда если нужно число произвольной разрядности обработать, то придётся самостоятельно для этого алгоритмы реализовать. Если конкретно IA, то FPU может загружать 64-int: FILD m64int Push m64intonto the FPU register stack.
не много опоздал но всё равно выложу я пробовал работать с регистрами FPU но при работе с обычными целыми числами у них даже в четырёх байтовой зоне идут непонятки например если значение (12345) поделить на (10) tmp1=12345 tmp2=10 Код (ASM): fild tmp1 fild tmp2 fdiv fist tmp то в переменной (tmp) на выходе будет правильное значение (1234) а вот если первую переменную сделать по больше (123456) tmp1=123456 tmp2=10 Код (ASM): fild tmp1 fild tmp2 fdiv fist tmp то в переменной (tmp) на выходе будет не правильное значение (12346) хотя мы ожидаем что должно быть (12345) и соответственно чем больше тем ещё хуже результат хотя не исключено что что то не так делаю подозреваю что с XMM будет таже петрушка
Потому что fpu при конвертировании в целочисленное округляет (способ округления задан в control word, fstcw/fldcw). 123456 не кратно 10, поэтому остаток влияет на целочисленный результат. Такой петрушки в MMX быть не должно.
у меня есть ещё один алгоритм для преобразования 8-байтного значения в текстовый вид числа и работает он хорошо этот алгоритм под капотом использует регистр (edx) исходя из представления (EDX:EAX = 7065532612345678h) Код (ASM): .data tmp qword 7065532612345678h .code lea ecx,tmp mov eax,[ecx] ; Младшее двойное слово mov esi,[ecx+4] ; Старшее двойное слово lea edi,buff ; Указатель на буфер-приемник mov ebx,10 ; Основание системы счисления xor ecx,ecx ; Счетчик десятичных цифр @@: xchg eax,esi xor edx,edx div ebx xchg esi,eax div ebx or dl,'0' push edx inc ecx or eax,eax jnz @b @@: pop eax stosb loop @b зтот алгоритм из 8-байтного значения (7065532612345678h) правильно делает текстовый вид (8098970927874987640) но 7-байтное значение или 6-байтное значение или 5-байтное значение этот алгоритм не сможет правильно обработать а сможет только 8-байтное значение может быть в этом алгоритме нужно что то подправить чтобы он смог правильно обработать например 6-байтное значение но к сожелению пока не знаю что именно будем как говорится думать или искать алгоритмы в длинной арифметике или ещё раз покапаюсь в XMM
Код (ASM): mov eax,[ecx] ; Младшее двойное слово movzx esi,WORD[ecx+4] ; Старшее двойное слово 2 старших байта esi должны быть нулями, 2 младших - старшими двумя от 6байтного значения. На этих 6 байтах свет клином сошелся? Они не кратны слову процессора.
Дико извиняюсь в посте #16 оказывается я прописал алгоритм тот что и нужен он универсально обработает любое значение до 8-байт то есть 1-байтное,2-байтное и так далее до 8-байтного накладка скорее всего случилась по тому что раньше в алгоритме я не правильно делал инициализацию то есть я инициализировал регистры в лоб Код (ASM): mov eax,12345678h ; Младшее двойное слово mov esi,70655326h ; Старшее двойное слово а нужно было через память Код (ASM): .data tmp qword 7065532612345678h .code lea ecx,tmp mov eax,[ecx] ; Младшее двойное слово mov esi,[ecx+4] ; Старшее двойное слово Думаю что тему наверное можно закрывать всем участникам темы большое спасибо Век живи век учись
Я кстате посмотрел как это сделано в PB https://www.purebasic.com/ Почему именно он - там работа с математикой реализована чудесно, если нужно сделать сложные вычисления на fpu, то этот компилер даёт готовое. Оказывается что fpu не используется, обычная математика.
Много чего это делает без подсистем, обходясь длиной слова процессора. В оригинальном алгоритме, предложенном самими разработчиками RSA есть: Код (Text): NN_Digits NN_Cmp NN_RShift NN_LShift NN_Sub NN_Add NN_DigitBits NN_AssignZero NN_Assign NN_Mult NN_Div NN_Mod NN_ModMult NN_ModExp Это одна из немногих реализаций длинной арифметики "с нуля", без сторонних библиотек. Все эти функции оперируют с дайджестами - полями произвольной длины.
f13nd, Удивишься наверно что 8-битные контроллеры использовали длинную математику, есчо задолго до того, как ты наверно смог ходить.
Я вот печенкой чуял, что так оно и есть. Поэтому не удивляюсь, когда вижу что клон 16-битного 8051 по имени сенслок может уможать дворды