Почему эти инструкции, которые должны работать с целыми числами без знака, все еще влияют на флаги, используемые при работе со знаковыми числами? - PullRequest
1 голос
/ 13 февраля 2011

Документально подтверждено, что инструкции "INC", "DEC" и "MUL" должны использоваться для целых чисел без знака, но две первые инструкции влияют на флаги переполнения и знака, а "MUL" влияет на флаг переполнения, которые являются флагами, используемыми при работе со знаковыми числами и это не имеет смысла с этой документацией, так почему?

Ответы [ 3 ]

4 голосов
/ 13 февраля 2011

Я не уверен, откуда вы взяли, что inc и dec должны быть ограничены целыми числами без знака. Пожалуйста, укажите мне соответствующую документацию.

Как правило, , процессор 8086 не имел различных инструкций для операций со знаком / без знака. Процессор обладал встроенными знаниями о том, как будет выглядеть результат операции в «подписанном» мире, но это довольно далеко. И это относится к последним итерациям архитектуры процессора x86.

Было бы бессмысленно иметь инструкцию inc, которая работала бы только со значениями без знака, так как тогда было бы очень дорого увеличивать значение со знаком (вам пришлось бы использовать инструкцию add или adc добавить 1), или было бы очень дорого проверять переполнение после выполнения inc (или dec).

2 голосов
/ 13 февраля 2011

Предполагая, что мы говорим здесь о x86, на странице Википедии с флагом переполнения говорится, что она устанавливается всеми арифметическими операциями. Какая документация, на которую вы ссылаетесь, предполагает иное?

0 голосов
/ 15 февраля 2011

Вот как это работает:

Рассмотрим два байтовых значения 0x65 и 0x31. Оба они являются значениями без знака, независимо от того, смотрите ли вы на них с точки зрения знака или без знака.

Затем вы добавляете их:

0x65 + 0x31 становится 0x96, что хорошо с точки зрения без знака (сумма помещается в байт, поэтому флаг переноса не был установлен). Однако из представления со знаком добавление двух положительных чисел привело к отрицательному числу, следовательно, были установлены флаги переполнения и знака. Фактически, для всех чисел со знаком установлен флаг переполнения, если старший бит изменяется в результате операции, в противном случае он очищается.

Вы можете видеть это так, как будто процессор выполняет две операции для каждой инструкции, устанавливая соответствующие флаги как для неподписанного, так и для подписанного добавления. После этого компилятор (или программист сборки) должен решить, является ли условная ветвь без знака (используя флаги ноль и перенос) или условной веткой со знаком (используя флаги ноль, знак и переполнение).

Так какой смысл?

Дело в том, что если бы это не было сделано таким образом, процессору потребовался бы один набор инструкций для подписанных операций (которые влияют только на флаги обнуления, знака и переполнения) и другой для операций без знака (влияющих на ноль и перенос) .

...