Ассемблер под Windows №19

Hex2Dec или FPU халява


Доброго времени суток, уважаемые подписчики.


Уверен многие из Вас, кто уже делал какую либо программу, работающую с числами, столкнулся с проблемой перевода чисел в разные системы исчисления (в нашем случае 16-ные и 10-ные числа). Придумано много алгоритмов, выполняющих эти преобразования, но я предпочитаю использовать средства FPU (можете меня осудить). Почему? Сопроцессор выполняет всё за нас, код занимает мало места, ошибок практически не возникает.

Я уверен, что многие из Вас достаточно хорошо знакомы с FPU, но лучше я опишу нужные нам возможности для полного понимания. FPU работает со следующими тремя типами данных (вернее может преобразовать один из них в два других):
- 16-ные целые числа в 16, 32 и 64 бита
- 16-ные числа с плавающей запятой в 32, 64 и 80 бит
- 10-ные числа в 80 бит
При загрузки в регистр сопроцессора число не зависимо от формата преобразовывается в 80 битное 16-ное число с плавающей запятой, а при сохранении регистра в память мы можем сами выбрать нужный нам тип. Я думаю, более легкого способа для выполнения нашего задание нет. Единственное что нам нужно знать это следующие команды:
fild (FPU integer load) - Загружает целое 16-ное число.
fbld (FPU BCD-packed load)- Загружает целое 10-ное число.
fistp (FPU integer save top push)- Считывает целое 16-ное число
fbstp (FPU BCD-packed save top push)- Считывает целое 10-ное число

Сам код двух процедур следующий:
DecToHexDwordproc
push ebp
mov ebp,esp
push 0
push 0
push 0;локальная переменная в 10 байт (10+2 для ровности) равная 0
mov eax,[ebp+08h]
mov [ebp-0ch],eax;Загружаем в младшее слово наше 10-ное число
fbld [ebp-0Ch];Передаём его сороцессору
fistp dword ptr [ebp-04h];Считываем переданное число как 16-ное
mov eax,[ebp-04h];Возвращаем его
leave
ret 4
DecToHexDwordendp
HexToDecDwordproc
push ebp
mov ebp,esp
sub esp,0ch;локальная переменная в 10 байт (10+2 для ровности)
fild dword ptr [ebp+08h];Загружаем в младшее слово наше 16-ное число
fbstp [ebp-0ch];Считываем переданное число как 10-ное
mov eax,[ebp-0ch];Возвращаем его
leave
ret 4
HexToDecDwordendp

Думаю в большем количестве коментариев этот пример не нуждается.


Если у Вас есть какие-либо вопросы по ассемблеру или по программированию под Windows, ответы на которые, как вы думаете, были бы интересны и полезны всем, то пришлите Ваш вопрос с темой "Вопрос". Я постараюсь на него ответить и с удовольствием добавлю в рассылку.


На сегодня это всё. Если есть какие вопросы, пишите. Пишите на Dark_Lord@RusFAQ.ru или Dark_Lord@land.ru.
Или свяжитесь со мной по ICQ, мой номер 126222874!

Сайт управляется системой uCoz