P.S. Так как BBCode не поддерживает таблицы, а редактирование отключено, поэтому извините за "корявый" вид таблицы
Эээээээ товарищи прогеры. Что-то здесь не то. Переполнение флаг OF имеет отношение только к старшему разряду и только 8,16,32 битных чисел в процессоре, то есть от разрядности числа это ЗАВИСИТ. например складываем в процессоре такого типа числа до двух разрядов менее 8,16,32 бит, что бы при сложении старший разряд числа не занимал старший разряд регистра. 01b +01b =10b OF=0 ... 010000 +010000 =100000 OF=1 и т.д. а если складывать именно 8,16,32 битные то 00100000b +00100000b =01000000b OF=1 0010000000000000b +0010000000000000b =0100000000000000b OF=1 00100000000000000000000000000000b +00100000000000000000000000000000b =01000000000000000000000000000000b OF=1 Или Вы меня не так поняли. Или опять я туплю?
aptyp Самый лучший советчик это отладчик 00000001b +00000001b 00000010b S1 xor S2 xor SR xor CF = 0 xor 0 xor 0 xor 0 = 0 OF=0 01000000b +01000000b 100000000b S1 xor S2 xor SR xor CF = 0 xor 0 xor 1 xor 0 = 0 OF=1 10000000b +10000000b (1)00000000b S1 xor S2 xor SR xor CF = 1 xor 1 xor 0 xor 1 = 1 OF=1
l_inc Да не заметил в сонном состоянии Mikl___ Нет, не изменяет. Например, Ваш пример для байтового сложения: 5 + 126 = 05h + 7Eh = 83h. В результате выполнения операции имеется перенос в старший разряд (из 6-го в 7-й), но отсутствует перенос из старшего разряда (из 7-го). Флаг CF равен нулю (он и содержит перенос из старшего разряда), флаг OF = перенос в старший XOR перенос из старшего = 1.
aptyp Флаги CF и OF зависят от разрядности данных в том смысле, что они исходят из переносов в старший и из старшего разряда результата. Поэтому для байтовых операций они смотрят переносы в 7-й и из 7-го разряда, для словных -- в 15-й и из 15-го и т.д. Но логика формирования значений этих флажков остаётся одной и той же.
SII 5+7Eh=83h знак у 5 S1=0 знак у 7Eh S2=0 знак результата 83h SR=1 переноса нет CF=0 S1 xor S2 xor SR xor CF = 0 xor 0 xor 1 xor 0 = OF = 1 может быть и верно, но если учитывать знаки операндов, знак результата и флаг переноса, то IMHO вычислить OF прощье попробуйте с примерами: 3Fh+1 0FDh+5 40h+0C0h 0E0h+60h 60h+0E0h 0E0h+0E0h 0C0h+0C0h 0FFh+1 0FFh+81h 0FFh+0C1h 0FFh+41h 40h+40h 60h+60h 7Fh+1 80h+80h 0E0h–20h 3Fh–0FFh 83h–9Ah 80h–81h 80h–0C0h 8Ah–0A5h 80h–40h 80h–1 40h–0C0h 60h–0A0h 7Fh–0FFh 73h–0BFh
Mikl___ Переполнение в реальных электронных схемах вычисляется именно как XOR между переносом в старший (знаковый) разряд результата и из него. Это проще всего, поскольку оба переноса в любом случае вычисляются.
Booster Ой. да точно, скопипастил, не отредактировал. Вот пример того что OF зависит от разряда 01b +01b =10b OF=0 00100000 +00100000 =01000000 OF=0 0010000000000000 +0010000000000000 =0100000000000000 OF=0 и т.д. а если складывать именно 8,16,32 битные то 01000000b +01000000b =10000000b OF=1 0100000000000000b +0100000000000000b =1000000000000000b OF=1 01000000000000000000000000000000b +01000000000000000000000000000000b =10000000000000000000000000000000b OF=1
aptyp И в чем противоречие? О знаковом разряде пытались донести до тебя l_inc, Booster, 7mm, Mankubus, edemko, SII
Итог получается такой, если старший разряд регистра при сложении двух однотипных чисел меняет знак, происходит переполнение, не важно был ли перенос из разрядной сетки, всё равно процессор это делает зачем-то, на всякий случай? Учитывая что я задавал вопрос о том зачем это происходит и какой смысл, вопрос исчерпан?
aptyp На WASM.IN есть статья Чугайнов Н.Г. - Перенос и переполнение - что они представляют собой на самом деле? Данная статья ни в коем случае не претендует на полноту описания, и представляет собой лишь краткое дополнение к тем солидным учебным пособиям и справочникам, которые должны быть под рукой у каждого программиста. Просто мне не удалось найти ни в одном из подобных изданий тех элементарных сведений, которые будут изложены ниже. Видимо, авторам этот вопрос кажется настолько тривиальным и очевидным, что они не заостряют на нем внимания, полагая, что двух - трех строк достаточно для полного понимания. Однако это далеко не так - вопрос выходит далеко за те рамки, в которые его пытаются загнать авторы
aptyp Переполнение происходит не если старший разряд меняет знак, а если в нём получается неверный знак Например, если складываются положительное и отрицательное число, то какой знак должен получиться? Понятное дело, это зависит от самих чисел.
Mikl___, уже обратил внимание на это статью. А вот ещё это интересно, то есть, в данном случае можно считать что перенос из разрядной сетки БЫЛ, и это был ноль из старшего разряда который заняла единица?
Проглядываем #20, смотрим столбец -/+dec, символ "_" и вправду соответствует переполнениям столбца bin, говорим автору #20 спасибо & Кому трудно с xor, просто суммируйте n бит, забирая последний от результата. Код (Text): +dec -/+dec bin_ocs__ocs__ocs__ocs_ -------------- -------------- 00 00 00 00 +0 +0 +0 +0 +0 +0 +0 +0 + 00 01 10 11 +0 +1 +2 +3 +0 +1 -2 -1 = -000 -001 -010 -011 +0 +1 +2 +3 +0 +1 -2 -1 01 01 01 01 +1 +1 +1 +1 +1 +1 +1 +1 + 00 01 10 11 +0 +1 +2 +3 +0 +1 -2 -1 = -001 +010 -011 -100 +1 +2 +3 _+0 +1 _-2 -1 +0 10 10 10 10 +2 +2 +2 +2 -2 -2 -2 -2 + 00 01 10 11 +0 +1 +2 +3 +0 +1 -2 -1 = -010 -011 +100 +101 +2 +3 _+0 _+1 -2 -1 _+0 _+1 11 11 11 11 +3 +3 +3 +3 -1 -1 -1 -1 + 00 01 10 11 +0 +1 +2 +3 +0 +1 -2 -1 = -011 -100 +101 -110 +3 _+0 _+1 _+2 -1 +0 _+1 -2
aptyp OF это знаковое переполнение. Переносом из разрядной сетки, как ты выразился, занимается СF. Что-то ещё не ясно?
Вы пример то смотрите 0100000000000000b +0100000000000000b =1000000000000000b OF=1 В данном случае переполнение есть, а числа складываются без знаковые 32 битные. Без знакового переноса CF естественно нет. Почему же на это реагирует OF флаг?