首页
社区
课程
招聘
[求助]fstcw与fnstcw指令到底有啥区别?
发表于: 2009-12-28 21:43 16180

[求助]fstcw与fnstcw指令到底有啥区别?

2009-12-28 21:43
16180
如果是写fstcw,那么编译后会变成wait + fnstcw,这个wait在这里有什么作用,如果不加这个wait是否会有造成什么后果?
翻过资料说wait就是检测一个什么test的状态,不知道是指哪个test?
我现在的需求是在某个函数的入口保存原FCW,然后将FCW设置为0x027F,出函数前恢复原FCW。设置FCW就是用fldcw指令,读取FCW不知道该用fstcw还是fnstcw比较好?虽然两者都可以完成任务,不过对于不了解的东西,总感觉不保险。
请各位大侠赐教……

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
有人知道吗?
2009-12-29 09:23
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
去下一个指令手册查一下吧。http://www.intel.com/products/processor/manuals/index.htm
2009-12-29 19:33
1
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
fstcw编译后变成wait+fnstcw,去掉wait是否会造成什么后果?我不认为这个问题通过查指令手册就可以解决。
2010-1-9 08:58
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
你查过吗!?
2010-1-9 22:03
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
只说wait、fnstcw干嘛用的,没说不用wait直接fnstcw会有什么后果。这么说你知道有什么后果了么,请讲?
2010-1-9 22:32
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
7
FSTCW指令与FNSTCW指令的区别如下
The FSTCW instruction checks for and handles pending unmasked floatingpoint
exceptions before storing the control word; the FNSTCW instruction does not.


WAIT指令的作用如下
Causes the processor to check for and handle pending, unmasked, floating-point exceptions before proceeding. (FWAIT is an alternate mnemonic for WAIT.)


所以可以认为FSTCW = WAIT + FNSTCW
去掉WAIT指令,就没有check for and handle pending, unmasked, floating-point exceptions

所以半道出家所言非虚,指令手册是好东西
2010-1-10 00:49
1
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
谢谢楼上的回答,如果楼主对浮点的异常及处理有疑问,请参考Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture ,前面给出的文档链接中有此文档。
2010-1-10 10:27
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
我知道“FSTCW = WAIT + FNSTCW”,但是我不知道去掉WAIT会有什么后果。
换句话说也就是,如果没有“check for and handle pending, unmasked, floating-point exceptions”,会有什么后果?
你认为看指令手册可以知道么?你已经看过了,那么现在你可以说出去掉WAIT有什么后果了么?
2010-1-10 17:42
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
10
没有检测及处理异常,你说会怎么样?
是不是还需要有人给你讲讲什么是异常以及处理器如何检测及处理异常的?
如果楼主不懂英文,强烈推荐你学习国人发明的强大编程语言------>易语言
2010-1-11 10:36
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
那么你的意思是,不加wait就有一定的概率会出浮点异常导致程序挂掉么,那么这个概率会在什么情况下产生?
我想我应该在你进行嘲讽之前先告诉你,只要浮点控制寄存器屏蔽了异常处理(也就是0x027F后面的0x7F),本来就是不会触发浮点异常。那么这个wait在这里还有意义么?另外,实际使用中,我并没有遇到因为少写一个wait导致浮点异常的,当然你也可以反驳那只是一个概率问题。
另外,如果fldcw设置浮点控制寄存器为0x0200,那么浮点除零、溢出等等运算都回触发异常,与是否曾经wait过有关。
最后你对易语言的了解实在是太可笑,你认为这问题扔到易语言上就可以找到答案么?
2010-1-11 11:10
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
“check for and handle pending, unmasked, floating-point exceptions”怎么理解?
是否是说浮点出了异常,并不会立刻反映到CPU上,而是有一个延时?然后wait的作用就是如果这个异常当时处于pending(挂起状态),并且是unmasked(未被屏蔽)的浮点异常,那么会等待这个异常被CPU接受后返回?如果不去wait,那么这个异常体现的时机会延后,而如果直接fldcw,这个异常可能会丢失呢?
2010-1-11 11:28
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
13
首先我并没有嘲讽你,只是从你的标题来看,我并不认为你知道你说你知道的。
另外我只是说,如果你不懂英文,才建议你去学易语言(这是有条件的),我并没有说我自己对易语言有深刻的了解,而且无论是现在或是将来,我都不会对它有深刻的了解,我也并没有把这个问题扔到易语言上。
没有fwait,就一定会出现pufe?这不是我说的,我也从来没有这样认为!
好吧,这个问题通过查阅Intel Manuals是无法解决的,建议楼主向Intel公司寻求技术支持!
2010-1-11 11:59
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
标题看不出来,那么顶楼的内容里面应该有“fstcw = wait + fnstcw”了吧?
此外,我并没有说你的意思“就是100%出现异常”,而是以“概率的形式”,并且是问号结尾,也就是揣摩而已,无需这么激动。
最后,我承认我英文不咋的,看看英文文档也无法做到100%不会误解其意义,不过同样我不认为易语言可以帮助我解决问题。而你的意思似乎也是如此,那么何必让我去研究一个你自己都不信任的易语言呢?
如果你的英文还行,并且你的耐心还在,那么我提前感谢你回答一下我12L对那段英文的理解是否存在错误。
2010-1-11 12:37
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
15
The assembler automatically inserts a WAIT for this purpose before the following instructions: FCLEX, FINIT, FSAVE, FSTCW, FSTENV, FSTSW. You can omit the WAIT by writing FNCLEX, etc. My tests show that the WAIT is unneccessary in most cases because these instructions without WAIT will still generate an interrupt on exceptions except for FNCLEX and FNINIT on the 80387. (There is some inconsistency about whether the IRET from the interrupt points to the FN.. instruction or to the next instruction).
Almost all other floating point instructions will also generate an interrupt if a previous floating point instruction has set an unmasked exception bit, so the exception is likely to be detected sooner or later anyway. You may insert a WAIT after the last floating point instruction in your program to be sure to catch all exceptions.

You may still need the WAIT if you want to know exactly where an exception occurred in order to be able to recover from the situation. Consider, for example, the code under b.3 above: If you want to be able to recover from an exception generated by the FLD here, then you need the WAIT because an interrupt after ADD ESP,8 would overwrite the value to load. FNOP may be faster than WAIT and serve the same purpose.

不知道这是不是你想要的
出处:http://www.xiaohui.com/dev/mmx/mmx_p_26_6.htm
2010-1-11 13:41
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
好的,谢谢。
如果没理解错的话,0x027F屏蔽所有浮点异常后,做不做wait都没区别了。
2010-1-11 14:59
0
游客
登录 | 注册 方可回帖
返回
//