Lipetsk *nix Association Forum Lipetsk *nix Association Forum
Новости:
 
*
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
27 Ноября 2024, 10:26:30


Войти


Страниц: [1]   Вниз
  Печать  
Автор Тема: си+ассемблер: проверка флага переполнения  (Прочитано 7885 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Леголегс
Гуру
******

Карма: 18
Сообщений: 1006


Fedora 12 x86_64


Награды
« : 10 Марта 2009, 19:22:59 »

Продублирую тут темку на лоре http://www.linux.org.ru/view-message.jsp?msgid=3551085

Задача: с минимальным оверхедом убедится в отсутствии переполнения целых при арифметических операциях.

Пока я решил так:
Код:
#define CHECK_OVERFLOW(flag) asm (\
        "jno nooverflow;"\
        "mov $0x1,%0;"\
        "nooverflow :"\
        : "=r" (flag) : "0" (flag) )
/******************************************      0      */
template <class RetVal, typename T>
RetVal average_0(const std::vector<T> & data)
{
  bool overflow = false;
  unsigned  int m = 0;
  for (unsigned i = 0;i < data.size();i++)
  {
    m += data[i];
    CHECK_OVERFLOW(overflow);
  }
  if (overflow)
     // throw (Exception(__FILE__,__LINE__,__PRETTY_FUNCTION__, "integer overflow"));
     std::cout << Exception(__FILE__,__LINE__,__PRETTY_FUNCTION__, "integer overflow") << std::endl;
  return (RetVal)m / data.size();
}
Кто знает/помнит ассемблер лучше меня, посоветуйте как улучшить макрос. Из недостатков, в частности, его нельзя использовать более одного раза - говорит что метка переопределяется.
Записан

[ Мой FTP ftp://legolegs.homelinux.net ]
[ Репозиторий Fedora http://fedora.leschat.net/ ]
[ Репозиторий Ubuntu http://ubuntu.leschat.net/ ]
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2011, Simple Machines

Valid XHTML 1.0! Valid CSS! Dilber MC Theme by HarzeM