Флаг отрицательного условия N также установлен с переполнением?
Готовясь к экзамену по сборке / архитектуре процессора в школе на следующей неделе, я натолкнулся на что-то довольно запутанное.
При выполнении двоичного сложения мы узнали о 4 флагах условий:
N = результат отрицательный
Z = результат равен нулю
C = операция произвела перенос
V = операция произвела переполнение
Но я не совсем понимаю, нужно ли устанавливать N-флаг при переполнении.
Давайте рассмотрим это 4-битное дополнение в дополнении 2 к 6+7 в качестве примера:
0110
0111+
-----
1101 = result
Теперь при вычислении в 4-х битах с двумя числами дополнения это, очевидно, приводит к переполнению. Это должно привести к 13 (01101 в 5 битах), но приводит к -3, потому что это может быть отображено только в 4 битах. Итак, мой вопрос, установлен ли в этом случае и отрицательный флаг N? Потому что результатом является отрицательное число.
2 ответа
Я не могу ответить на этот вопрос наверняка, не зная точно, какой процессор вы используете, но обычно N устанавливается равным старшему (знаковому) биту результата, независимо от всех других флагов. Итак, в вашем примере будут установлены как N, так и V.
(N, Z и C - почти всегда простые функции битов, выходящих из ALU - C - вынос от сумматора, N - старший бит результата, а Z - просто НЕ (ИЛИ (все биты в регистре)). Это V, чье определение, скорее всего, будет варьироваться от процессора к процессору.)
В вашем случае с 4-битным примером рассмотрим следующие примеры:
- 0001 + 1110 == 1111 (десятичное число: 1 + (-2) == -1)
Отрицательный, но без переполнения.
- 1100 + 1001 == 0101 (десятичное число: (-4) + (-7) == 5; -11 будет без переполнения)
Не отрицательно, но переполнено.
Это показало бы, что отрицательный флаг не имеет прямого отношения к факту переполнения.
Но: вещь, которая обычно не объясняется: как только флаг переполнения означает, что знак неправильный, можно определить истинный знак результата как XOR отрицательного флага и флага переполнения:
S = N xor V
где S - флаг истинного знака (отсутствует непосредственно в схеме NZVC). Этот флаг фактически используется в операциях ветвления: когда, например, условие для BGT ((N xor V) or Z) == 0
это действительно означает S or Z == 0
или, другими словами, S == 0 and Z == 0
,
Некоторые архитектуры набора команд, например AVR
, иметь истинный флаг вместо отрицательного флага.