Затык с понятием «overflow»

Тема в разделе "WASM.BEGINNERS", создана пользователем aptyp, 13 май 2010.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    P.S. Так как BBCode не поддерживает таблицы, а редактирование отключено, поэтому извините за "корявый" вид таблицы
     
  2. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    Эээээээ товарищи прогеры. Что-то здесь не то.
    Переполнение флаг 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

    Или Вы меня не так поняли. Или опять я туплю?
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    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
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    aptyp
    Откуда вы это взяли? OF будет 0!
     
  5. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    l_inc
    Да не заметил в сонном состоянии :)

    Mikl___
    Нет, не изменяет. Например, Ваш пример для байтового сложения: 5 + 126 = 05h + 7Eh = 83h. В результате выполнения операции имеется перенос в старший разряд (из 6-го в 7-й), но отсутствует перенос из старшего разряда (из 7-го). Флаг CF равен нулю (он и содержит перенос из старшего разряда), флаг OF = перенос в старший XOR перенос из старшего = 1.
     
  6. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    aptyp
    Флаги CF и OF зависят от разрядности данных в том смысле, что они исходят из переносов в старший и из старшего разряда результата. Поэтому для байтовых операций они смотрят переносы в 7-й и из 7-го разряда, для словных -- в 15-й и из 15-го и т.д. Но логика формирования значений этих флажков остаётся одной и той же.
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    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
     
  8. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Mikl___
    Переполнение в реальных электронных схемах вычисляется именно как XOR между переносом в старший (знаковый) разряд результата и из него. Это проще всего, поскольку оба переноса в любом случае вычисляются.
     
  9. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    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
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    aptyp
    И в чем противоречие? О знаковом разряде пытались донести до тебя l_inc, Booster, 7mm, Mankubus, edemko, SII
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    aptyp
    Всё верно. Почему смущает, что зависит от разрядности?
     
  12. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    Итог получается такой, если старший разряд регистра при сложении двух однотипных чисел меняет знак, происходит переполнение, не важно был ли перенос из разрядной сетки, всё равно процессор это делает зачем-то, на всякий случай? Учитывая что я задавал вопрос о том зачем это происходит и какой смысл, вопрос исчерпан?
     
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    aptyp
    На WASM.IN есть статья Чугайнов Н.Г. - Перенос и переполнение - что они представляют собой на самом деле?
    Данная статья ни в коем случае не претендует на полноту описания, и представляет собой лишь краткое дополнение к тем солидным учебным пособиям и справочникам, которые должны быть под рукой у каждого программиста. Просто мне не удалось найти ни в одном из подобных изданий тех элементарных сведений, которые будут изложены ниже. Видимо, авторам этот вопрос кажется настолько тривиальным и очевидным, что они не заостряют на нем внимания, полагая, что двух - трех строк достаточно для полного понимания. Однако это далеко не так - вопрос выходит далеко за те рамки, в которые его пытаются загнать авторы
     
  14. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    aptyp
    Переполнение происходит не если старший разряд меняет знак, а если в нём получается неверный знак ;) Например, если складываются положительное и отрицательное число, то какой знак должен получиться? Понятное дело, это зависит от самих чисел.
     
  15. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    Mikl___, уже обратил внимание на это статью. :)
    А вот ещё это интересно, то есть, в данном случае можно считать что перенос из разрядной сетки БЫЛ, и это был ноль из старшего разряда который заняла единица?
     
  16. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Проглядываем #20, смотрим столбец -/+dec, символ "_" и вправду соответствует переполнениям столбца bin, говорим автору #20 спасибо :)&
    Кому трудно с xor, просто суммируйте n бит, забирая последний от результата.
    Код (Text):
    1.                                   +dec              -/+dec
    2. bin_ocs__ocs__ocs__ocs_           --------------    --------------
    3.       00   00   00   00           +0  +0  +0  +0    +0  +0  +0  +0
    4. +     00   01   10   11           +0  +1  +2  +3    +0  +1  -2  -1
    5. =   -000 -001 -010 -011           +0  +1  +2  +3    +0  +1  -2  -1
    6.  
    7.       01   01   01   01           +1  +1  +1  +1    +1  +1  +1  +1
    8. +     00   01   10   11           +0  +1  +2  +3    +0  +1  -2  -1
    9. =   -001 +010 -011 -100           +1  +2  +3 _+0    +1 _-2  -1  +0
    10.  
    11.       10   10   10   10           +2  +2  +2  +2    -2  -2  -2  -2
    12. +     00   01   10   11           +0  +1  +2  +3    +0  +1  -2  -1
    13. =   -010 -011 +100 +101           +2  +3 _+0 _+1    -2  -1 _+0 _+1
    14.  
    15.       11   11   11   11           +3  +3  +3  +3    -1  -1  -1  -1
    16. +     00   01   10   11           +0  +1  +2  +3    +0  +1  -2  -1
    17. =   -011 -100 +101 -110           +3 _+0 _+1 _+2    -1  +0 _+1  -2
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    aptyp
    OF это знаковое переполнение. Переносом из разрядной сетки, как ты выразился, занимается СF. Что-то ещё не ясно?
     
  18. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    Не не не, туплю, не было переноса, так можно тупить долго.
     
  19. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    ..те. нулевой
     
  20. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    Вы пример то смотрите

    0100000000000000b
    +0100000000000000b
    =1000000000000000b OF=1

    В данном случае переполнение есть, а числа складываются без знаковые 32 битные. Без знакового переноса CF естественно нет. Почему же на это реагирует OF флаг?