Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с большими числами... 8-ми байтные числа 
:(
    Опции темы
Lеstat
Дата 9.2.2007, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 28.12.2005
Где: Москва

Репутация: нет
Всего: нет



Возникла необходимость провернуть четыре основные математические операции с огромными числами
числа 8-ми байтные... 
бегая в поиске инфы я наткнулся на то, что нужно использовать флаги переноса для создания цепочки регистров под свое число.
почитав о флаге переноса вычитал, что этот флаг служит для переноса единички, если число не влезло в регистр, но толком не понял как с этим работать. 
Как собрать цепочку регистров и как с ней работать?
Нету ли где-нибудь примера работы с большими числами? 
как провернуть сложение двух 8-ми байтных числа к примеру?
еще вот тонкость...  к примеру мы умножаем два 8-ми байтных числа, насколько я понимаю, можем получить 16 байтное число! куда же его... в умной книге было написано, что регистров всего 16, юзать все нельзя... регистров-то хватит?
Буду благодарен за любую информацию! 
PM MAIL ICQ   Вверх
W4FhLF
Дата 9.2.2007, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



Ну во-первых числа делятся на целые и вещественные, расширенный формат вещественного числа может хранить значения от 10^-4932 до 10^4932. Если речь идёт о целых числах, то в природе существуют команды mmx расширения и регистры этого набора команд имеют размерность 64 бита(8 байт), одной командой ты можешь складывать, вычитать, умножать и делить эти числа. Если же ты хочешь ограничиться основным набором команд для целочисленных вычислений, то при работе с 64 разрядными числами следует учитывать флаг переноса(CF, я так понял о нём ты уже слышал), просто прочти справку по командам: adc, sbb, imul, idiv. 

Это сообщение отредактировал(а) W4FhLF - 9.2.2007, 10:05


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Lеstat
Дата 22.3.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 28.12.2005
Где: Москва

Репутация: нет
Всего: нет



Складывать и умножать уже научился... 
Подскажите алгоритм деления пожалуйста... 
числа целые в 8 байт, беззнаковые... в проге могу юзать только 16-ти разрядные регистры... проц 8086

вот как умножать получилось если кому в будущем понадобится: 
Код

a dw 1010110110111100b, 1101110111011101b, 1100110010110101b, 0011001110101011b  
b dw 0010001110101011b, 0101011000010010b, 0011010001101000b, 1001110010111101b              
c dw 8 dup (0) 


    ;======================== 4 slovo
    mov AX, a[6]
    mul b[6]    
    add c[14], AX
    adc c[12], DX
    adc c[10], 0
    
    mov AX, a[4]
    mul b[6]
    add c[12], AX   
    adc c[10], DX 
    adc c[8], 0
    
    mov AX, a[2]
    mul b[6]
    add c[10], AX   
    adc c[8], DX 
    adc c[6], 0    
    
    mov AX, a[0]
    mul b[6]
    add c[8], AX   
    adc c[6], DX 
    adc c[4], 0     
    
    ;======================== 3 slovo 
    mov AX, a[6]
    mul b[4]    
    add c[12], AX
    adc c[10], DX
    adc c[8], 0
    
    mov AX, a[4]
    mul b[4]
    add c[10], AX   
    adc c[8], DX 
    adc c[6], 0
    
    mov AX, a[2]
    mul b[4]
    add c[8], AX   
    adc c[6], DX 
    adc c[4], 0    
    
    mov AX, a[0]
    mul b[4]
    add c[6], AX   
    adc c[4], DX 
    adc c[2], 0 
    
    ;======================== 2 slovo 
    mov AX, a[6]
    mul b[2]    
    add c[10], AX
    adc c[8], DX 
    adc c[6], 0
    
    mov AX, a[4]
    mul b[2]
    add c[8], AX   
    adc c[6], DX 
    adc c[4], 0
    
    mov AX, a[2]
    mul b[2]
    add c[6], AX   
    adc c[4], DX 
    adc c[2], 0    
    
    mov AX, a[0]
    mul b[2]
    add c[4], AX   
    adc c[2], DX 
    adc c[0], 0   
    
    ;======================== 1 slovo 
    mov AX, a[6]
    mul b[0]    
    add c[8], AX
    adc c[6], DX
    adc c[4], 0
    
    mov AX, a[4]
    mul b[0]
    add c[6], AX   
    adc c[4], DX 
    adc c[2], 0
    
    mov AX, a[2]
    mul b[0]
    add c[4], AX   
    adc c[2], DX 
    adc c[0], 0    
    
    mov AX, a[0]
    mul b[0]
    add c[2], AX   
    adc c[0], DX 

понимаю... без циклов не очень, но кое как работает
помогите алгоритмом деления плз!
пробую делить "как на бумаге руками", но не получается
выскакивает "divide overflow"
как с этим бороться можно? нужно к примеру DX:AX  -  FFFFh:FFFFh разделить на слово 0001h
частное в AX ну никак не влезает... что с этим делать?
PM MAIL ICQ   Вверх
Akina
Дата 22.3.2007, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Используй сдвиговое деление вычитанием... для этого напиши процедуры LongCompare и LongShift, a LongAdd и LongSub у тебя, как я понимаю, уже есть.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.