Почему в этом примере не установлен флаг переполнения?
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 битовый шаблон ответа одинаков для сложения со знаком и без знака, поэтому наборы инструкций обычно имеют только одну операцию добавления, но проверка выхода за пределы отличается для арифметики со знаком и арифметики без знака.
Хорошего стандарта для смешивания беззнаковой и знаковой арифметики в одном и том же количестве битов не существует, поэтому обычно мы расширяем оба операнда до большего числа битов, подписанных для точного размещения обоих операндов, и используем эту форму для арифметики.