Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.170.183] |
|
Сообщ.
#1
,
|
|
|
;Имеем 2 дробных числа с фиксированной "запятой"
;dig1 dd 0,0 ;dig2 dd 0,0 ;res qd 0,0,0,0 - итог арифметической операции ;buf db 10 dup (0) - набранное на дисплее число В соответствии с источником, арифметическую операцию (например - сложения) можно провести с помощью команд сопроцессора: ... ;копируем каждое число с дисплея в переменную: push eax movzx eax,buf mov dig,eax pop eax ... ;складываем числа: finit fld dig1 fld dig2 fadd fstp res ... push offset buf push [hedt] call SetWindowTextA@8 ret ... Подскажите, как можно передать число из "res" в "buf", для вывода на дисплей? |
Сообщ.
#2
,
|
|
|
Для значений с фиксированной запятой FPU не нужен.
|
Сообщ.
#3
,
|
|
|
Цитата cupoma58 @ В соответствии с источником, арифметическую операцию (например - сложения) можно провести с помощью команд сопроцессора С каким источником? Фиксированную точку для того и придумали, что над числами с фиксированной точкой работают целочисленные команды. Как Qraizer уже ответил - FPU не нужен. FLD загрузит в FPU не то что ты ожидаешь. |
Сообщ.
#4
,
|
|
|
Обычные целые числа – это числа без запятых (даже фиксированных). Для них используются обычные mov, add, sub и пр.
Если говорить о фиксированных, то тут есть варианты. В зависимости от операции и от того, как эта точка представлена. К примеру. 4 байта, 2 старших байта - целая часть, 2 младших - дробная. Складываем просто: mov eax,X add eax,Y ; результат в eax А вот с умножением будет уже чуть позамороченнее: mov eax,X imul Y ; или mul Y для беззнакового умножения, результат в edx:eax shrd eax,edx,16 ; 2 младших байта eax нам не нужны, а 2 старших байта edx будут утеряны, если результат превысит допустимые границы Для упрощения можно использовать FPU, но тогда нужно будет умножать и делить числа и результат на 65536, например. Умножение: push X push Y push dword ptr 65536 fild dword ptr [esp+8] ; X fdiv dword ptr [esp] ; /65536 fild dword ptr [esp+4] ; Y fdiv dword ptr [esp] ; /65536 fmulp fmul dword ptr [esp] ; *65536 fistp Result add esp,12 push X push Y push dword ptr 65536 fild dword ptr [esp+8] ; X fmul dword ptr [esp+4] ; Y fdiv dword ptr [esp] ; /65536 fistp Result add esp,12 |
Сообщ.
#5
,
|
|
|
Цитата Jin X @ Обычные целые числа – это числа без запятых (даже фиксированных). Для них используются обычные mov, add, sub и пр. Если говорить о фиксированных, то тут есть варианты. В зависимости от операции и от того, как эта точка представлена. К примеру. 4 байта, 2 старших байта - целая часть, 2 младших - дробная. Складываем просто: mov eax,X add eax,Y ; результат в eax А вот с умножением будет уже чуть позамороченнее: mov eax,X imul Y ; или mul Y для беззнакового умножения, результат в edx:eax shrd eax,edx,16 ; 2 младших байта eax нам не нужны, а 2 старших байта edx будут утеряны, если результат превысит допустимые границы Для упрощения можно использовать FPU, но тогда нужно будет умножать и делить числа и результат на 65536, например. Умножение: push X push Y push dword ptr 65536 fild dword ptr [esp+8] ; X fdiv dword ptr [esp] ; /65536 fild dword ptr [esp+4] ; Y fdiv dword ptr [esp] ; /65536 fmulp fmul dword ptr [esp] ; *65536 fistp Result add esp,12 push X push Y push dword ptr 65536 fild dword ptr [esp+8] ; X fmul dword ptr [esp+4] ; Y fdiv dword ptr [esp] ; /65536 fistp Result add esp,12 Тема закрыта, благодарю. |