Hi !
I am a programming assembler beginner and i have never implemented an Assembler program in VC++.
Recently i found a program which i assume to be an assembler function. I'd like to test this function in VC++ but i absolutly don't know how to use an assembler code in VC++. It would be great if somebody would show me a way to make this prog run in VC++.
Thank you ! :confused:
code:
--------------------------------------------------------------------------------------------------------------
;extern "C" long double _cdecl exp (double x)
_asm
{
_exp PROC NEAR
PUBLIC _exp
FLDL2E
FLD QWORD PTR ; x
FMUL ; z = x*log2(e)
FIST DWORD PTR ; round(z)
SUB ESP, 12
MOV DWORD PTR , 0
MOV DWORD PTR , 80000000H
FISUB DWORD PTR ; z - round(z)
MOV EAX,
ADD EAX,3FFFH
MOV ,EAX
JLE SHORT UNDERFLOW
CMP EAX,8000H
JGE SHORT OVERFLOW
F2XM1
FLD1
FADD ; 2^(z-round(z))
FLD TBYTE PTR ; 2^(round(z))
ADD ESP,12
FMUL ; 2^z = e^x
RET
UNDERFLOW:
FSTP ST
FLDZ ; return 0
ADD ESP,12
RET
OVERFLOW:
PUSH 07F800000H ; +infinity
FSTP ST
FLD DWORD PTR ; return infinity
ADD ESP,16
RET
_exp ENDP
-----------------------------------------------------------------------------------------------------------------------------------
:confused:
I am a programming assembler beginner and i have never implemented an Assembler program in VC++.
Recently i found a program which i assume to be an assembler function. I'd like to test this function in VC++ but i absolutly don't know how to use an assembler code in VC++. It would be great if somebody would show me a way to make this prog run in VC++.
Thank you ! :confused:
code:
--------------------------------------------------------------------------------------------------------------
;extern "C" long double _cdecl exp (double x)
_asm
{
_exp PROC NEAR
PUBLIC _exp
FLDL2E
FLD QWORD PTR ; x
FMUL ; z = x*log2(e)
FIST DWORD PTR ; round(z)
SUB ESP, 12
MOV DWORD PTR , 0
MOV DWORD PTR , 80000000H
FISUB DWORD PTR ; z - round(z)
MOV EAX,
ADD EAX,3FFFH
MOV ,EAX
JLE SHORT UNDERFLOW
CMP EAX,8000H
JGE SHORT OVERFLOW
F2XM1
FLD1
FADD ; 2^(z-round(z))
FLD TBYTE PTR ; 2^(round(z))
ADD ESP,12
FMUL ; 2^z = e^x
RET
UNDERFLOW:
FSTP ST
FLDZ ; return 0
ADD ESP,12
RET
OVERFLOW:
PUSH 07F800000H ; +infinity
FSTP ST
FLD DWORD PTR ; return infinity
ADD ESP,16
RET
_exp ENDP
-----------------------------------------------------------------------------------------------------------------------------------
:confused:
Try this.
[size=12]__declspec(naked) long double _cdecl exp( double x )
{
__asm
{
fldl2e
fld qword ptr [esp+4] // x
fmul // z = x*log2(e)
fist dword ptr [esp+4] // round(z)
sub esp, 12
mov dword ptr [esp], 0
mov dword ptr [esp+4], 0x80000000
fisub dword ptr [esp+16] // z - round(z)
mov eax, [esp+16]
add eax, 0x3fff
mov [esp+8], eax
jle UNDERFLOW
cmp eax, 0x8000
jge OVERFLOW
f2xm1
fld1
fadd // 2^(z-round(z))
fld tbyte ptr [esp] // 2^(round(z))
add esp, 12
fmul // 2^z = e^x
ret
UNDERFLOW:
fstp st
fldz // return 0
add esp, 12
ret
OVERFLOW:
push 0x7F800000 // +infinity
fstp st
fld dword ptr [esp] // return infinity
add esp, 16
ret
}
}[/size]
HI !
thanks, i tried that and the compiler complains about dword and qword. Maybe I have to include some windows header files but which one. Does anybody have an assembler VC++ tutorial for me ?
thanks, i tried that and the compiler complains about dword and qword. Maybe I have to include some windows header files but which one. Does anybody have an assembler VC++ tutorial for me ?
The Function works in VC++ but the inline compiler complains about
error C2400: Inline-Assembler: Syntaxfehler in 'Erster Operand'; 'constant' gefunden
JLE SHORT UNDERFLOW
error C2400: Inline-Assembler: Syntaxfehler in 'Erster Operand'; 'constant' gefunden
JGE SHORT OVERFLOW
error C2400: Inline-Assembler: Syntaxfehler in 'Opcode'; 'constant' gefunden
UNDERFLOW:
FSTP ST
FLDZ //; return 0
ADD ESP,12
RET
error C2400: Inline-Assembler: Syntaxfehler in 'Opcode'; 'constant' gefunden
OVERFLOW:
PUSH 07F800000H //; +infinity
FSTP ST
FLD DWORD PTR //; return infinity
ADD ESP,16
RET
Who can help me ?
error C2400: Inline-Assembler: Syntaxfehler in 'Erster Operand'; 'constant' gefunden
JLE SHORT UNDERFLOW
error C2400: Inline-Assembler: Syntaxfehler in 'Erster Operand'; 'constant' gefunden
JGE SHORT OVERFLOW
error C2400: Inline-Assembler: Syntaxfehler in 'Opcode'; 'constant' gefunden
UNDERFLOW:
FSTP ST
FLDZ //; return 0
ADD ESP,12
RET
error C2400: Inline-Assembler: Syntaxfehler in 'Opcode'; 'constant' gefunden
OVERFLOW:
PUSH 07F800000H //; +infinity
FSTP ST
FLD DWORD PTR //; return infinity
ADD ESP,16
RET
Who can help me ?
what vc++ version are you using?
I tried it and it compiled fine.
Thanks to all !
It works ! And the function is extremly fast ....
My mistake was that i had a second function and i had included MATH.h in my program.
Without Math.h it compiled fine .....
Thanks again !
It works ! And the function is extremly fast ....
My mistake was that i had a second function and i had included MATH.h in my program.
Without Math.h it compiled fine .....
Thanks again !
Hi !
Can I export this function as an C Objectfile (*.obj) or is an assembler function C++ specific.
If it is possibe, how do I do it ?
Thanks !
Can I export this function as an C Objectfile (*.obj) or is an assembler function C++ specific.
If it is possibe, how do I do it ?
Thanks !