почему нам нужен флаг для обозначения нулевого результата? - PullRequest
0 голосов
/ 20 марта 2019

в таких инструкциях, как shift, add, increment , мы всегда проверяем результат, и если результат равен нулю, мы указываем это во флаге.в каких случаях мы используем этот нулевой флаг?какая польза от этого нулевого флага?

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Мы используем эти флаги для двух основных целей:

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

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

Процессоры MIPS не имеют таких флагов для целочисленных и побитовых операций.Имеют условные ветви, которые могут переходить в таких условиях, как:

  • регистрация равенства / неравенства
  • регистрация равенства нулю / ненулевой
  • регистрация меньше / больше нуля
  • регистр, который больше / меньше или равен нулю

Если требуется другой тип сравнения, который не поддерживается этими ветвями, для этого есть специальные инструкции.Они устанавливают результат в 0 или 1, и затем условная ветвь может использовать его в качестве входных данных.

Перенос и переполнение немного сложны для процессоров MIPS.Их нужно получить с помощью нескольких инструкций.

1 голос
/ 20 марта 2019

Обычно флаги ЦП используются для выполнения условных операций.

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

На процессорах ARM вы можете выполнить любую инструкцию, основанную на нулевом флаге: например, инструкция ldmeqda будет делать то же самое, что и инструкция ldmda, если нольфлаг установлен;он ничего не сделает, когда флаг нуля будет снят.

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

(Инструкция cmp выполняет вычитание и отбрасывает результат! Это означает, что эта инструкция устанавливает флаги только на основе результата вычитания. Это полезно, когда C o MP с двумя числамиВот почему инструкция называется cmp.)

На большинстве других процессоров, которые имеют флаги (не у всех процессоров они есть), вы можете выполнять только переходы (ветки), основываясь на состояниях флагов.

Что вы делаете, вы перепрыгиваете через инструкции, которые не должны выполняться, если флаг имеет неправильное состояние.

Пример (x86):

someloop:
    mov eax, [esi]
    add esi, 20
    add eax, 1234
    # The zero flag will be set if the result is 0
    # The next instruction will jump if the zero flag is set
    jz skipif
    # We only get here if the zero flag is clear
    # This corresponds to "if(eax!=0)" in C
    mov [esi-10],bl
skipif:
    dec edx
    # The zero flag is set if edx is not 0
    # Jump back to "someloop" if this is the case
    # This corresponds to a "do { ... } while((--edx)!=0);"
    # loop in C
    jnz someloop
...