Почему в этом примере не установлен флаг переполнения?

mov     al, -1
add     al, 130

Пытаюсь ответить на вопрос из учебника для своего класса x86-assembly. В одном из примеров предлагается объяснить, почему флаг over поможет вам определить, попадает ли в этом случае окончательное значение al в допустимый диапазон со знаком.

Мои первоначальные мысли заключались в том, что следует вызвать флаг переполнения, поскольку -1 + 130 = 129, что выходит за пределы диапазона 8-битного целого числа со знаком, где al - 8 младших битов регистра EAX. Но когда я запускаю этот код в Visual Studio, я не вижу, чтобы флаг Overflow когда-либо устанавливался.

1 ответ

Решение

130 не может быть представлен в 8 битах со знаком, так как 127 - максимальное 8-битное число со знаком.  130 в шестнадцатеричном байте 82h и взятый как знаковый байт, который также -126.

Ассемблер не жалуется, поэтому я полагаю, что он предполагает, что ваше намерение беззнаковое, что может представлять 130 в 8 бит.

Флаг переполнения сообщает нам о выходе за пределы подписанной арифметики, и вы добавляете -1 к -126, который не переполняется.

Флаг переноса - это индикатор выхода за пределы для беззнаковой арифметики (и я ожидал, что он будет установлен как 130+255 за пределы).


Из-за использования арифметики с дополнением до 2 битовый шаблон ответа одинаков для сложения со знаком и без знака, поэтому наборы инструкций обычно имеют только одну операцию добавления, но проверка выхода за пределы отличается для арифметики со знаком и арифметики без знака.


Хорошего стандарта для смешивания беззнаковой и знаковой арифметики в одном и том же количестве битов не существует, поэтому обычно мы расширяем оба операнда до большего числа битов, подписанных для точного размещения обоих операндов, и используем эту форму для арифметики.

Другие вопросы по тегам