2009-12-10 3 views
2

У меня есть этот код:Как заменить __asm ​​jno no_oflow на intristic в VS2008 64-битной сборке?

__asm jno no_oflow 
overflow = 1; 
__asm no_oflow: 

Он производит это милое предупреждение:

ошибка C4235: нестандартное расширение используется: '__asm' ключевого слова не поддерживается на этой архитектуре

Что бы быть эквивалентной/приемлемой заменой для этого кода, чтобы проверить переполнение операции вычитания, которая произошла до него?

+0

Через некоторое время нас укусили в этой области в любом случае - оказывается, что это не так хорошо проверять на переполнение этого пути в любом случае - самое приятное описание и решения, которые я нашел здесь: https: //www.securecoding. cert.org/confluence/display/seccode/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow?showComments=false – RnR

ответ

2

Сначала определите следующее:

#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; 
} 
+0

Спасибо - это решает его и оставляет функциональность в основном одинаковые! - Я думаю, что достаточно просто включить и использовать readeflags - также я изменю 0x800 на (1 << 11), чтобы сделать его более читаемым – RnR

+0

Полезные ссылки для справки в будущем: http://msdn.microsoft.com/ en-us/library/aa983406% 28VS.80% 29.aspx, http://en.wikipedia.org/wiki/FLAGS_register_%28computing%29 – RnR

0

Here's a list встроенных функций, доступных на всех платформах. Кажется, там нет ничего подходящего. Я думаю, самым переносимым способом было бы проверить до вычитания, приведет ли это к переполнению.

1

Я предполагаю, что вышеприведенный код пытается поймать какое-то целое переполнение/недополнение? Может быть, ответы на этот вопрос поможет: How to detect integer overflow?

0

Я не знаю, почему Microsoft запрещенная встроенная сборка в 64-разрядной версии. но вы все равно можете написать сборку в отдельном файле .asm и связать свою программу с ней.

 Смежные вопросы

  • Нет связанных вопросов^_^