· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.HELHEIM —› visual c++, asm & sin

Посл.отвђт Сообщенiе


Дата: Май 25, 2004 00:41:16

Помогите плиз, надо функция синуса, а я в асме через жестокий пень-колоду. Вот что-то нарыл, но ОНО ессно не работает...
double __stdcall _sin(double _value) 
{ 
	_asm {
		fld _value
        fsin
        ret 8
	}
}


Дата: Май 25, 2004 03:43:00

Surgeon
В чем выражается "ОНО ессно не работает"?


Дата: Май 25, 2004 10:24:13

Наверное в том, что синус не щитает! :о)


Дата: Май 25, 2004 10:42:41

q_q
А должна работать? Процедурка правильная?


Дата: Май 25, 2004 10:48:02

Anonimka
Почему не считает, fsin есть?

Surgeon
А должна работать?
Да. Только не понимаю зачем ret 8, ты же не используешь __declspec(naked).


Дата: Май 25, 2004 13:32:38

q_q
Посмотри пожалуйста на код, я отсюда взял фукцию, но не уверен, как ее в си обернуть :( может имеет смысл компилить отдельно и линковать?
;               "Art" - a 64K demo by Farbrausch and Scoopex
;
;               RTLIB2.ASM - small math run time library replacement
;
;               Written by:
;   Ryg/FR, kb/FR - code

bits        32

section         .data
einhalb         dd 0.5

section         .text

; ---- sF64 sin(sF64 a)

global      _sin@8
_sin@8:
        fld             qword [esp+4]
        fsin
        ret             8

; ---- sF64 cos(sF64 a)

global      _cos@8
_cos@8:
        fld             qword [esp+4]
        fcos
        ret             8

; ---- sF64 asin(sF64 a)

global      _asin@8
_asin@8:
  fld   qword [esp+4]
        fld             st0
        fabs
        fcom    dword [einhalb]
        fstsw   ax
        sahf
        jbe             .kleiner
        fld1
        fsubrp  st1, st0
        fld             st0
        fadd    st0
        fxch    st1
        fmul    st0
        fsubp   st1, st0
        jmp             short .end

.kleiner:
        fstp    st0
        fld             st0
        fmul    st0
        fld1
        fsubrp  st1, st0
        
.end:
        fsqrt
        fpatan
        ret   8


; ---- sF64 acos(sF64 a)

global      _acos@8
_acos@8:
        fld             qword [esp+4]
        fld1
        fchs
        fcomp   st1
        fstsw   ax
        je              .suckt

        fld             st0
        fld1
        fsubrp  st1, st0
        fxch    st1
        fld1
        faddp   st1, st0
        fdivp   st1, st0
        fsqrt
        fld1
        jmp             short .end

.suckt:
        fld1
        fldz

.end:
        fpatan
        fadd    st0, st0
        ret             8

; ---- sF64 atan2(sF64 y, sF64 x)

global      _atan2@16
_atan2@16:
        fld             qword [esp+4]
        fld             qword [esp+12]
        fpatan
        ret             16
    
; ---- sF64 atan(sF64 a)

global          _atan@8
_atan@8:
        fld             qword [esp+4]
    fld1
    fpatan
    ret         8

; ---- sF64 sqrt(sF64 a)

global      _sqrt@8
_sqrt@8:
        fld             qword [esp+4]
        fsqrt
        ret             8

; ---- sF64 pow(sF64 a, sF64 b)

global      _pow@16
_pow@16:
        fld         qword [esp+12]
        fld             qword [esp+4]
        ftst
        fstsw   ax
        sahf
        jz              .zero

        fyl2x
        fld1
        fld             st1
        fprem
        f2xm1
        faddp   st1, st0
        fscale

.zero:
        fstp    st1
        ret             16
    
; ---- sF64 tan(sF64 a)

global          _tan@8
_tan@8:
        fld             qword [esp+4]
    fptan
    ret         8
    
; ---- float->int
global          __ftol
__ftol:
        sub             esp, byte 8
        fistp   qword [esp]
        pop             eax
        pop             edx
        ret


global __chkesp
__chkesp:
  ret


Дата: Май 26, 2004 07:28:16

Surgeon
В принципе правильно, только ret 8 не надо.
Поясни, как ты определяешь неработоспособность кода и зачем нужна обертка? Например, мой компилятор, вызов функции sin меняет на пару fld и fsin.


Дата: Май 26, 2004 12:07:48

q_q
sin требует линковки libc.lib? А я извращаюсь с маленькими ехе файлами. Спасибо за помощь, все работает! Я просто затупил, там ведь радианы, а я ждал ответа в градусах :)
double _sin(double _a)
{
	__asm {
		fld qword ptr _a
		fsin 
	}
}


Дата: Май 27, 2004 11:56:49

Surgeon
sin требует линковки libc.lib?
Наверное, это зависит от версии компилятора.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.094