Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: MCKSys Argentina en 8 Febrero 2010, 05:50 am



Título: Equivalencia de __ftol2_sse en MASM
Publicado por: MCKSys Argentina en 8 Febrero 2010, 05:50 am
Hola!

Estoy pasando un código de VC 2008 a MASM y me he encontrado con lo siguiente:
Código:
FLD QWORD PTR SS:[EBP-24]
MOV ESI,EAX
CALL 20375090 ;__ftol2_sse
CDQ

Según tengo entendido, esta función se encarga de convertir un Float en Dword. El problema es que no encuentro ninguna macro o función que me permita hacer lo mismo que hace esta función en MASM.

¿ Alguien tiene alguna idea ?


Título: Re: Equivalencia de __ftol2_sse en MASM
Publicado por: Eternal Idol en 8 Febrero 2010, 08:07 am
Directo del WinDbg:
Código
  1. floating!_ftol2_sse:
  2. 00401260 833d7093420000  cmp     dword ptr [x!__sse2_available (00429370)],0 ds:0023:00429370=00000001
  3. 00401267 742d            je      x!_ftol2 (00401296)
  4. floating!_ftol2_pentium4:
  5. 00401269 55              push    ebp
  6. 0040126a 8bec            mov     ebp,esp
  7. 0040126c 83ec08          sub     esp,8
  8. 0040126f 83e4f8          and     esp,0FFFFFFF8h
  9. 00401272 dd1c24          fstp    qword ptr [esp]
  10. 00401275 f20f2c0424      cvttsd2si eax,mmword ptr [esp]
  11. 0040127a c9              leave
  12. 0040127b c3              ret

De igual manera podes encontrar _ftol2.


Título: Re: Equivalencia de __ftol2_sse en MASM
Publicado por: MCKSys Argentina en 8 Febrero 2010, 21:52 pm
Gracias Ethernal Idol!!

Aunque ya habia hecho una implementación en base a OllyDbg.

Me quedó asi:

Código:
ftol2 proc  

; local tmp:DWORD

; fistp tmp
; mov eax, tmp
; ret



    push ebp
    mov ebp,esp
    sub esp,020h
    and esp,0fffffff0h
    fld st
    fst dword ptr ss:[esp+018h]
    fistp qword ptr ss:[esp+010h]
    fild qword ptr ss:[esp+010h]
    mov edx,dword ptr ss:[esp+018h]
    mov eax,dword ptr ss:[esp+010h]
    test eax,eax
    je @Converte_20375125

@Converte_203750E9:

    fsubp st(1),st
    test edx,edx
    jns @Converte_2037510D
    fstp dword ptr ss:[esp]
    mov ecx,dword ptr ss:[esp]
    xor ecx,080000000h
    add ecx,07fffffffh
    adc eax,0
    mov edx,dword ptr ss:[esp+014h]
    adc edx,0
    jmp @Converte_20375139

@Converte_2037510D:

    fstp dword ptr ss:[esp]
    mov ecx,dword ptr ss:[esp]
    add ecx,07fffffffh
    sbb eax,0
    mov edx,dword ptr ss:[esp+014h]
    sbb edx,0
    jmp @Converte_20375139

@Converte_20375125:

    mov edx,dword ptr ss:[esp+014h]
    test edx,07fffffffh
    jnz @Converte_203750E9
    fstp dword ptr ss:[esp+018h]
    fstp dword ptr ss:[esp+018h]

@Converte_20375139:

    leave
    retn                                     ;<= Procedure End
ftol2 endp

(Es el código que viene luego del Je tuyo de 401267, es por si la PC no tiene SSE2)

De todas formas, nuevamente, Gracias  ;D

PD: Lo comentado es una versión "reducida", pero tiene falencias...  :silbar:


Título: Re: Equivalencia de __ftol2_sse en MASM
Publicado por: Eternal Idol en 8 Febrero 2010, 21:59 pm
De nada y si como te decia de igual manera podias encontrar _ftol2.