Подтвердить что ты не робот

Об ассемблере CF (Carry) и OF (Overflow)

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

4b9b3361

Ответ 1

Различие заключается в том, какие инструкции используются для управления данными, а не сами данные. Современные компьютеры (начиная с 1970 года) используют представление целочисленных данных, называемых двумя's-дополнениями, в которых сложение и вычитание работают точно так же как на подписанных, так и на неподписанных числах.

  • Разница в представлении - это интерпретация самого значимого бита (также называемого битом знака). Для беззнаковых чисел этот бит означает очень большое положительное число; для подписанных чисел, что означает очень большое отрицательное число (отрицательное число с большим абсолютным значением).

  • В разных инструкциях могут использоваться разные интерпретации одного и того же бита. Например, большинство больших машин имеют как подписанные, так и неподписанные команды умножения. Машины с инструкцией "set less than" могут иметь как подписанные, так и неподписанные вкусы.

  • Флаг OF (флаг переполнения) сообщает, переносит ли перенос знак самого значимого бита в результате, чтобы он отличался от наиболее значимых бит аргументов. Если числа интерпретируются как unsigned, флаг переполнения не имеет значения, но если они интерпретируются как подписанные, то OF означает, например, два больших положительных числа, и результат был отрицательным.

  • CF (флаг переноса) сообщает, был ли бит полностью выполнен из слова (например, в бит 33 или бит 65). Если числа интерпретируются как unsigned, флаг переноса означает, что добавление переполнено, а результат слишком велик, чтобы вставляться в машинное слово. Флаг переполнения не имеет значения.

Ответ на ваш вопрос заключается в том, что ассемблерный код имеет несколько способов отличить подписанные от неподписанных данных:

  • Он может выбрать CF или OF для сопоставления со знаком или без знака.
  • Он может выбирать либо подписанные, либо беззнаковые команды умножения и деления.
  • Он может выбрать подписанный или неподписанный сдвиг вправо (подписанный копирует высокий бит, беззнаковые сдвиги в нулях).

Ответ 2

Не пытайтесь перекодировать знак. Это невозможно. Вместо этого, только пытайтесь понять правду: нет знака. Тогда вы увидите, что это не знак-тип, который отличается, это только вы.

Ответ 3

Существуют разные коды операций для обработки подписанных и неподписанных данных. Если программа хочет сравнить два значащих целых числа, она использует коды операций jl, jle, jg и jge, где l и g стоят меньше и больше соответственно. Если программа хочет сравнить два целых числа без знака, она использует коды операций jb, jbe, ja и jae, где a и b обозначают соответственно выше и ниже. Во всех случаях e означает "или равно". Эти коды операций используются для ветвления на основе сравнения.

Аналогично, существуют также команды setCC, которые устанавливают байт в 0 или 1 в зависимости от сравнения. Эти функции тождественно - есть setl, setle, setg, setge, setb, setbe, seta, setae и другие.

Подписанные коды операций проверяют флаги ZF, OF и SF. Неподписанные коды операций проверяют флаги ZF, CF и SF. См. Разделы Справочного руководства по программированию 80386 в инструкциях JCC и setCC для точных проверенных условий.

Ответ 4

Это не так. Флаги просто устанавливаются всякий раз, когда возникает условие. Программист должен знать, с какими типами он работает, и от того, кто знает, какой флаг проверять, если он заботится.

Ответ 5

Невозможно попросить CPU протестировать и вернуть тип байта/слова/долго.

0xFF может содержать "255" или "-1", все зависит от того, какой тип байта говорит ваша программа.

Конструкции, такие как "type", "signess" и т.д., существуют только на языках более высокого уровня, таких как Java, а не на уровне CPU. В конце концов, все это байт для процессора, который зависит от наших программ, чтобы организовать и знать, как интрепретировать и управлять этими значениями...

Флаги CPU, найденные в статусе, не применяют какую-либо парадигму, которая зависит от вашего кода, чтобы проверить и соответствующим образом реагировать.

В процессорах Intel регистры MMX и FPU фактически занимают одни и те же регистры. Таким образом, невозможно одновременно смешивать инструкции типа FPU и MMX, так как значения одной операции будут уничтожать другую. Программы, которые либо обычно выполняют свои действия в одном режиме, например, выдавая инструкции FPU, а затем могут запускать MMX, но никогда оба одновременно.

Ответ 6

Обычно программы сборки не содержат специальной информации вокруг переменных, чтобы указать, подписаны они или нет. Это задание программиста знать, когда проверять, какие флаги и когда использовать какие условности (т.е. Использовать JA вместо JG).

Итак, вам нужно знать, с какой переменной вы собираетесь работать, чтобы вы знали, какие команды использовать. Вот почему большинство языков программирования дают предупреждения, когда программисты используют взаимозаменяемые типы подписей/без знака (т.е. Без явного приведения в действие), поскольку это может быть сделано в аппаратном обеспечении, но может дать неожиданные результаты.

Ответ 7

Я полагаю, что это основано на используемой вами операции, которая определяет, какой флаг использовать. Например. подписанный vs без знака. Поэтому я полагаю, что вы можете играть с памятью любой командой.