Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интересно, а как производить арифметические, вычисления с большими числами..? 
:(
    Опции темы
Ruterian
Дата 5.2.2004, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

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



Возникла задача вычисления некого параметра на ASM. В частности, определить объем винта в Мб по формуле C*H*S*512/1024/1024:

3462h*0fh*3fh*200h/10000h=6187(DEC). Полученный результат ghtlcnfdbnm с точнотью до единиц Мб. Как наиболее правильно это сделать?
PM MAIL WWW ICQ   Вверх
Ruterian
Дата 5.2.2004, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

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



ghtlcnfdbnm = представить :-)
PM MAIL WWW ICQ   Вверх
acp
Дата 6.2.2004, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 4.2.2003
Где: Владимир

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



Вообщем-то 6187 влезает в word двухбайтный. А div работает отлично и со словами, и с двойными словами.
PM WWW ICQ   Вверх
Ruterian
Дата 6.2.2004, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

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



acp

я и без такого "ответа" знаю, как работает DIV. Неужели вы думаете, что я тут от безделья спрашиваю, чтоб довольствоваться такими вот отписками??? http://www.graphics.com.ua/files/pauk.html?

Это сообщение отредактировал(а) Ruterian - 6.2.2004, 20:54
PM MAIL WWW ICQ   Вверх
oleg1973
Дата 6.2.2004, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

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



Ruterian
не вижу проблемы
че ты 3 раза умножить и 1 раз поделить не можеш или че?
результат и будет с точностью до еденицы мб


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 6.2.2004, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Проблема, как я понимаю, в том, что когда-то наступает момент, когда текущих разрядностей не хватает для новых данных ;)

Речь идет о целочисленном делении. Что мы имеем в cpu ?

1. 32-х битное деление dx:ax на [делитель]. Причем целое от деления должно влезть в ax.

2. 64-х битное edx:eax на [делитель 32]. То же самое, но числа гораздо больше. Можно смело использовать в дос с ключом .386

3. Регистры MMX. Сам не работал, но вроде они позволяют оперировать целыми числами разной разрядности до 80 бит. Но это немного сложнооо.

4. Последовательное деление. Пусть есть bx:cx:dx - 48-ми битное число, которое нужно делить на 16-ти битное в ax. Замечаем, что:

число = bx * 2^16 * 2^16 + cx * 2 ^ 16 + dx.

Что же происходит при делении ? Вот что:

число / ax = ( bx * 2^16 * 2^16 + cx * 2 ^ 16 + dx ) / ax =

= ( bx * 2^16 * 2^16 / ax ) + ( cx * 2 ^ 16 + dx ) / ax.

Второе слагаемое можно делить прямо сразу через деление dx:ax на делитель. Первое же можно делить так:

( (bx * 2^16) / ax ) * 2^16.

Ну и так далее. Этот алгоритм очень старый и много где описан. Наверняка.

5. Сопроцессор. Очень легко, возможна погрешность. Пусть есть два целых числа из 8-ми байт:

Number dq 1234567890Ah
Divisor dq 100000h
Res dd ?

Используя сопроцессор (ключ .8087 или .387 или любой старший .386) пишем:

fild qword ptr Number
fidiv qword ptr Divisor
fistp dword ptr Res

Обращаю внимание, что Res имеет размер dword. Это в связи с тем, что при загрузке данных в сопроцессор он их преобразует к одному общему формату 80-ти бит, поэтому можно было записать:

Number dw 1234h
Divisor dq 10h
Res dd ?

fild word ptr Number
fidiv qword ptr Divisor
fistp dword ptr Res



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Serzh
Дата 9.2.2004, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а не проще ли для начала упростить формулу?
имеем - C*H*S*512/1024/1024
упрощаем - C*H*S*/2048
теперь умножаем целиндры на головки и на сектора и делаем сдвиг вправа на 11 бит.
получаем диапазон чисел от 0 до 2 терробайт. и это не пользуясь edx:eax
думаю, что на первое время 2 терробайт хватит! smile.gif
PM MAIL WWW ICQ   Вверх
Ruterian
Дата 9.2.2004, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

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



Serzh

> упрощаем - C*H*S*/2048

На 10000h надо делить %-)
PM MAIL WWW ICQ   Вверх
Serzh
Дата 9.2.2004, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Ruterian @ 9.2.2004, 02:30)
Serzh

> упрощаем - C*H*S*/2048

На 10000h надо делить %-)

дык да! но умножать та на 512(200h) еще!
значит делим на 800h = 2048
PM MAIL WWW ICQ   Вверх
Serzh
Дата 9.2.2004, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



э!!!
с какого перепуга 10000h?confused.gif??
1024*1024 = 1048576 = 100000h

PM MAIL WWW ICQ   Вверх
Ruterian
Дата 9.2.2004, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

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



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

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

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


 




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


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

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