Вы хотите, чтобы код C / C ++ выполнял эти операции, или вы хотите знать, как это сделать на языке ассемблера x86?
В C / C ++ определить перенос легко:
int _C = (v < l); // "v < r" works too
Переполнение немного сложнее. Обычно переполнение помечается, когда два операнда имеют один и тот же знак, но результат имеет другой знак. На двух дополнительных архитектурах, таких как x86, это можно записать так:
int _V = ((l ^ r) >= 0) && ((l ^ v) < 0);
MSB (бит знака) l ^ r
будет равен 0 тогда и только тогда, когда знаки совпадают, и аналогичным образом l ^ v
будет иметь ненулевой бит знака (= значение меньше нуля), если и только если l
и v
имеют противоположные знаки.
Если вы хотите написать это в сборке, вы просто добавляете и используете jc
или jo
соответственно для перехода к обработчику переноса / переполнения. Однако вы не можете легко выбросить исключения C ++ из ассемблерного кода. Самый простой способ сделать это, вероятно, написать простую однострочную функцию в C ++, которая выдает исключение и вызывает его из вашего ассемблерного кода. Окончательный код asm будет выглядеть примерно так:
; Assuming eax=l, ebx=r
add eax, ebx
jc .have_carry
; Continue computation here...
.have_carry:
call throw_overflow_exception
со следующей определенной вспомогательной функцией C ++:
extern "C" void throw_overflow_exception()
{
throw 1; // or some other exception
}
Вам нужно extern C
, чтобы отключить искажение имени в C ++ для этой функции. Существуют и другие соглашения (например, некоторые компиляторы добавляют подчеркивание до или после имен функций C) - это зависит от используемого компилятора и архитектуры.