Сдравствуйте. У меня вопрос: как работать с большими целыми числами (64 бит)? Мне надо разделить два числа и вывести результат в wsprintf. Если незатруднит подсуетите пример.
Хмм, а куда результат тогда быдет складываться? Надо ведь тогда 64 бита на часное и на остаток столько же. Жаль справочника под рукой нет, глянул бы... А то так что получается, для одной операции надо задействовать 4 регистра?
Сам задумался над этим вопросом. Мой VC 6.0 при работе с числами типа __INT64 вызывает ф-ю из CRT. Вот как вызывает и забирает результат: Код (Text): ; 22 : c=a/b; 00052 8b 45 f4 mov eax, DWORD PTR _b$[ebp+4] 00055 50 push eax 00056 8b 4d f0 mov ecx, DWORD PTR _b$[ebp] 00059 51 push ecx 0005a 8b 55 fc mov edx, DWORD PTR _a$[ebp+4] 0005d 52 push edx 0005e 8b 45 f8 mov eax, DWORD PTR _a$[ebp] 00061 50 push eax 00062 e8 00 00 00 00 call __alldiv 00067 89 45 e8 mov DWORD PTR _c$[ebp], eax 0006a 89 55 ec mov DWORD PTR _c$[ebp+4], edx а вот код самой ф-и: http://research.microsoft.com/invisible/src/crt/md/i386/_lldiv.c.htm там подробно с комментами. Эту должно работать на всех i386 и выше.
Может так: 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 /см Зубкова/
Gonzzik А это ещё зачем? Проблема в том что SSE c целыми числами есть только начиная с P4. Проще вспомнить школьную математику (деление столбиком например) и самому написать. Когда-то давно писал подобные функции для чисел любого размера (4 операции +, -. *. /), а также вывода на экран под Дос. Ничего сложного нет, советую поднапрячь серое вещество -).
Я новичек.. не представляю как это сделать. В алгоритме использую ммх. Нужно разделить значение регистра mm0 на mm1 в которых находятся 8-ми байтовые числа. Результат деления нужен преблизительный, например только целое, после запятой все можно откинуть. Буду очень признателен за помощь!
Gonzzik А зачем тогда mmx, imho лучше FPU. Но если сам сделаешь целочисленную функцию, то будет быстрее.
Вот пытаюсь сделать сие на Fasm: Код (Text): .data Out1 dq ? Long1 dq 20000000000 Long2 dq 10000000000 fmt db '%d',0 ;формат превращения buf db 100 dup (?) ;резервирую буфер для вывода .code start: FILD qword[Long1] ;Загружаю целое 8-байт Long1 fidiv qword[Long2] ;пытаюсь разделить на целое Long2 fist dword[Out1] mov eax,dword[Out1] invoke wsprintf, buf, fmt,eax invoke MessageBox,0,buf,0,0 @exit: invoke ExitProcess,0 fidiv - нехочет принимать qword, в чем ошибка? ...как реализовать деление?
FPU - floating poin unit Соответственно и операции в этом юните тоже над числами с плавающей точкой, поэтому пиши fdiv, а с целыми числами - загрузка и сохранение. fistp пиши вконце.
asmfan Не всё столь категорично - FIDIV рулит, просто не поддерживает 64 битную "экзотику" Gonzzik Для 64 битного случая Код (Text): FILD qword[Long1] FILD qword[Long2] FDIVP ST1, ST ; [Long1]/[Long2], [Long2] выкинуть из FPU стека FISTP dword[Out1] ; или qword[Out1] тут уж что нравится :) А как qword строкой сделать PaCHER писал
И вовсе она не моя) Это всё добрые люди по всему интернету ими (help'ами) щедро делятся... за что им ооогромное спасибо всем.