cance
驱动牛犊
驱动牛犊
  • 注册日期2002-03-15
  • 最后登录2002-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2698回复:14

在vxd里面可不可以进行浮点运算啊

楼主#
更多 发布于:2002-05-21 14:47
我写了一个波形发生器的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里面最好不要进行浮点运算,是这样吗?
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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;
}
cance
驱动牛犊
驱动牛犊
  • 注册日期2002-03-15
  • 最后登录2002-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-21 16:02
?
这个是用ddk写的吗?
看得不是很明白
是对sin进行定义呢?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-05-21 16:47
是汇编啦。
在C里面嵌入汇编语言。
等我仔细看看相关文档。
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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]
Alexander
驱动大牛
驱动大牛
  • 注册日期2002-02-04
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分-5分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-05-21 22:36
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]


这个 _fltused=0 是做什么用的呀?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分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;

arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分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).
cance
驱动牛犊
驱动牛犊
  • 注册日期2002-03-15
  • 最后登录2002-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-05-22 14:52
fld x
fsin
fstp result
这三条是什么指令啊?
能解释一下吗?
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-05-22 17:22

fld x
fsin
fstp result
这三条是什么指令啊?
能解释一下吗?


fld x ;加载x于当前浮点栈顶
fsin  ;对当前浮点栈顶的数进行sin运算,运算的结果放于当前浮点栈顶
fstp result; 将当前浮点栈顶的数放于result中。

BTW:建议你看一看关于浮点汇编的书!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-05-22 20:40
我也是今天才知道这几条指令 :P
Alexander
驱动大牛
驱动大牛
  • 注册日期2002-02-04
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分-5分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-05-22 21:05
明白了。
唉,每天都来这里看帖子,真是越看越发觉自己会的东西少啊。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2002-05-23 08:31
但是知识又增加了呀。 :D
guard2002
驱动中牛
驱动中牛
  • 注册日期2002-05-21
  • 最后登录2017-03-07
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望65点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-05-23 11:32
请推荐几本浮点汇编的书
sirroom
驱动大牛
驱动大牛
  • 注册日期2001-07-30
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望11点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-05-23 18:21
每天都可以学到新东东哦
111
游客

返回顶部