如何在 VS2008 64 位版本中将 __asm jno no_oflow 替换为内部结构?
Posted
技术标签:
【中文标题】如何在 VS2008 64 位版本中将 __asm jno no_oflow 替换为内部结构?【英文标题】:How do I replace __asm jno no_oflow with an intristic in a VS2008 64bit build? 【发布时间】:2009-12-10 09:25:34 【问题描述】:我有这个代码:
__asm jno no_oflow
overflow = 1;
__asm no_oflow:
它会产生这个很好的警告:
错误 C4235:使用了非标准扩展:此架构不支持“__asm”关键字
什么是等效/可接受的替代代码来检查之前发生的减法运算的溢出?
【问题讨论】:
一段时间后,无论哪种方式,我们都在这个区域被咬了 - 事实证明,无论哪种方式检查溢出都不太好 - 我找到的最好的描述和解决方案在这里:securecoding.cert.org/confluence/display/seccode/… 【参考方案1】:首先定义以下内容:
#ifdef _M_IX86
typedef unsigned int READETYPE;
#else
typedef unsigned __int64 READETYPE;
#endif
extern "C"
READETYPE __readeflags();
#pragma intrinsic(__readeflags)
然后您可以按如下方式检查 eflags 寄存器:
if ( (__readeflags() & 0x800))
overflow = 1;
【讨论】:
谢谢 - 这解决了它并保持功能基本相同! - 我认为只包含我假设上面的代码试图捕捉某种整数上溢/下溢?也许这个问题的答案会有所帮助:How to detect integer overflow?
【讨论】:
【参考方案3】:Here's a list 所有平台上可用的内在函数。那里好像没有什么合适的。我想最便携的方法是在减法之前检查它是否会导致溢出。
【讨论】:
【参考方案4】:我不确定为什么 Microsoft 不允许在 64 位中进行内联汇编。但是您仍然可以在单独的 .asm 文件中编写程序集,并将您的程序链接到它。
【讨论】:
以上是关于如何在 VS2008 64 位版本中将 __asm jno no_oflow 替换为内部结构?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C 中使用 asm 添加两个 64 位数字时访问进位标志
Visual Studio 2008 内联汇编 关键字__asm出错