阅读:2698回复:14
在vxd里面可不可以进行浮点运算啊
我写了一个波形发生器的vxd驱动,
cpp代码段如下: #define DEVICE_MAIN #include \"boxing.h\" #include \"winioctl.h\" Declare_Virtual_Device(BOXING) #undef DEVICE_MAIN //#include \"D:\\Microsoft Visual Studio\\VC98\\Include\\math.h\" BoxingVM::BoxingVM(VMHANDLE hVM) : VVirtualMachine(hVM) {} BoxingThread::BoxingThread(THREADHANDLE hThread) : VThread(hThread) {} DWORD BoxingDevice::OnBoxingDeviceIoControl(PIOCTLPARAMS p) { switch (p->dioc_IOCtlCode) { case DIOC_OPEN:break; case DIOC_CLOSEHANDLE:break; case DIOC_SIN: { int x[512]; for(int i=0;i<512;i++) x=5*sin(65*(i-512/2)+2); } } return 0; } 现在的问题是编译的时候出了一些比较奇怪的错误boxing.OBJ : boxing.OBJ : error LNK2001: unresolved external symbol __ftol boxing.OBJ : error LNK2001: unresolved external symbol __CIsin 请问这个是怎么回事?怎么解决这个问题? 我查过msdn,好想说在vxd里面最好不要进行浮点运算,是这样吗? |
|
沙发#
发布于:2002-05-21 15:43
Do like this!
1.Define a global variable unsigned long _fltused = 0; 2. define a function sin/cos... //sin double sin(double x) { // sin double result; _asm { fld x fsin fstp result } return result; } //cos double cos(double x) { // cos double result; _asm { fld x fcos fstp result } return result; } |
|
板凳#
发布于:2002-05-21 16:02
?
这个是用ddk写的吗? 看得不是很明白 是对sin进行定义呢? |
|
地板#
发布于:2002-05-21 16:47
是汇编啦。
在C里面嵌入汇编语言。 等我仔细看看相关文档。 |
|
地下室#
发布于:2002-05-21 16:57
if u use CPP(vtoolsd), you can do like this:
1. extern \"C\" _fltused = 0; 2.dinfie an inline fun sin inline double sin(double x) { // sin double result; _asm { fld x fsin fstp result } return result; } 3.add it to your code! ............... double res; res = sin(3.14159/6);//30 degree ........... [编辑 - 5/21/02 by dazzy] |
|
5楼#
发布于:2002-05-21 22:36
if u use CPP(vtoolsd), you can do like this: 这个 _fltused=0 是做什么用的呀? |
|
6楼#
发布于:2002-05-22 14:29
The Microsoft linker will fail with symbol __fltused unresolved if you use floating point in a VxD. This global is normally taken from the compiler\'s runtime library. You can declare a global variable to resolve this as follows:
#ifdef __cplusplus extern \"C\" #endif DWORD _fltused = 0; |
|
7楼#
发布于:2002-05-22 14:31
Use services VMCPD_Get_Thread_State and VMCPD_Set_Thread_State to save and restore the FPU state (context).
|
|
8楼#
发布于:2002-05-22 14:52
fld x
fsin fstp result 这三条是什么指令啊? 能解释一下吗? |
|
9楼#
发布于:2002-05-22 17:22
fld x ;加载x于当前浮点栈顶 fsin ;对当前浮点栈顶的数进行sin运算,运算的结果放于当前浮点栈顶 fstp result; 将当前浮点栈顶的数放于result中。 BTW:建议你看一看关于浮点汇编的书! |
|
10楼#
发布于:2002-05-22 20:40
我也是今天才知道这几条指令 :P
|
|
11楼#
发布于:2002-05-22 21:05
明白了。
唉,每天都来这里看帖子,真是越看越发觉自己会的东西少啊。 |
|
12楼#
发布于:2002-05-23 08:31
但是知识又增加了呀。 :D
|
|
13楼#
发布于:2002-05-23 11:32
请推荐几本浮点汇编的书
|
|
14楼#
发布于:2002-05-23 18:21
每天都可以学到新东东哦
|
|
|