![]() |
|
|
![]()
|
|
| Ruterian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 9.1.2004 Где: Вязьма, Минск Репутация: нет Всего: нет |
Возникла задача вычисления некого параметра на ASM. В частности, определить объем винта в Мб по формуле C*H*S*512/1024/1024:
3462h*0fh*3fh*200h/10000h=6187(DEC). Полученный результат ghtlcnfdbnm с точнотью до единиц Мб. Как наиболее правильно это сделать? |
|||
|
||||
| Ruterian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 9.1.2004 Где: Вязьма, Минск Репутация: нет Всего: нет |
ghtlcnfdbnm = представить :-)
|
|||
|
||||
| acp |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 389 Регистрация: 4.2.2003 Где: Владимир Репутация: нет Всего: 2 |
Вообщем-то 6187 влезает в word двухбайтный. А div работает отлично и со словами, и с двойными словами.
|
|||
|
||||
| Ruterian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 9.1.2004 Где: Вязьма, Минск Репутация: нет Всего: нет |
acp
я и без такого "ответа" знаю, как работает DIV. Неужели вы думаете, что я тут от безделья спрашиваю, чтоб довольствоваться такими вот отписками??? http://www.graphics.com.ua/files/pauk.html? Это сообщение отредактировал(а) Ruterian - 6.2.2004, 20:54 |
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 7 Всего: 34 |
Ruterian
не вижу проблемы че ты 3 раза умножить и 1 раз поделить не можеш или че? результат и будет с точностью до еденицы мб -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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. |
|||
|
||||
| Serzh |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 30.9.2003 Где: SPb Репутация: нет Всего: нет |
а не проще ли для начала упростить формулу?
имеем - C*H*S*512/1024/1024 упрощаем - C*H*S*/2048 теперь умножаем целиндры на головки и на сектора и делаем сдвиг вправа на 11 бит. получаем диапазон чисел от 0 до 2 терробайт. и это не пользуясь edx:eax думаю, что на первое время 2 терробайт хватит! |
|||
|
||||
| Ruterian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 9.1.2004 Где: Вязьма, Минск Репутация: нет Всего: нет |
Serzh
> упрощаем - C*H*S*/2048 На 10000h надо делить %-) |
|||
|
||||
| Serzh |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 30.9.2003 Где: SPb Репутация: нет Всего: нет |
дык да! но умножать та на 512(200h) еще! значит делим на 800h = 2048 |
|||
|
||||
| Serzh |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 30.9.2003 Где: SPb Репутация: нет Всего: нет |
э!!!
с какого перепуга 10000h? 1024*1024 = 1048576 = 100000h |
|||
|
||||
| Ruterian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 9.1.2004 Где: Вязьма, Минск Репутация: нет Всего: нет |
ну ощипся маленько, на нолик всего
|
|||
|
||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |