Работа с большими числами

Тема в разделе "WASM.BEGINNERS", создана пользователем Gonzzik, 8 мар 2007.

  1. Gonzzik

    Gonzzik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    61
    Сдравствуйте.
    У меня вопрос: как работать с большими целыми числами (64 бит)? Мне надо разделить два числа и вывести результат в wsprintf. Если незатруднит подсуетите пример.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    инструкция DIV вроде бы поддерживает задание операндов в двух регистрах (32+32 = 64 бит в сумме)
     
  3. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Хмм, а куда результат тогда быдет складываться? Надо ведь тогда 64 бита на часное и на остаток столько же.
    Жаль справочника под рукой нет, глянул бы... А то так что получается, для одной операции надо задействовать 4 регистра?
     
  4. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    А так вроде бы инструкции MMX работают с 64 битными операндами.
     
  5. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Сам задумался над этим вопросом.

    Мой VC 6.0 при работе с числами типа __INT64 вызывает ф-ю из CRT.

    Вот как вызывает и забирает результат:
    Код (Text):
    1. ; 22   :    c=a/b;
    2.  
    3.   00052 8b 45 f4     mov     eax, DWORD PTR _b$[ebp+4]
    4.   00055 50       push    eax
    5.   00056 8b 4d f0     mov     ecx, DWORD PTR _b$[ebp]
    6.   00059 51       push    ecx
    7.   0005a 8b 55 fc     mov     edx, DWORD PTR _a$[ebp+4]
    8.   0005d 52       push    edx
    9.   0005e 8b 45 f8     mov     eax, DWORD PTR _a$[ebp]
    10.   00061 50       push    eax
    11.   00062 e8 00 00 00 00   call    __alldiv
    12.   00067 89 45 e8     mov     DWORD PTR _c$[ebp], eax
    13.   0006a 89 55 ec     mov     DWORD PTR _c$[ebp+4], edx
    а вот код самой ф-и:
    http://research.microsoft.com/invisible/src/crt/md/i386/_lldiv.c.htm

    там подробно с комментами.
    Эту должно работать на всех i386 и выше.
     
  6. MrKreazy

    MrKreazy New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2006
    Сообщения:
    19
    Может так:
    Bigval_1 dw 0,0
    bigval_2 dw 0,0
    bigval_3 dw 0,0
    сложение
    mov eax,dword ptr bigval_1
    add eax,dword ptr bigval_2
    mov dword ptr bigval_3,eax
    mov eax,dword ptr bigval_1[4]
    adc eax,dword ptr bigval_2[4]
    mov dword ptr bigval_3[4],eax
    вычитание - аналогично с помощью sbb
    /см Зубкова/
     
  7. Gonzzik

    Gonzzik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    61
    Я думаю надо копать в сторону SSE
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Gonzzik
    А это ещё зачем?
    Проблема в том что SSE c целыми числами есть только начиная с P4.
    Проще вспомнить школьную математику (деление столбиком например) и самому написать.
    Когда-то давно писал подобные функции для чисел любого размера (4 операции +, -. *. /), а также вывода на экран под Дос. Ничего сложного нет, советую поднапрячь серое вещество -).
     
  9. Gonzzik

    Gonzzik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    61
    Я новичек.. не представляю как это сделать. В алгоритме использую ммх. Нужно разделить значение регистра mm0 на mm1 в которых находятся 8-ми байтовые числа. Результат деления нужен преблизительный, например только целое, после запятой все можно откинуть.
    Буду очень признателен за помощь!
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Gonzzik
    А зачем тогда mmx, imho лучше FPU.
    Но если сам сделаешь целочисленную функцию, то будет быстрее.
     
  11. Gonzzik

    Gonzzik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    61
    ..а разве фпу работает с целыми 8-байтовыми числами?
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
  13. Gonzzik

    Gonzzik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    61
    Вот пытаюсь сделать сие на Fasm:
    Код (Text):
    1. .data
    2.   Out1                dq ?
    3.   Long1               dq 20000000000
    4.   Long2               dq 10000000000
    5.  
    6.   fmt db '%d',0                          ;формат превращения
    7.   buf db 100 dup (?)                     ;резервирую буфер для вывода
    8.  
    9. .code
    10.   start:
    11.  
    12.         FILD     qword[Long1]           ;Загружаю целое 8-байт Long1
    13.         fidiv    qword[Long2]           ;пытаюсь разделить на целое Long2
    14.  
    15.         fist    dword[Out1]
    16.         mov     eax,dword[Out1]
    17.  
    18.         invoke  wsprintf, buf, fmt,eax
    19.         invoke  MessageBox,0,buf,0,0
    20.   @exit:
    21.         invoke  ExitProcess,0
    fidiv - нехочет принимать qword, в чем ошибка? ...как реализовать деление?
     
  14. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    FPU - floating poin unit
    Соответственно и операции в этом юните тоже над числами с плавающей точкой, поэтому пиши fdiv, а с целыми числами - загрузка и сохранение. fistp пиши вконце.
     
  15. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    asmfan
    Не всё столь категорично - FIDIV рулит, просто не поддерживает 64 битную "экзотику" ;)

    Gonzzik
    Для 64 битного случая
    Код (Text):
    1.      FILD   qword[Long1]
    2.      FILD   qword[Long2]
    3.      FDIVP ST1, ST           ; [Long1]/[Long2],   [Long2] выкинуть из FPU стека
    4.      FISTP  dword[Out1]    ; или qword[Out1] тут уж что нравится :)
    А как qword строкой сделать PaCHER писал
     
  16. Gonzzik

    Gonzzik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    61
    Y_Mur респект и уважуха!
     
  17. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Y_Mur и точно), просто сам такую никогда не пользовал, хотя смысл команды как я и думал:
     
  18. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    asmfan
    Самое смешное, что справку для Gonzzik давал, на основе твоей справки ;)))
     
  19. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    И вовсе она не моя) Это всё добрые люди по всему интернету ими (help'ами) щедро делятся... за что им ооогромное спасибо всем.