如何在 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;

【讨论】:

谢谢 - 这解决了它并保持功能基本相同! - 我认为只包含 并使用 readeflags 就足够了 - 我会将 0x800 更改为 ( 1 很好的链接供将来参考:msdn.microsoft.com/en-us/library/aa983406%28VS.80%29.aspx, en.wikipedia.org/wiki/FLAGS_register_%28computing%29【参考方案2】:

我假设上面的代码试图捕捉某种整数上溢/下溢?也许这个问题的答案会有所帮助:How to detect integer overflow?

【讨论】:

【参考方案3】:

Here's a list 所有平台上可用的内在函数。那里好像没有什么合适的。我想最便携的方法是在减法之前检查它是否会导致溢出。

【讨论】:

【参考方案4】:

我不确定为什么 Microsoft 不允许在 64 位中进行内联汇编。但是您仍然可以在单独的 .asm 文件中编写程序集,并将您的程序链接到它。

【讨论】:

以上是关于如何在 VS2008 64 位版本中将 __asm jno no_oflow 替换为内部结构?的主要内容,如果未能解决你的问题,请参考以下文章

VS的 X64下的汇编编译

如何在 C 中使用 asm 添加两个 64 位数字时访问进位标志

64 位 iOS 设备上的 asm("trap")

Visual Studio 2008 内联汇编 关键字__asm出错

我应该在 64 位版本中同时定义 _WIN32 和 _WIN64 吗?

32位机上用vs2008开发的c++程序如何能在64位系统下运行?