Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222

Инкремент, не работает флаг переполнения

12.07.2017, 12:12. Показов 2820. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Буду краток. Есть код:
Assembler
1
2
3
mov eax, 0ffffffffh
inc eax
jo exit
В отладчике наблюдаю что флаг OF не выставляется. Хотя в документации написано:
The CF flag is not affected. The OF, SF, ZF, AF , and PF flags are set according to the result.
Т.е. флаг OF должен выставляться. Объясните что я делаю не так.
Заранее благодарен.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.07.2017, 12:12
Ответы с готовыми решениями:

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

Флаг переполнения
Доброго времени суток! Подскажите, как проверить какую-либо определенную переменную типа double на переполнение (значениe -1.#IND00,...

39+ (-39) будет ли установлен флаг переполнения?
Если выполнить в ячейке 1 байт двоичное сложение чисел 39 и -39 то это приведет к появлению единицы в 9-м разряде за пределом байта, а в...

7
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
12.07.2017, 23:00
Не до конца уверен.

Почему-то подозреваю, что тут работает интересный механизм.

При возникновении переполнения вызывается обработчик прерывания переполнения. В ходе выполнения обработчика этот флаг сбрасывается и управление возвращается в точку вызова - на следующую после inc команду.

Проверить эту версию можно написав собственный обработчик прерывания переполнения.
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
13.07.2017, 04:29
Лучший ответ Сообщение было отмечено Demy85 как решение

Решение

FFFFFFFF + 1 = 0 переполнения нет. Ибо это просто -1 + 1 = 0 и это правильно.
А вот перенос происходит, да только инструкции INC и DEC такие дурные, что перенос не фиксируют. Тут некоторая кривизна Интеловской системы команд.

А вот если ты сделаешь
7FFFFFFF + 1 = 80000000 вот тут переполнение и выставится. А переноса не будет, даже если ты будешь складывать с помощью ADD

Или тебе объяснять что такое перенос и что такое переполнение и какой у них смысл ?

Добавлено через 2 минуты
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
При возникновении переполнения вызывается обработчик прерывания переполнения.
Никогда не вызывается. Нет такого прерывания.
Есть прерывания при делении DIV IDIV , если на ноль или результат не влезает в регистр для частного, но это совсем другой случай.
2
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222
13.07.2017, 08:50  [ТС]
Цитата Сообщение от Ethereal Посмотреть сообщение
FFFFFFFF + 1 = 0 переполнения нет. Ибо это просто -1 + 1 = 0 и это правильно.
Об этом я и не подумал..... почему-то предполагал что inc работает с беззнаковыми числами.
Спасибо за ответ.
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
13.07.2017, 19:20
Цитата Сообщение от Ethereal Посмотреть сообщение
Никогда не вызывается. Нет такого прерывания.
into проверяет флаг(OF), и если он взведён - дёргает INT-4:
Assembler
1
2
3
   mov  ax,7FFFh 
   inc  ax 
   into            ; вместо jo
2
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
13.07.2017, 20:06
Да, я тоже о into вспомнил, но забыл о его правильном применении.

Спасибо, Ethereal, R71MT!
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
14.07.2017, 09:16
Цитата Сообщение от Ethereal Посмотреть сообщение
Тут некоторая кривизна Интеловской системы команд.
Это не кривизна, это фича. Специально сделано, чтобы сохранить флаг при необходимости увеличить/уменьшить значение.
This instruction allows a loop counter to be updated without disturbing the CF flag.
К примеру, можно сделать цикл наподобие loopz/loopnz:
Assembler
1
2
3
4
5
6
7
  mov edx,100
@@rep:
  . . .
  clc/stc/cmc/cmp...
  . . .
  dec edx
  ja @@rep  ; повторяем, пока EDX > 0 и CF=0
Цитата Сообщение от Demy85 Посмотреть сообщение
почему-то предполагал что inc работает с беззнаковыми числами.
inc/dec работают с любыми числами. Знак имеет значение при умножении-делении (mul/imul, div/idiv), сдвиге (shr/sar) и прыжках (gl/gle/jg/jge) после сравнения. Ну есть ещё всякие там into, adox...
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
15.07.2017, 04:02
Цитата Сообщение от R71MT Посмотреть сообщение
into проверяет флаг(OF), и если он взведён - дёргает INT-4:
Речь шла об аппаратных прерываниях.

Добавлено через 14 минут
Цитата Сообщение от Jin X Посмотреть сообщение
Это не кривизна, это фича. Специально сделано, чтобы сохранить флаг при необходимости увеличить/уменьшить значение.
Специально сделано было не для этого, а для возможности преобразования кода от 8080 к 8088/8086. Был такой заскок при проектировании 8088/8086 на халяву ПО от микро-ЭВМ с 8080 и CP-M разжиться. А вот уже на 8080 сделано было для реализации при необходимости арифметики чисел произвольной разрядности. Чтобы складывать их, к примеру так (запишу в понятиях 80x86)
clc
METKA:
mov al,[si]
adc [di],al
inc si
inc di
loop METKA
от чего все команды в этом цикле кроме ADC не должны флага переноса менять.

А вот если сделать архитектуру двухадресной и с адресацией с автоинкрементом, то тогда
clc
METKA:
adc (r0)+,(r1)+
sob r2, METKA
(здесь SOB - Subtract One and Branch , т.е. аналог LOOP) и никаких исключений из общего правила делать не нужно. Можно сделать, чтобы все команды выставляли флаги по результату (кроме команд условных переходов конечно) и даже MOV флаги знака и нуля тоже. Отсюда вывод - причина появления упомянутой тобой фичи состоит именно в кривизне системы команд, причем еще в кривизне 8080, что крива как ятаган.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.07.2017, 04:02
Помогаю со студенческими работами здесь

Не работает инкремент
repeat: if(e<=mode){ cout << "\nИгрок №" << e << a << endl; cin >> sim >> b;//записываем в строку для...

Как работает инкремент
i = 5; System.out.println(++i + ++i); Почему следующий код выдает на консоль число 13

Странно работает инкремент переменной
Делаю скрипт-викторину, фронтэнд представляет из себя таблицу в 4 столбца, первый-название, следующие 3 - формы. При нажатии кнопки скрипт...

Простой эксплоит переполнения буфера не работает(
Здравствуйте, есть простая программа использующая уязвимость переполнения буфера, по сути должна просто закрываться при выполнении и не...

Почему не работает инкремент в многопоточном коде?
Имеем такой код, который вызывает два потока, в асинхронном режиме, которые изменяют одну переменную, которая передаётся по ссылке. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru