Флаг переполнения указывает, когда знак числа изменился неправильно. Таким образом, если вы добавите два положительных числа и получите отрицательный результат, произойдет переполнение. Существует также переполнение, если вы добавите два отрицательных числа и получите положительный результат.
Вы не можете получить переполнение при добавлении двух чисел с разными знаками, потому что диапазон не позволяет этого. Наименьший положительный плюс наибольший отрицательный равен 0 + (-128), что вполне подходит — 0 плюс все, что умещается в 8 бит, очевидно, уместится в 8 бит. Наименьшее отрицательное плюс наибольшее положительное равно -1 + 127 = 126. Что подходит.
(EDIT: и даже с переносом, 0 + -128 + 1 = -127, что подходит, и -1 + 127 + 1 = 127, что подходит)
Таким образом, переполнение устанавливается, если два входа с одинаковым знаком дают результат с другим знаком. Иначе понятно.
Вы можете выразить это как простую побитовую операцию над битами знака. Предположим, у вас есть a + b = c.
a ^ b
будет иметь 1 в бите знака, если знаки были разными. Вы хотите знать обратное этому. Так:
~(a ^ b)
дает 1 в бите знака, если знаки были одинаковыми. Это первая часть теста. Предположим, что a и b имеют один и тот же знак, вы можете проверить c против любого из них. На этот раз вы хотите проверить разницу, так что просто:
a ^ c
Вам нужно, чтобы проверенный бит был установлен в обеих частях теста, поэтому вы можете объединить их с двоичным файлом и (оставив много скобок для ссылки на словесное рассуждение):
(~(a ^ b))&(a ^ c)
Вам нужен только бит знака, поэтому замаскируйте его:
(~(a ^ b))&(a ^ c)&0x80
Это будет оцениваться как 0x00
, если флаг переполнения должен быть очищен, и 0x80
, если он должен быть установлен. Так что просто переместите это на место.
(кстати: хотя на 6502 множество инструкций устанавливает флаги и только одна выставляет регистр состояния, поэтому эмуляторы часто хранят флаги отдельно в любой удобной форме и составляют регистр состояния по требованию, и в этом случае вы не будете заморачиваться сдвигом и составлением , вы бы просто сохранили этот результат)
person
Tommy
schedule
31.05.2013