Как значение 6-байтной переменной вывести на экран в виде текстового числа

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 1 май 2019.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    имеем для тестов две переменные
    Код (ASM):
    1.  
    2. .data
    3. temp4  dword 11223344h           ; переменная  4  байта
    4. temp6  fword 112233445566h       ; переменная  6  байт
    5. .code
    6.  
    нам нужно каждое число представить в текстовом десятичном формате
    например:
    значение (temp4) - 11223344h
    вывести на экран как текстовое число - 287454020
    значение (temp6) - 112233445566h
    вывести на экран как текстовое число - 18838586676582
    как это сделать с четырёх байтовой переменной я знаю
    нужно число разделить на десять
    выявить остаток и к этому остатку прибавить значение (30h)
    это будет последняя цыфра в текстовом числе
    дальше если результат от деления (частное) не ноль
    повторяем операцию и находим предпоследнюю цыфру
    и так до тех пор пока частное не будет ноль
    а вот как это сделать с шестибайтной переменной
    если кто в теме подскажите пожалуйста
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    assch,

    > а вот как это сделать с шестибайтной переменной

    Так же как и с 4-х байтной. Не достаточно инфы для ответа, тоесть как реализованы вичисления ?
     
  3. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Гугли про "длинную арифметику", с помощью которой числа с мантиссой любой длины можно складывать/вычитать/умножать/делить по частям.
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    f13nd,

    А собственно почему вы придумали плавающую арифметику в тему, тс про неё ничего не сказал. Гугли сам.
     
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Какую плавающую? Это целочисленная. RSA на ней сделано как бы, это целочисленное экспоненциальное модулирование.
    ЗЫ: опять крелк эрудицией блеснул.
     
    Последнее редактирование: 1 май 2019
  6. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    это алгоритм для четырёх байтного значения

    Код (ASM):
    1.  
    2. .data?
    3. buffer byte 128 dup(?)
    4. .code
    5.  
    6. lea edi,buffer     ; Указатель на буфер-приемник
    7. mov eax,123456789  ; двойное слово
    8. mov ebx,10         ; основание системы счисления
    9. xor ecx,ecx        ; счетчик десятичных цифр
    10. @@:
    11. xor edx,edx
    12. div ebx
    13. or dl,'0'            ; Преобразовать результат в символ цифры
    14. push edx             ; Сохранить цифру в стеке
    15. inc ecx              ; Увеличить счетчик цифр
    16. or eax,eax           ; если (eax) не ноль переход на метку выше
    17. jnz @b
    18. @@:
    19. pop eax              ; Записать все цифры из стека в буфер
    20. stosb
    21. loop @b
    22.  
     
  7. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    assch, можешь использовать подсистему MMX, или в 64бит приложении тоже это примерно так же проделать. Есть способы универсальней - "long arithmetic", можешь реализовать сам, можешь какой-нибудь BigInteger подтянуть, где это уже реализовано.
     
  8. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    я могу ошибатся но MMX кажется заточена на работу с вещественными (плавающая точка) значениями
    а насчёт long arithmetic попробую поискать может быть и правда в тему
     
  9. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    MMX instructions operate on 8, 16, 32 or 64-bit integer values, packed into a 64-bit field
     
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    assch,

    Тогда если нужно число произвольной разрядности обработать, то придётся самостоятельно для этого алгоритмы реализовать. Если конкретно IA, то FPU может загружать 64-int: FILD m64int Push m64intonto the FPU register stack.
     
  11. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    А FPU как раз таки с вещественными числами работает.
     
  12. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    не много опоздал но всё равно выложу
    я пробовал работать с регистрами FPU
    но при работе с обычными целыми числами
    у них даже в четырёх байтовой зоне идут непонятки
    например если значение (12345) поделить на (10)
    tmp1=12345
    tmp2=10

    Код (ASM):
    1.  
    2. fild tmp1
    3. fild tmp2
    4. fdiv
    5. fist tmp
    6.  
    то в переменной (tmp) на выходе будет правильное значение (1234)
    а вот если первую переменную сделать по больше (123456)

    tmp1=123456
    tmp2=10

    Код (ASM):
    1.  
    2. fild tmp1
    3. fild tmp2
    4. fdiv
    5. fist tmp
    6.  
    то в переменной (tmp) на выходе будет не правильное значение (12346)
    хотя мы ожидаем что должно быть (12345)
    и соответственно чем больше тем ещё хуже результат
    хотя не исключено что что то не так делаю
    подозреваю что с XMM будет таже петрушка
     
  13. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Потому что fpu при конвертировании в целочисленное округляет (способ округления задан в control word, fstcw/fldcw). 123456 не кратно 10, поэтому остаток влияет на целочисленный результат. Такой петрушки в MMX быть не должно.
     
  14. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    у меня есть ещё один алгоритм для преобразования 8-байтного значения
    в текстовый вид числа и работает он хорошо
    этот алгоритм под капотом использует регистр (edx)
    исходя из представления (EDX:EAX = 7065532612345678h)

    Код (ASM):
    1.  
    2. .data
    3. tmp qword 7065532612345678h
    4. .code
    5.  
    6. lea ecx,tmp
    7. mov eax,[ecx]      ; Младшее двойное слово
    8. mov esi,[ecx+4]    ; Старшее двойное слово
    9. lea edi,buff       ; Указатель на буфер-приемник
    10. mov ebx,10         ; Основание системы счисления
    11. xor ecx,ecx        ; Счетчик десятичных цифр
    12. @@:
    13. xchg eax,esi
    14. xor edx,edx
    15. div ebx
    16. xchg esi,eax
    17. div ebx
    18. or dl,'0'
    19. push edx
    20. inc ecx
    21. or eax,eax
    22. jnz @b
    23. @@:
    24. pop eax
    25. stosb
    26. loop @b
    27.  
    зтот алгоритм из 8-байтного значения (7065532612345678h)
    правильно делает текстовый вид (8098970927874987640)
    но 7-байтное значение или 6-байтное значение или 5-байтное значение
    этот алгоритм не сможет правильно обработать а сможет только 8-байтное значение

    может быть в этом алгоритме нужно что то подправить
    чтобы он смог правильно обработать например 6-байтное значение
    но к сожелению пока не знаю что именно
    будем как говорится думать или искать алгоритмы в длинной арифметике
    или ещё раз покапаюсь в XMM
     
  15. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Код (ASM):
    1. mov eax,[ecx]      ; Младшее двойное слово
    2. movzx esi,WORD[ecx+4]    ; Старшее двойное слово
    2 старших байта esi должны быть нулями, 2 младших - старшими двумя от 6байтного значения. На этих 6 байтах свет клином сошелся? Они не кратны слову процессора.
     
  16. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    Дико извиняюсь в посте #16 оказывается я прописал алгоритм тот что и нужен
    он универсально обработает любое значение до 8-байт
    то есть 1-байтное,2-байтное и так далее до 8-байтного
    накладка скорее всего случилась по тому что
    раньше в алгоритме я не правильно делал инициализацию
    то есть я инициализировал регистры в лоб

    Код (ASM):
    1.  
    2. mov eax,12345678h      ; Младшее двойное слово
    3. mov esi,70655326h      ; Старшее двойное слово
    4.  
    а нужно было через память

    Код (ASM):
    1.  
    2. .data
    3. tmp qword 7065532612345678h
    4. .code
    5.  
    6. lea ecx,tmp
    7. mov eax,[ecx]      ; Младшее двойное слово
    8. mov esi,[ecx+4]    ; Старшее двойное слово
    9.  
    Думаю что тему наверное можно закрывать
    всем участникам темы большое спасибо

    Век живи век учись
     
  17. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Я кстате посмотрел как это сделано в PB https://www.purebasic.com/

    Почему именно он - там работа с математикой реализована чудесно, если нужно сделать сложные вычисления на fpu, то этот компилер даёт готовое. Оказывается что fpu не используется, обычная математика.
     
  18. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Много чего это делает без подсистем, обходясь длиной слова процессора. В оригинальном алгоритме, предложенном самими разработчиками RSA есть:
    Код (Text):
    1. NN_Digits
    2. NN_Cmp
    3. NN_RShift
    4. NN_LShift
    5. NN_Sub
    6. NN_Add
    7. NN_DigitBits
    8. NN_AssignZero
    9. NN_Assign
    10. NN_Mult
    11. NN_Div
    12. NN_Mod
    13. NN_ModMult
    14. NN_ModExp
    Это одна из немногих реализаций длинной арифметики "с нуля", без сторонних библиотек. Все эти функции оперируют с дайджестами - полями произвольной длины.
     
  19. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    f13nd,

    Удивишься наверно что 8-битные контроллеры использовали длинную математику, есчо задолго до того, как ты наверно смог ходить.
     
  20. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Я вот печенкой чуял, что так оно и есть. Поэтому не удивляюсь, когда вижу что клон 16-битного 8051 по имени сенслок может уможать дворды