[Ответить в тред] Ответить в тред

02/12/16 - Конкурс визуальных новелл доски /ruvn/
15/11/16 - **НОВЫЙ ФУНКЦИОНАЛ** - Стикеры
09/10/16 - Открыта доска /int/ - International, давайте расскажем о ней!



Новые доски: /2d/ - Аниме/Беседка • /wwe/ - WorldWide Wrestling Universe • /ch/ - Чатики и конфочки • /int/ - International • /ruvn/ - Российские визуальные новеллы • /math/ - Математика • Создай свою

[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 4 | 1 | 4
Назад Вниз Каталог Обновить

fpu Аноны, поясните за ассемблер # OP  02/12/16 Птн 15:56:09  886362  
Сап, програмач!
Приспичило тут научится в асмблер

Нужно:
вычислить значение функции и вывести типа точки (x, y)
вот.

Что не выходит:
После успешных вычислений функции на фпу результат нужно вывести. вот.
я ожидал что
fst dword *
загрузит из st0 в виде флоат и printf сможет его напечатать..
но этого не происходит.

Вот упрощенный кусок кода

push 0
finit
fld1
fstp dword [esp]
pop eax

cinvoke printf, formatstr, eax

...
formatstr db '%f', 0ah, 0


Как здесь сделать чтоб напечаталась единичка?

Ах да: компилю фасмом на вин32


Аноним 02/12/16 Птн 17:06:02  886421
лучше всего сделать это на Visual Basic
Аноним 02/12/16 Птн 17:17:54  886426
>>886362 (OP)
Сишные конвенции, по-моему, ожидают флоаты в фпу. Ещё можешь wsprintf попробовать, она, по-моему, должна прямо так работать.
Аноним 02/12/16 Птн 19:47:48  886479
>>886362 (OP)
Во-первых, FPU на помойку, используй SIMD. Во-вторых, скомпилируй нужный код на си и посмотри в дизассемблере как оно должно быть. У тебя там какая-то хуйня вообще. Кто тебя так учил писать?
Аноним 03/12/16 Суб 06:19:51  886762
>>886362 (OP)
Дело в том, что из-за особенностей языка си нельзя передать float в функцию с переменным числом аргументов. Так как Си не знает, какого типа должен быть параметр, он кастит все целые меньше int к int, а float кастится в double. Соответственно, %f в printf хочет дабл. И ты должен сделать:
push 0
push 0
fld1
fstp qword[esp]
; тут можно сделать
; push formatstr
; call [printf]
; и потом компенсировать стек
; add esp,8+4
; или дрочить, как у тебя:
; взять кусочки
pop eax
pop edx
; и затолкать их обратно
cinvoke printf,formatstr,eax,edx

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 4 | 1 | 4
Назад Вверх Каталог Обновить

Топ тредов
Избранное